]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/x86/kvm/svm.c
KVM: x86: Don't attempt VMWare emulation on #GP with non-zero error code
[linux.git] / arch / x86 / kvm / svm.c
index 04fe21849b6e46adcc7dc4f7b32bea3541bf6cea..00ec27bc2946b932760feebab84b3bf8171da121 100644 (file)
@@ -2772,12 +2772,20 @@ static int gp_interception(struct vcpu_svm *svm)
 
        WARN_ON_ONCE(!enable_vmware_backdoor);
 
+       /*
+        * VMware backdoor emulation on #GP interception only handles IN{S},
+        * OUT{S}, and RDPMC, none of which generate a non-zero error code.
+        */
+       if (error_code) {
+               kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
+               return 1;
+       }
        er = kvm_emulate_instruction(vcpu,
                EMULTYPE_VMWARE | EMULTYPE_NO_UD_ON_FAIL);
        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;
 }
 
@@ -7099,13 +7107,6 @@ static int svm_unregister_enc_region(struct kvm *kvm,
        return ret;
 }
 
-static int nested_enable_evmcs(struct kvm_vcpu *vcpu,
-                                  uint16_t *vmcs_version)
-{
-       /* Intel-only feature */
-       return -ENODEV;
-}
-
 static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
 {
        unsigned long cr4 = kvm_read_cr4(vcpu);
@@ -7311,7 +7312,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
        .mem_enc_reg_region = svm_register_enc_region,
        .mem_enc_unreg_region = svm_unregister_enc_region,
 
-       .nested_enable_evmcs = nested_enable_evmcs,
+       .nested_enable_evmcs = NULL,
        .nested_get_evmcs_version = NULL,
 
        .need_emulation_on_page_fault = svm_need_emulation_on_page_fault,