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);