|
@@ -856,6 +856,7 @@ struct nested_vmx {
|
|
|
|
|
|
/* to migrate it to L2 if VM_ENTRY_LOAD_DEBUG_CONTROLS is off */
|
|
|
u64 vmcs01_debugctl;
|
|
|
+ u64 vmcs01_guest_bndcfgs;
|
|
|
|
|
|
u16 vpid02;
|
|
|
u16 last_vpid;
|
|
@@ -12036,8 +12037,13 @@ static void prepare_vmcs02_full(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
|
|
|
|
|
|
set_cr4_guest_host_mask(vmx);
|
|
|
|
|
|
- if (kvm_mpx_supported())
|
|
|
- vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs);
|
|
|
+ if (kvm_mpx_supported()) {
|
|
|
+ if (vmx->nested.nested_run_pending &&
|
|
|
+ (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
|
|
|
+ vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs);
|
|
|
+ else
|
|
|
+ vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs);
|
|
|
+ }
|
|
|
|
|
|
if (enable_vpid) {
|
|
|
if (nested_cpu_has_vpid(vmcs12) && vmx->nested.vpid02)
|
|
@@ -12591,6 +12597,9 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, u32 *exit_qual)
|
|
|
|
|
|
if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
|
|
|
vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
|
|
|
+ if (kvm_mpx_supported() &&
|
|
|
+ !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
|
|
|
+ vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
|
|
|
|
|
|
vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02);
|
|
|
vmx_segment_cache_clear(vmx);
|