diff options
author | tychon <tychon@FreeBSD.org> | 2014-05-30 23:37:31 +0000 |
---|---|---|
committer | tychon <tychon@FreeBSD.org> | 2014-05-30 23:37:31 +0000 |
commit | 61025dc75e43d7ebf01a6fd85dd72971265bf69f (patch) | |
tree | 37fb88f095a45cfd662c9e69823bb370475b89fe /sys/amd64/vmm/intel | |
parent | 851231354f749fda43cd341c1d3e5b0dbedcc8b1 (diff) | |
download | FreeBSD-src-61025dc75e43d7ebf01a6fd85dd72971265bf69f.zip FreeBSD-src-61025dc75e43d7ebf01a6fd85dd72971265bf69f.tar.gz |
If VMX isn't enabled so long as the lock bit isn't set yet in MSR
IA32_FEATURE_CONTROL it still can be.
Approved by: grehan (co-mentor)
Diffstat (limited to 'sys/amd64/vmm/intel')
-rw-r--r-- | sys/amd64/vmm/intel/vmx.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/amd64/vmm/intel/vmx.c b/sys/amd64/vmm/intel/vmx.c index ba76f11..85e176a 100644 --- a/sys/amd64/vmm/intel/vmx.c +++ b/sys/amd64/vmm/intel/vmx.c @@ -512,6 +512,15 @@ static void vmx_enable(void *arg __unused) { int error; + uint64_t feature_control; + + feature_control = rdmsr(MSR_IA32_FEATURE_CONTROL); + if ((feature_control & IA32_FEATURE_CONTROL_LOCK) == 0 || + (feature_control & IA32_FEATURE_CONTROL_VMX_EN) == 0) { + wrmsr(MSR_IA32_FEATURE_CONTROL, + feature_control | IA32_FEATURE_CONTROL_VMX_EN | + IA32_FEATURE_CONTROL_LOCK); + } load_cr4(rcr4() | CR4_VMXE); @@ -547,7 +556,7 @@ vmx_init(int ipinum) * are set (bits 0 and 2 respectively). */ feature_control = rdmsr(MSR_IA32_FEATURE_CONTROL); - if ((feature_control & IA32_FEATURE_CONTROL_LOCK) == 0 || + if ((feature_control & IA32_FEATURE_CONTROL_LOCK) == 1 && (feature_control & IA32_FEATURE_CONTROL_VMX_EN) == 0) { printf("vmx_init: VMX operation disabled by BIOS\n"); return (ENXIO); |