diff options
| author | Sean Christopherson <seanjc@google.com> | 2025-11-21 14:34:41 -0800 |
|---|---|---|
| committer | Sean Christopherson <seanjc@google.com> | 2026-01-08 11:58:22 -0800 |
| commit | 70b02809ded96ec790721cd5061e20b63b622310 (patch) | |
| tree | 7ec0d804a1498000da7b8c6282f0e1d5666706cd /arch/x86 | |
| parent | 44da6629d2820c8fd9ffa58cc7e46c2215828cb8 (diff) | |
KVM: x86: Mark vmcs12 pages as dirty if and only if they're mapped
Mark vmcs12 pages as dirty (in KVM's dirty log bitmap) if and only if the
page is mapped, i.e. if the page is actually "active" in vmcs02. For some
pages, KVM simply disables the associated VMCS control if the vmcs12 page
is unreachable, i.e. it's possible for nested VM-Enter to succeed with a
"bad" vmcs12 page.
Link: https://patch.msgid.link/20251121223444.355422-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/kvm/vmx/nested.c | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 6137e5307d0f..72fcb1228af4 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -3984,23 +3984,14 @@ static void vmcs12_save_pending_event(struct kvm_vcpu *vcpu, void nested_mark_vmcs12_pages_dirty(struct kvm_vcpu *vcpu) { - struct vmcs12 *vmcs12 = get_vmcs12(vcpu); - gfn_t gfn; + struct vcpu_vmx *vmx = to_vmx(vcpu); /* * Don't need to mark the APIC access page dirty; it is never * written to by the CPU during APIC virtualization. */ - - if (nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) { - gfn = vmcs12->virtual_apic_page_addr >> PAGE_SHIFT; - kvm_vcpu_mark_page_dirty(vcpu, gfn); - } - - if (nested_cpu_has_posted_intr(vmcs12)) { - gfn = vmcs12->posted_intr_desc_addr >> PAGE_SHIFT; - kvm_vcpu_mark_page_dirty(vcpu, gfn); - } + kvm_vcpu_map_mark_dirty(vcpu, &vmx->nested.virtual_apic_map); + kvm_vcpu_map_mark_dirty(vcpu, &vmx->nested.pi_desc_map); } static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) |
