lkml.org 
[lkml]   [2019]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RESEND PATCH 05/13] KVM: x86: Don't attempt VMWare emulation on #GP with non-zero error code
    Date
    The VMware backdoor hooks #GP faults on IN{S}, OUT{S}, and RDPMC, none
    of which generate a non-zero error code for their #GP. Re-injecting #GP
    instead of attempting emulation on a non-zero error code will allow a
    future patch to move #GP injection (for emulation failure) into
    kvm_emulate_instruction() without having to plumb in the error code.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    ---
    arch/x86/kvm/svm.c | 6 +++++-
    arch/x86/kvm/vmx/vmx.c | 7 ++++++-
    2 files changed, 11 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index 5a42f9c70014..b96a119690f4 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -2772,11 +2772,15 @@ static int gp_interception(struct vcpu_svm *svm)

    WARN_ON_ONCE(!enable_vmware_backdoor);

    + if (error_code) {
    + kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
    + return 1;
    + }
    er = kvm_emulate_instruction(vcpu, EMULTYPE_VMWARE);
    if (er == EMULATE_USER_EXIT)
    return 0;
    else if (er != EMULATE_DONE)
    - kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
    + kvm_queue_exception_e(vcpu, GP_VECTOR, 0);
    return 1;
    }

    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index 6ecf773825e2..3ee0dd304bc7 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -4509,11 +4509,16 @@ static int handle_exception_nmi(struct kvm_vcpu *vcpu)

    if (!vmx->rmode.vm86_active && is_gp_fault(intr_info)) {
    WARN_ON_ONCE(!enable_vmware_backdoor);
    +
    + if (error_code) {
    + kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
    + return 1;
    + }
    er = kvm_emulate_instruction(vcpu, EMULTYPE_VMWARE);
    if (er == EMULATE_USER_EXIT)
    return 0;
    else if (er != EMULATE_DONE)
    - kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
    + kvm_queue_exception_e(vcpu, GP_VECTOR, 0);
    return 1;
    }

    --
    2.22.0
    \
     
     \ /
      Last update: 2019-08-23 03:11    [W:4.136 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site