mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
KVM: nSVM: Refactor writing vmcb12 on nested #VMEXIT as a helper
Move mapping vmcb12 and updating it out of nested_svm_vmexit() into a helper, no functional change intended. CC: stable@vger.kernel.org Co-developed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Yosry Ahmed <yosry@kernel.org> Link: https://patch.msgid.link/20260303003421.2185681-8-yosry@kernel.org Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
290c8d8202
commit
dcf3648ab7
|
|
@ -1124,36 +1124,20 @@ void svm_copy_vmloadsave_state(struct vmcb *to_vmcb, struct vmcb *from_vmcb)
|
|||
to_vmcb->save.sysenter_eip = from_vmcb->save.sysenter_eip;
|
||||
}
|
||||
|
||||
int nested_svm_vmexit(struct vcpu_svm *svm)
|
||||
static int nested_svm_vmexit_update_vmcb12(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||
struct vmcb *vmcb01 = svm->vmcb01.ptr;
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
struct vmcb *vmcb02 = svm->nested.vmcb02.ptr;
|
||||
struct vmcb *vmcb12;
|
||||
struct kvm_host_map map;
|
||||
struct vmcb *vmcb12;
|
||||
int rc;
|
||||
|
||||
rc = kvm_vcpu_map(vcpu, gpa_to_gfn(svm->nested.vmcb12_gpa), &map);
|
||||
if (rc) {
|
||||
if (rc == -EINVAL)
|
||||
kvm_inject_gp(vcpu, 0);
|
||||
return 1;
|
||||
}
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
vmcb12 = map.hva;
|
||||
|
||||
/* Exit Guest-Mode */
|
||||
leave_guest_mode(vcpu);
|
||||
svm->nested.vmcb12_gpa = 0;
|
||||
WARN_ON_ONCE(svm->nested.nested_run_pending);
|
||||
|
||||
kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
|
||||
|
||||
/* in case we halted in L2 */
|
||||
kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
|
||||
|
||||
/* Give the current vmcb to the guest */
|
||||
|
||||
vmcb12->save.es = vmcb02->save.es;
|
||||
vmcb12->save.cs = vmcb02->save.cs;
|
||||
vmcb12->save.ss = vmcb02->save.ss;
|
||||
|
|
@ -1190,10 +1174,48 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
|
|||
if (guest_cpu_cap_has(vcpu, X86_FEATURE_NRIPS))
|
||||
vmcb12->control.next_rip = vmcb02->control.next_rip;
|
||||
|
||||
if (nested_vmcb12_has_lbrv(vcpu))
|
||||
svm_copy_lbrs(&vmcb12->save, &vmcb02->save);
|
||||
|
||||
vmcb12->control.int_ctl = svm->nested.ctl.int_ctl;
|
||||
vmcb12->control.event_inj = svm->nested.ctl.event_inj;
|
||||
vmcb12->control.event_inj_err = svm->nested.ctl.event_inj_err;
|
||||
|
||||
trace_kvm_nested_vmexit_inject(vmcb12->control.exit_code,
|
||||
vmcb12->control.exit_info_1,
|
||||
vmcb12->control.exit_info_2,
|
||||
vmcb12->control.exit_int_info,
|
||||
vmcb12->control.exit_int_info_err,
|
||||
KVM_ISA_SVM);
|
||||
|
||||
kvm_vcpu_unmap(vcpu, &map);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nested_svm_vmexit(struct vcpu_svm *svm)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||
struct vmcb *vmcb01 = svm->vmcb01.ptr;
|
||||
struct vmcb *vmcb02 = svm->nested.vmcb02.ptr;
|
||||
int rc;
|
||||
|
||||
rc = nested_svm_vmexit_update_vmcb12(vcpu);
|
||||
if (rc) {
|
||||
if (rc == -EINVAL)
|
||||
kvm_inject_gp(vcpu, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Exit Guest-Mode */
|
||||
leave_guest_mode(vcpu);
|
||||
svm->nested.vmcb12_gpa = 0;
|
||||
WARN_ON_ONCE(svm->nested.nested_run_pending);
|
||||
|
||||
kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
|
||||
|
||||
/* in case we halted in L2 */
|
||||
kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
|
||||
|
||||
if (!kvm_pause_in_guest(vcpu->kvm)) {
|
||||
vmcb01->control.pause_filter_count = vmcb02->control.pause_filter_count;
|
||||
vmcb_mark_dirty(vmcb01, VMCB_INTERCEPTS);
|
||||
|
|
@ -1238,9 +1260,7 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
|
|||
if (!nested_exit_on_intr(svm))
|
||||
kvm_make_request(KVM_REQ_EVENT, &svm->vcpu);
|
||||
|
||||
if (nested_vmcb12_has_lbrv(vcpu)) {
|
||||
svm_copy_lbrs(&vmcb12->save, &vmcb02->save);
|
||||
} else {
|
||||
if (!nested_vmcb12_has_lbrv(vcpu)) {
|
||||
svm_copy_lbrs(&vmcb01->save, &vmcb02->save);
|
||||
vmcb_mark_dirty(vmcb01, VMCB_LBR);
|
||||
}
|
||||
|
|
@ -1296,15 +1316,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
|
|||
svm->vcpu.arch.dr7 = DR7_FIXED_1;
|
||||
kvm_update_dr7(&svm->vcpu);
|
||||
|
||||
trace_kvm_nested_vmexit_inject(vmcb12->control.exit_code,
|
||||
vmcb12->control.exit_info_1,
|
||||
vmcb12->control.exit_info_2,
|
||||
vmcb12->control.exit_int_info,
|
||||
vmcb12->control.exit_int_info_err,
|
||||
KVM_ISA_SVM);
|
||||
|
||||
kvm_vcpu_unmap(vcpu, &map);
|
||||
|
||||
nested_svm_transition_tlb_flush(vcpu);
|
||||
|
||||
nested_svm_uninit_mmu_context(vcpu);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user