KVM: nVMX: Update vmcs12 for SYSENTER MSRs when they're written
For L2, KVM always intercepts WRMSR to SYSENTER MSRs. Update vmcs12 in the WRMSR handler so that they don't need to be (re)read from vmcs02 on every nested VM-Exit. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
142e4be77b
Коммит
de70d27970
|
@ -3521,6 +3521,10 @@ static void sync_vmcs02_to_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
|
|||
vmcs12->guest_cs_ar_bytes = vmcs_read32(GUEST_CS_AR_BYTES);
|
||||
vmcs12->guest_ss_ar_bytes = vmcs_read32(GUEST_SS_AR_BYTES);
|
||||
|
||||
vmcs12->guest_sysenter_cs = vmcs_read32(GUEST_SYSENTER_CS);
|
||||
vmcs12->guest_sysenter_esp = vmcs_readl(GUEST_SYSENTER_ESP);
|
||||
vmcs12->guest_sysenter_eip = vmcs_readl(GUEST_SYSENTER_EIP);
|
||||
|
||||
vmcs12->guest_interruptibility_info =
|
||||
vmcs_read32(GUEST_INTERRUPTIBILITY_INFO);
|
||||
|
||||
|
@ -3566,9 +3570,6 @@ static void sync_vmcs02_to_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
|
|||
|
||||
if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_IA32_EFER)
|
||||
vmcs12->guest_ia32_efer = vcpu->arch.efer;
|
||||
vmcs12->guest_sysenter_cs = vmcs_read32(GUEST_SYSENTER_CS);
|
||||
vmcs12->guest_sysenter_esp = vmcs_readl(GUEST_SYSENTER_ESP);
|
||||
vmcs12->guest_sysenter_eip = vmcs_readl(GUEST_SYSENTER_EIP);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1831,12 +1831,18 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||
break;
|
||||
#endif
|
||||
case MSR_IA32_SYSENTER_CS:
|
||||
if (is_guest_mode(vcpu))
|
||||
get_vmcs12(vcpu)->guest_sysenter_cs = data;
|
||||
vmcs_write32(GUEST_SYSENTER_CS, data);
|
||||
break;
|
||||
case MSR_IA32_SYSENTER_EIP:
|
||||
if (is_guest_mode(vcpu))
|
||||
get_vmcs12(vcpu)->guest_sysenter_eip = data;
|
||||
vmcs_writel(GUEST_SYSENTER_EIP, data);
|
||||
break;
|
||||
case MSR_IA32_SYSENTER_ESP:
|
||||
if (is_guest_mode(vcpu))
|
||||
get_vmcs12(vcpu)->guest_sysenter_esp = data;
|
||||
vmcs_writel(GUEST_SYSENTER_ESP, data);
|
||||
break;
|
||||
case MSR_IA32_BNDCFGS:
|
||||
|
|
Загрузка…
Ссылка в новой задаче