Module Name:    src
Committed By:   maxv
Date:           Sat Feb 16 12:05:30 UTC 2019

Modified Files:
        src/sys/arch/x86/include: specialreg.h
        src/sys/dev/nvmm/x86: nvmm_x86_vmx.c

Log Message:
Handle MSR_MISC_ENABLE on NVMM-Intel (Intel-specific).


To generate a diff of this commit:
cvs rdiff -u -r1.140 -r1.141 src/sys/arch/x86/include/specialreg.h
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/include/specialreg.h
diff -u src/sys/arch/x86/include/specialreg.h:1.140 src/sys/arch/x86/include/specialreg.h:1.141
--- src/sys/arch/x86/include/specialreg.h:1.140	Mon Feb 11 14:59:32 2019
+++ src/sys/arch/x86/include/specialreg.h	Sat Feb 16 12:05:30 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: specialreg.h,v 1.140 2019/02/11 14:59:32 cherry Exp $	*/
+/*	$NetBSD: specialreg.h,v 1.141 2019/02/16 12:05:30 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1991 The Regents of the University of California.
@@ -768,7 +768,16 @@
 #define MSR_THERM_STATUS	0x19c
 #define MSR_THERM2_CTL		0x19d	/* Pentium M */
 #define MSR_MISC_ENABLE		0x1a0
-#define 	IA32_MISC_MWAIT_EN	0x40000
+#define 	IA32_MISC_FAST_STR_EN	__BIT(0)
+#define 	IA32_MISC_ATCC_EN	__BIT(3)
+#define 	IA32_MISC_PERFMON_EN	__BIT(7)
+#define 	IA32_MISC_BTS_UNAVAIL	__BIT(11)
+#define 	IA32_MISC_PEBS_UNAVAIL	__BIT(12)
+#define 	IA32_MISC_EISST_EN	__BIT(16)
+#define 	IA32_MISC_MWAIT_EN	__BIT(18)
+#define 	IA32_MISC_LIMIT_CPUID	__BIT(22)
+#define 	IA32_MISC_XTPR_DIS	__BIT(23)
+#define 	IA32_MISC_XD_DIS	__BIT(34)
 #define MSR_TEMPERATURE_TARGET	0x1a2
 #define MSR_DEBUGCTLMSR		0x1d9
 #define MSR_LASTBRANCHFROMIP	0x1db

Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.4 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.5
--- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.4	Fri Feb 15 13:17:05 2019
+++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c	Sat Feb 16 12:05:30 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86_vmx.c,v 1.4 2019/02/15 13:17:05 maxv Exp $	*/
+/*	$NetBSD: nvmm_x86_vmx.c,v 1.5 2019/02/16 12:05:30 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.4 2019/02/15 13:17:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.5 2019/02/16 12:05:30 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -665,6 +665,7 @@ struct vmx_cpudata {
 	/* Guest state */
 	struct msr_entry *gmsr;
 	paddr_t gmsr_pa;
+	uint64_t gmsr_misc_enable;
 	uint64_t gcr2;
 	uint64_t gcr8;
 	uint64_t gxcr0;
@@ -1361,6 +1362,12 @@ vmx_inkernel_handle_msr(struct nvmm_mach
 			cpudata->gprs[NVMM_X64_GPR_RDX] = (val >> 32);
 			goto handled;
 		}
+		if (exit->u.msr.msr == MSR_MISC_ENABLE) {
+			val = cpudata->gmsr_misc_enable;
+			cpudata->gprs[NVMM_X64_GPR_RAX] = (val & 0xFFFFFFFF);
+			cpudata->gprs[NVMM_X64_GPR_RDX] = (val >> 32);
+			goto handled;
+		}
 		for (i = 0; i < __arraycount(msr_ignore_list); i++) {
 			if (msr_ignore_list[i] != exit->u.msr.msr)
 				continue;
@@ -1381,6 +1388,10 @@ vmx_inkernel_handle_msr(struct nvmm_mach
 			vmx_vmwrite(VMCS_GUEST_IA32_PAT, exit->u.msr.val);
 			goto handled;
 		}
+		if (exit->u.msr.msr == MSR_MISC_ENABLE) {
+			/* Don't care. */
+			goto handled;
+		}
 		for (i = 0; i < __arraycount(msr_ignore_list); i++) {
 			if (msr_ignore_list[i] != exit->u.msr.msr)
 				continue;
@@ -2007,6 +2018,13 @@ vmx_vcpu_init(struct nvmm_machine *mach,
 	    mach->vm->vm_map.pmap->pm_pdirpa[0];
 	vmx_vmwrite(VMCS_EPTP, eptp);
 
+	/* Init IA32_MISC_ENABLE. */
+	cpudata->gmsr_misc_enable = rdmsr(MSR_MISC_ENABLE);
+	cpudata->gmsr_misc_enable &=
+	    ~(IA32_MISC_PERFMON_EN|IA32_MISC_EISST_EN|IA32_MISC_MWAIT_EN);
+	cpudata->gmsr_misc_enable |=
+	    (IA32_MISC_BTS_UNAVAIL|IA32_MISC_PEBS_UNAVAIL);
+
 	/* Must always be set. */
 	vmx_vmwrite(VMCS_GUEST_CR4, CR4_VMXE);
 	vmx_vmwrite(VMCS_GUEST_CR0, CR0_NE);

Reply via email to