diff options
author | grehan <grehan@FreeBSD.org> | 2013-09-06 05:20:11 +0000 |
---|---|---|
committer | grehan <grehan@FreeBSD.org> | 2013-09-06 05:20:11 +0000 |
commit | 5110b054b22685516ac8b828fb0e43187ce8a532 (patch) | |
tree | 90dd7be1d6126730c4ba7774b249f98930791410 /sys/amd64/vmm/vmm_msr.c | |
parent | 37b6e3223fc91b6bf44902ea090b984c9417f3c3 (diff) | |
download | FreeBSD-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/vmm/vmm_msr.c')
-rw-r--r-- | sys/amd64/vmm/vmm_msr.c | 17 |
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); |