]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: nSVM: Refactor writing vmcb12 on nested #VMEXIT as a helper
authorYosry Ahmed <yosry@kernel.org>
Tue, 3 Mar 2026 00:34:01 +0000 (00:34 +0000)
committerSean Christopherson <seanjc@google.com>
Thu, 5 Mar 2026 00:08:47 +0000 (16:08 -0800)
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>
arch/x86/kvm/svm/nested.c

index d419fd516fa95c977d1caba9be9af41f8fd9a3a7..8c01916cb1549010e517810b6c38128f6d9da7e0 100644 (file)
@@ -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);