Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/nvmm/x86 Reorder the detection in vmx_ident(), to fi...



details:   https://anonhg.NetBSD.org/src/rev/2e150da0ea20
branches:  trunk
changeset: 449081:2e150da0ea20
user:      maxv <maxv%NetBSD.org@localhost>
date:      Thu Feb 21 13:25:44 2019 +0000

description:
Reorder the detection in vmx_ident(), to fix panic on old CPUs. We must
read MSR_IA32_VMX_EPT_VPID_CAP _after_ ensuring EPT is there, because if
it's not, the rdmsr faults.

diffstat:

 sys/dev/nvmm/x86/nvmm_x86_vmx.c |  38 +++++++++++++++++++-------------------
 1 files changed, 19 insertions(+), 19 deletions(-)

diffs (66 lines):

diff -r a626767ad19a -r 2e150da0ea20 sys/dev/nvmm/x86/nvmm_x86_vmx.c
--- a/sys/dev/nvmm/x86/nvmm_x86_vmx.c   Thu Feb 21 12:17:52 2019 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86_vmx.c   Thu Feb 21 13:25:44 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nvmm_x86_vmx.c,v 1.9 2019/02/21 12:17:52 maxv Exp $    */
+/*     $NetBSD: nvmm_x86_vmx.c,v 1.10 2019/02/21 13:25:44 maxv Exp $   */
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.9 2019/02/21 12:17:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.10 2019/02/21 13:25:44 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2655,23 +2655,6 @@
                return false;
        }
 
-       msr = rdmsr(MSR_IA32_VMX_EPT_VPID_CAP);
-       if ((msr & IA32_VMX_EPT_VPID_WALKLENGTH_4) == 0) {
-               return false;
-       }
-       if ((msr & IA32_VMX_EPT_VPID_INVEPT) == 0) {
-               return false;
-       }
-       if ((msr & IA32_VMX_EPT_VPID_INVVPID) == 0) {
-               return false;
-       }
-       if ((msr & IA32_VMX_EPT_VPID_FLAGS_AD) == 0) {
-               return false;
-       }
-       if (!(msr & IA32_VMX_EPT_VPID_UC) && !(msr & IA32_VMX_EPT_VPID_WB)) {
-               return false;
-       }
-
        /* PG and PE are reported, even if Unrestricted Guests is supported. */
        vmx_cr0_fixed0 = rdmsr(MSR_IA32_VMX_CR0_FIXED0) & ~(CR0_PG|CR0_PE);
        vmx_cr0_fixed1 = rdmsr(MSR_IA32_VMX_CR0_FIXED1) | (CR0_PG|CR0_PE);
@@ -2724,6 +2707,23 @@
                return false;
        }
 
+       msr = rdmsr(MSR_IA32_VMX_EPT_VPID_CAP);
+       if ((msr & IA32_VMX_EPT_VPID_WALKLENGTH_4) == 0) {
+               return false;
+       }
+       if ((msr & IA32_VMX_EPT_VPID_INVEPT) == 0) {
+               return false;
+       }
+       if ((msr & IA32_VMX_EPT_VPID_INVVPID) == 0) {
+               return false;
+       }
+       if ((msr & IA32_VMX_EPT_VPID_FLAGS_AD) == 0) {
+               return false;
+       }
+       if (!(msr & IA32_VMX_EPT_VPID_UC) && !(msr & IA32_VMX_EPT_VPID_WB)) {
+               return false;
+       }
+
        return true;
 }
 



Home | Main Index | Thread Index | Old Index