From nobody Thu Apr 2 06:27:04 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81F3F28030E; Tue, 3 Mar 2026 00:34:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772498074; cv=none; b=lNySvsH5+9Btjib3F1GJfkB6ppyQHMG7uHHvxx7YZRsFsHuZ553sRTJVFBTqr8NIj8I0pWpf7x9nDJYhZh6aU+G74CXDDWTlINwkmQeyHlaEsrr5MxZdwSvT4TINYIlwi6fO8rhxSqL0KRA6oFO8LnXj6+m60IEMxzwqo1NsT0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772498074; c=relaxed/simple; bh=L61GK69gSANIjEbBYSDrtFGraWl/zccYBK9YL7ZW+Co=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o2iIacOZxt3KkPf1paM8tbyePyxZ4AAozt3CGaZ2cBEhUx5agdfcWhMhbgb1zIVryAIlN2hVRB6nLtCu8+d3JLp4cbZmGWpbxxr1oPzE/le9DHrNolW51kaMICpjtn49Kx+ptc4Scbh75rCjujePRuXjVqT55s94ye+BbOvnDxU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l28aBkZh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l28aBkZh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2599DC19423; Tue, 3 Mar 2026 00:34:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772498074; bh=L61GK69gSANIjEbBYSDrtFGraWl/zccYBK9YL7ZW+Co=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l28aBkZh05RWk1S8bMutte38MJRFYC82VJ9njdcfujkvRLdTIJSWaf9BESBLokcIn VzTbfK8zjeLn5OehcJH4PrfBxyA0pVA7W6eDDj218rIsd+yxJulaKrjhukiCUCuPS+ BxXs78C0rDKvOWpYBBF5ow6PWiT1WWavHs68zp2F6O0D5SfTItx2iTraHIq/J2XrT9 UdA3g7NFq3OTkaY4FUsYIDOey0f8IUMrsHurJbLWX/f6uMahEx2LwDe4HFv6hE9d69 bAzT+tVuVdRp5T6JEVRjpAw+eTTS+XdHmo8PRXRdBL4UGLrl1NkYlh1GV87zFy5cTJ PDG5KKa9fRsMg== From: Yosry Ahmed To: Sean Christopherson Cc: Paolo Bonzini , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Yosry Ahmed , stable@vger.kernel.org Subject: [PATCH v7 07/26] KVM: nSVM: Refactor writing vmcb12 on nested #VMEXIT as a helper Date: Tue, 3 Mar 2026 00:34:01 +0000 Message-ID: <20260303003421.2185681-8-yosry@kernel.org> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog In-Reply-To: <20260303003421.2185681-1-yosry@kernel.org> References: <20260303003421.2185681-1-yosry@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Sean Christopherson Signed-off-by: Yosry Ahmed --- arch/x86/kvm/svm/nested.c | 77 ++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index d84af051f65bc..82a92501ee86a 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -1125,36 +1125,20 @@ void svm_copy_vmloadsave_state(struct vmcb *to_vmcb= , struct vmcb *from_vmcb) to_vmcb->save.sysenter_eip =3D from_vmcb->save.sysenter_eip; } =20 -int nested_svm_vmexit(struct vcpu_svm *svm) +static int nested_svm_vmexit_update_vmcb12(struct kvm_vcpu *vcpu) { - struct kvm_vcpu *vcpu =3D &svm->vcpu; - struct vmcb *vmcb01 =3D svm->vmcb01.ptr; + struct vcpu_svm *svm =3D to_svm(vcpu); struct vmcb *vmcb02 =3D svm->nested.vmcb02.ptr; - struct vmcb *vmcb12; struct kvm_host_map map; + struct vmcb *vmcb12; int rc; =20 rc =3D kvm_vcpu_map(vcpu, gpa_to_gfn(svm->nested.vmcb12_gpa), &map); - if (rc) { - if (rc =3D=3D -EINVAL) - kvm_inject_gp(vcpu, 0); - return 1; - } + if (rc) + return rc; =20 vmcb12 =3D map.hva; =20 - /* Exit Guest-Mode */ - leave_guest_mode(vcpu); - svm->nested.vmcb12_gpa =3D 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 =3D vmcb02->save.es; vmcb12->save.cs =3D vmcb02->save.cs; vmcb12->save.ss =3D vmcb02->save.ss; @@ -1191,10 +1175,48 @@ int nested_svm_vmexit(struct vcpu_svm *svm) if (guest_cpu_cap_has(vcpu, X86_FEATURE_NRIPS)) vmcb12->control.next_rip =3D vmcb02->control.next_rip; =20 + if (nested_vmcb12_has_lbrv(vcpu)) + svm_copy_lbrs(&vmcb12->save, &vmcb02->save); + vmcb12->control.int_ctl =3D svm->nested.ctl.int_ctl; vmcb12->control.event_inj =3D svm->nested.ctl.event_inj; vmcb12->control.event_inj_err =3D svm->nested.ctl.event_inj_err; =20 + 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 =3D &svm->vcpu; + struct vmcb *vmcb01 =3D svm->vmcb01.ptr; + struct vmcb *vmcb02 =3D svm->nested.vmcb02.ptr; + int rc; + + rc =3D nested_svm_vmexit_update_vmcb12(vcpu); + if (rc) { + if (rc =3D=3D -EINVAL) + kvm_inject_gp(vcpu, 0); + return 1; + } + + /* Exit Guest-Mode */ + leave_guest_mode(vcpu); + svm->nested.vmcb12_gpa =3D 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 =3D vmcb02->control.pause_filter_coun= t; vmcb_mark_dirty(vmcb01, VMCB_INTERCEPTS); @@ -1239,9 +1261,7 @@ int nested_svm_vmexit(struct vcpu_svm *svm) if (!nested_exit_on_intr(svm)) kvm_make_request(KVM_REQ_EVENT, &svm->vcpu); =20 - 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); } @@ -1297,15 +1317,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm) svm->vcpu.arch.dr7 =3D DR7_FIXED_1; kvm_update_dr7(&svm->vcpu); =20 - 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); =20 nested_svm_uninit_mmu_context(vcpu); --=20 2.53.0.473.g4a7958ca14-goog