• Sean Christopherson's avatar
    KVM: x86: Add kvm_x86_ops hook to short circuit emulation · 09e3e2a1
    Sean Christopherson authored
    Replace the existing kvm_x86_ops.need_emulation_on_page_fault() with a
    more generic is_emulatable(), and unconditionally call the new function
    in x86_emulate_instruction().
    
    KVM will use the generic hook to support multiple security related
    technologies that prevent emulation in one way or another.  Similar to
    the existing AMD #NPF case where emulation of the current instruction is
    not possible due to lack of information, AMD's SEV-ES and Intel's SGX
    and TDX will introduce scenarios where emulation is impossible due to
    the guest's register state being inaccessible.  And again similar to the
    existing #NPF case, emulation can be initiated by kvm_mmu_page_fault(),
    i.e. outside of the control of vendor-specific code.
    
    While the cause and architecturally visible behavior of the various
    cases are different, e.g. SGX will inject a #UD, AMD #NPF is a clean
    resume or complete shutdown, and SEV-ES and TDX "return" an error, the
    impact on the common emulation code is identical: KVM must stop
    emulation immediately and resume the guest.
    
    Query is_emulatable() in handle_ud() as well so that the
    force_emulation_prefix code doesn't incorrectly modify RIP before
    calling emulate_instruction() in the absurdly unlikely scenario that
    KVM encounters forced emulation in conjunction with "do not emulate".
    
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Message-Id: <20200915232702.15945-1-sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    09e3e2a1
svm.c 112 KB