|
@@ -3525,9 +3525,6 @@ static void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, bool apicv)
|
|
|
VM_EXIT_LOAD_IA32_EFER | VM_EXIT_SAVE_IA32_EFER |
|
|
|
VM_EXIT_SAVE_VMX_PREEMPTION_TIMER | VM_EXIT_ACK_INTR_ON_EXIT;
|
|
|
|
|
|
- if (kvm_mpx_supported())
|
|
|
- msrs->exit_ctls_high |= VM_EXIT_CLEAR_BNDCFGS;
|
|
|
-
|
|
|
/* We support free control of debug control saving. */
|
|
|
msrs->exit_ctls_low &= ~VM_EXIT_SAVE_DEBUG_CONTROLS;
|
|
|
|
|
@@ -3544,8 +3541,6 @@ static void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, bool apicv)
|
|
|
VM_ENTRY_LOAD_IA32_PAT;
|
|
|
msrs->entry_ctls_high |=
|
|
|
(VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | VM_ENTRY_LOAD_IA32_EFER);
|
|
|
- if (kvm_mpx_supported())
|
|
|
- msrs->entry_ctls_high |= VM_ENTRY_LOAD_BNDCFGS;
|
|
|
|
|
|
/* We support free control of debug control loading. */
|
|
|
msrs->entry_ctls_low &= ~VM_ENTRY_LOAD_DEBUG_CONTROLS;
|
|
@@ -11237,6 +11232,23 @@ static void nested_vmx_cr_fixed1_bits_update(struct kvm_vcpu *vcpu)
|
|
|
#undef cr4_fixed1_update
|
|
|
}
|
|
|
|
|
|
+static void nested_vmx_entry_exit_ctls_update(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
|
+
|
|
|
+ if (kvm_mpx_supported()) {
|
|
|
+ bool mpx_enabled = guest_cpuid_has(vcpu, X86_FEATURE_MPX);
|
|
|
+
|
|
|
+ if (mpx_enabled) {
|
|
|
+ vmx->nested.msrs.entry_ctls_high |= VM_ENTRY_LOAD_BNDCFGS;
|
|
|
+ vmx->nested.msrs.exit_ctls_high |= VM_EXIT_CLEAR_BNDCFGS;
|
|
|
+ } else {
|
|
|
+ vmx->nested.msrs.entry_ctls_high &= ~VM_ENTRY_LOAD_BNDCFGS;
|
|
|
+ vmx->nested.msrs.exit_ctls_high &= ~VM_EXIT_CLEAR_BNDCFGS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
@@ -11253,8 +11265,10 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
|
|
|
to_vmx(vcpu)->msr_ia32_feature_control_valid_bits &=
|
|
|
~FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX;
|
|
|
|
|
|
- if (nested_vmx_allowed(vcpu))
|
|
|
+ if (nested_vmx_allowed(vcpu)) {
|
|
|
nested_vmx_cr_fixed1_bits_update(vcpu);
|
|
|
+ nested_vmx_entry_exit_ctls_update(vcpu);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void vmx_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
|