]> xenbits.xensource.com Git - xen.git/commitdiff
x86/HVM: don't give the wrong impression of WRMSR succeeding
authorJan Beulich <jbeulich@suse.com>
Tue, 6 Mar 2018 15:24:41 +0000 (16:24 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 6 Mar 2018 15:24:41 +0000 (16:24 +0100)
... for non-existent MSRs: wrmsr_hypervisor_regs()'s comment clearly
says that the function returns 0 for unrecognized MSRs, so
{svm,vmx}_msr_write_intercept() should not convert this into success. We
don't want to unconditionally fail the access though, as we can't be
certain the list of handled MSRs is complete enough for the guest types
we care about, so instead mirror what we do on the read paths and probe
the MSR to decide whether to raise #GP.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
master commit: 1f1d183d49008794b087cf043fc77f724a45af98
master date: 2018-02-27 15:12:23 +0100

xen/arch/x86/hvm/svm/svm.c
xen/arch/x86/hvm/vmx/vmx.c

index e5bc5122e4e373a3cc35ab628b2462a0a2738e1e..fd593fac135268340ab77c7e9d55a327fe8537b5 100644 (file)
@@ -1965,6 +1965,13 @@ static int svm_msr_write_intercept(unsigned int msr, uint64_t msr_content)
             result = X86EMUL_RETRY;
             break;
         case 0:
+            /*
+             * Match up with the RDMSR side for now; ultimately this entire
+             * case block should go away.
+             */
+            if ( rdmsr_safe(msr, msr_content) == 0 )
+                break;
+            goto gpf;
         case 1:
             break;
         default:
index a4124e4a35c1f568a4982bc9bcfd6f670c0ca01b..a6a32db1e2e99b5b84e3923f9cabc39e0fcec11b 100644 (file)
@@ -2993,6 +2993,13 @@ static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content)
                     case -ERESTART:
                         return X86EMUL_RETRY;
                     case 0:
+                        /*
+                         * Match up with the RDMSR side for now; ultimately this
+                         * entire case block should go away.
+                         */
+                        if ( rdmsr_safe(msr, msr_content) == 0 )
+                            break;
+                        goto gp_fault;
                     case 1:
                         break;
                     default: