• Sean Christopherson's avatar
    KVM: nVMX: Clear EXIT_QUALIFICATION when injecting an EPT Misconfig · 0c476514
    Sean Christopherson authored
    Explicitly clear the EXIT_QUALIFCATION field when injecting an EPT
    misconfig into L1, as required by the VMX architecture.  Per the SDM:
    
      This field is saved for VM exits due to the following causes:
      debug exceptions; page-fault exceptions; start-up IPIs (SIPIs);
      system-management interrupts (SMIs) that arrive immediately after the
      execution of I/O instructions; task switches; INVEPT; INVLPG; INVPCID;
      INVVPID; LGDT; LIDT; LLDT; LTR; SGDT; SIDT; SLDT; STR; VMCLEAR; VMPTRLD;
      VMPTRST; VMREAD; VMWRITE; VMXON; WBINVD; WBNOINVD; XRSTORS; XSAVES;
      control-register accesses; MOV DR; I/O instructions; MWAIT; accesses to
      the APIC-access page; EPT violations; EOI virtualization; APIC-write
      emulation; page-modification log full; SPP-related events; and
      instruction timeout. For all other VM exits, this field is cleared.
    
    Generating EXIT_QUALIFICATION from vcpu->arch.exit_qualification is wrong
    for all (two) paths that lead to nested_ept_inject_page_fault().  For EPT
    violations (the common case), vcpu->arch.exit_qualification will have been
    set by handle_ept_violation() to vmcs02.EXIT_QUALIFICATION, i.e. contains
    the information of a EPT violation and thus is likely non-zero.
    
    For an EPT misconfig, which can reach FNAME(walk_addr_generic) and thus
    inject a nEPT misconfig if KVM created an MMIO SPTE that became stale,
    vcpu->arch.exit_qualification will hold the information from the last EPT
    violation VM-Exit, as vcpu->arch.exit_qualification is _only_ written by
    handle_ept_violation().
    
    Fixes: 4704d0be ("KVM: nVMX: Exiting from L2 to L1")
    Link: https://lore.kernel.org/r/20240209221700.393189-2-seanjc@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    0c476514
nested.c 221 KB