summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortychon <tychon@FreeBSD.org>2014-05-30 23:37:31 +0000
committertychon <tychon@FreeBSD.org>2014-05-30 23:37:31 +0000
commit61025dc75e43d7ebf01a6fd85dd72971265bf69f (patch)
tree37fb88f095a45cfd662c9e69823bb370475b89fe
parent851231354f749fda43cd341c1d3e5b0dbedcc8b1 (diff)
downloadFreeBSD-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)
-rw-r--r--sys/amd64/vmm/intel/vmx.c11
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);
OpenPOWER on IntegriCloud