summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorgrehan <grehan@FreeBSD.org>2013-09-06 05:20:11 +0000
committergrehan <grehan@FreeBSD.org>2013-09-06 05:20:11 +0000
commit5110b054b22685516ac8b828fb0e43187ce8a532 (patch)
tree90dd7be1d6126730c4ba7774b249f98930791410 /sys/amd64
parent37b6e3223fc91b6bf44902ea090b984c9417f3c3 (diff)
downloadFreeBSD-src-5110b054b22685516ac8b828fb0e43187ce8a532.zip
FreeBSD-src-5110b054b22685516ac8b828fb0e43187ce8a532.tar.gz
Emulate reading of the IA32_MISC_ENABLE MSR, by returning
the host MSR and masking off features that aren't supported. Linux reads this MSR to detect if NX has been disabled via BIOS.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/vmm/vmm_msr.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/sys/amd64/vmm/vmm_msr.c b/sys/amd64/vmm/vmm_msr.c
index d97c819..0ccd7af 100644
--- a/sys/amd64/vmm/vmm_msr.c
+++ b/sys/amd64/vmm/vmm_msr.c
@@ -57,6 +57,7 @@ static struct vmm_msr vmm_msr[] = {
{ MSR_PAT, VMM_MSR_F_EMULATE | VMM_MSR_F_INVALID },
{ MSR_BIOS_SIGN,VMM_MSR_F_EMULATE },
{ MSR_MCG_CAP, VMM_MSR_F_EMULATE | VMM_MSR_F_READONLY },
+ { MSR_IA32_MISC_ENABLE, VMM_MSR_F_EMULATE | VMM_MSR_F_READONLY },
};
#define vmm_msr_num (sizeof(vmm_msr) / sizeof(vmm_msr[0]))
@@ -91,7 +92,7 @@ void
guest_msrs_init(struct vm *vm, int cpu)
{
int i;
- uint64_t *guest_msrs;
+ uint64_t *guest_msrs, misc;
guest_msrs = vm_guest_msrs(vm, cpu);
@@ -115,6 +116,20 @@ guest_msrs_init(struct vm *vm, int cpu)
PAT_VALUE(6, PAT_UNCACHED) |
PAT_VALUE(7, PAT_UNCACHEABLE);
break;
+ case MSR_IA32_MISC_ENABLE:
+ misc = rdmsr(MSR_IA32_MISC_ENABLE);
+ /*
+ * Set mandatory bits
+ * 11: branch trace disabled
+ * 12: PEBS unavailable
+ * Clear unsupported features
+ * 16: SpeedStep enable
+ * 18: enable MONITOR FSM
+ */
+ misc |= (1 << 12) | (1 << 11);
+ misc &= ~((1 << 18) | (1 << 16));
+ guest_msrs[i] = misc;
+ break;
default:
panic("guest_msrs_init: missing initialization for msr "
"0x%0x", vmm_msr[i].num);
OpenPOWER on IntegriCloud