• Sean Christopherson's avatar
    KVM: VMX: Handle single-step #DB for EMULTYPE_SKIP on EPT misconfig · 1957aa63
    Sean Christopherson authored
    VMX's EPT misconfig flow to handle fast-MMIO path falls back to decoding
    the instruction to determine the instruction length when running as a
    guest (Hyper-V doesn't fill VMCS.VM_EXIT_INSTRUCTION_LEN because it's
    technically not defined for EPT misconfigs).  Rather than implement the
    slow skip in VMX's generic skip_emulated_instruction(),
    handle_ept_misconfig() directly calls kvm_emulate_instruction() with
    EMULTYPE_SKIP, which intentionally doesn't do single-step detection, and
    so handle_ept_misconfig() misses a single-step #DB.
    
    Rework the EPT misconfig fallback case to route it through
    kvm_skip_emulated_instruction() so that single-step #DBs and interrupt
    shadow updates are handled automatically.  I.e. make VMX's slow skip
    logic match SVM's and have the SVM flow not intentionally avoid the
    shadow update.
    
    Alternatively, the handle_ept_misconfig() could manually handle single-
    step detection, but that results in EMULTYPE_SKIP having split logic for
    the interrupt shadow vs. single-step #DBs, and split emulator logic is
    largely what led to this mess in the first place.
    
    Modifying SVM to mirror VMX flow isn't really an option as SVM's case
    isn't limited to a specific exit reason, i.e. handling the slow skip in
    skip_emulated_instruction() is mandatory for all intents and purposes.
    
    Drop VMX's skip_emulated_instruction() wrapper since it can now fail,
    and instead WARN if it fails unexpectedly, e.g. if exit_reason somehow
    becomes corrupted.
    
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Fixes: d391f120 ("x86/kvm/vmx: do not use vm-exit instruction length for fast MMIO when running nested")
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    1957aa63
vmx.c 217 KB