diff options
Diffstat (limited to 'drivers/kvm/vmx.c')
-rw-r--r-- | drivers/kvm/vmx.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 79674a7a92bb..dac2f93d1a07 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -751,7 +751,10 @@ static __init int vmx_disabled_by_bios(void) | |||
751 | u64 msr; | 751 | u64 msr; |
752 | 752 | ||
753 | rdmsrl(MSR_IA32_FEATURE_CONTROL, msr); | 753 | rdmsrl(MSR_IA32_FEATURE_CONTROL, msr); |
754 | return (msr & 5) == 1; /* locked but not enabled */ | 754 | return (msr & (MSR_IA32_FEATURE_CONTROL_LOCKED | |
755 | MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED)) | ||
756 | == MSR_IA32_FEATURE_CONTROL_LOCKED; | ||
757 | /* locked but not enabled */ | ||
755 | } | 758 | } |
756 | 759 | ||
757 | static void hardware_enable(void *garbage) | 760 | static void hardware_enable(void *garbage) |
@@ -761,9 +764,14 @@ static void hardware_enable(void *garbage) | |||
761 | u64 old; | 764 | u64 old; |
762 | 765 | ||
763 | rdmsrl(MSR_IA32_FEATURE_CONTROL, old); | 766 | rdmsrl(MSR_IA32_FEATURE_CONTROL, old); |
764 | if ((old & 5) != 5) | 767 | if ((old & (MSR_IA32_FEATURE_CONTROL_LOCKED | |
768 | MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED)) | ||
769 | != (MSR_IA32_FEATURE_CONTROL_LOCKED | | ||
770 | MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED)) | ||
765 | /* enable and lock */ | 771 | /* enable and lock */ |
766 | wrmsrl(MSR_IA32_FEATURE_CONTROL, old | 5); | 772 | wrmsrl(MSR_IA32_FEATURE_CONTROL, old | |
773 | MSR_IA32_FEATURE_CONTROL_LOCKED | | ||
774 | MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED); | ||
767 | write_cr4(read_cr4() | X86_CR4_VMXE); /* FIXME: not cpu hotplug safe */ | 775 | write_cr4(read_cr4() | X86_CR4_VMXE); /* FIXME: not cpu hotplug safe */ |
768 | asm volatile (ASM_VMX_VMXON_RAX : : "a"(&phys_addr), "m"(phys_addr) | 776 | asm volatile (ASM_VMX_VMXON_RAX : : "a"(&phys_addr), "m"(phys_addr) |
769 | : "memory", "cc"); | 777 | : "memory", "cc"); |
@@ -1326,7 +1334,7 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) | |||
1326 | CPU_BASED_HLT_EXITING /* 20.6.2 */ | 1334 | CPU_BASED_HLT_EXITING /* 20.6.2 */ |
1327 | | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ | 1335 | | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ |
1328 | | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ | 1336 | | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ |
1329 | | CPU_BASED_ACTIVATE_IO_BITMAP /* 20.6.2 */ | 1337 | | CPU_BASED_USE_IO_BITMAPS /* 20.6.2 */ |
1330 | | CPU_BASED_MOV_DR_EXITING | 1338 | | CPU_BASED_MOV_DR_EXITING |
1331 | | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ | 1339 | | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ |
1332 | ); | 1340 | ); |