From: Sean Christopherson <seanjc@google.com>
To: Yosry Ahmed <yosry@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org, Jim Mattson <jmattson@google.com>
Subject: Re: [PATCH v7 03/26] KVM: SVM: Add missing save/restore handling of LBR MSRs
Date: Tue, 3 Mar 2026 16:44:18 -0800 [thread overview]
Message-ID: <aaeAYv2i7wjGahY4@google.com> (raw)
In-Reply-To: <CAO9r8zMDQkHAMKVewDgvH6_WAHo5eL4=Xwf7h=87JPOJPYQAFQ@mail.gmail.com>
On Tue, Mar 03, 2026, Yosry Ahmed wrote:
> > > diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
> > So all in all (not yet tested), this? If this is the only issue in the series,
> > or at least in the stable@ part of the series, no need for a v8 (I've obviously
> > already done the fixup).
>
> Looks good with a minor nit below (could be a followup).
>
> > @@ -3075,6 +3075,38 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
> > vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
> > svm_update_lbrv(vcpu);
> > break;
> > + case MSR_IA32_LASTBRANCHFROMIP:
> > + if (!lbrv)
> > + return KVM_MSR_RET_UNSUPPORTED;
> > + if (!msr->host_initiated)
> > + return 1;
> > + svm->vmcb->save.br_from = data;
> > + vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
> > + break;
> > + case MSR_IA32_LASTBRANCHTOIP:
> > + if (!lbrv)
> > + return KVM_MSR_RET_UNSUPPORTED;
> > + if (!msr->host_initiated)
> > + return 1;
> > + svm->vmcb->save.br_to = data;
> > + vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
> > + break;
> > + case MSR_IA32_LASTINTFROMIP:
> > + if (!lbrv)
> > + return KVM_MSR_RET_UNSUPPORTED;
> > + if (!msr->host_initiated)
> > + return 1;
> > + svm->vmcb->save.last_excp_from = data;
> > + vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
> > + break;
> > + case MSR_IA32_LASTINTTOIP:
> > + if (!lbrv)
> > + return KVM_MSR_RET_UNSUPPORTED;
> > + if (!msr->host_initiated)
> > + return 1;
> > + svm->vmcb->save.last_excp_to = data;
> > + vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
> > + break;
>
> There's so much repeated code here.
Ya :-(
> We can use gotos to share code, but I am not sure if that's a strict
> improvement. We can also use a helper, perhaps?
Where's your sense of adventure?
case MSR_IA32_LASTBRANCHFROMIP:
case MSR_IA32_LASTBRANCHTOIP:
case MSR_IA32_LASTINTFROMIP:
case MSR_IA32_LASTINTTOIP:
if (!lbrv)
return KVM_MSR_RET_UNSUPPORTED;
if (!msr->host_initiated)
return 1;
*(&svm->vmcb->save.br_from + (ecx - MSR_IA32_LASTBRANCHFROMIP)) = data;
vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
break;
Jokes aside, maybe this, to dedup get() at the same time?
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 68b747a94294..f1811105e89f 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -2720,6 +2720,23 @@ static int svm_get_feature_msr(u32 msr, u64 *data)
return 0;
}
+static __always_inline u64 *svm_vmcb_lbr(struct vcpu_svm *svm, u32 msr)
+{
+ switch (msr) {
+ case MSR_IA32_LASTBRANCHFROMIP:
+ return &svm->vmcb->save.br_from;
+ case MSR_IA32_LASTBRANCHTOIP:
+ return &svm->vmcb->save.br_to;
+ case MSR_IA32_LASTINTFROMIP:
+ return &svm->vmcb->save.last_excp_from;
+ case MSR_IA32_LASTINTTOIP:
+ return &svm->vmcb->save.last_excp_to;
+ default:
+ break;
+ }
+ BUILD_BUG();
+}
+
static bool sev_es_prevent_msr_access(struct kvm_vcpu *vcpu,
struct msr_data *msr_info)
{
@@ -2838,16 +2855,10 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
msr_info->data = lbrv ? svm->vmcb->save.dbgctl : 0;
break;
case MSR_IA32_LASTBRANCHFROMIP:
- msr_info->data = lbrv ? svm->vmcb->save.br_from : 0;
- break;
case MSR_IA32_LASTBRANCHTOIP:
- msr_info->data = lbrv ? svm->vmcb->save.br_to : 0;
- break;
case MSR_IA32_LASTINTFROMIP:
- msr_info->data = lbrv ? svm->vmcb->save.last_excp_from : 0;
- break;
case MSR_IA32_LASTINTTOIP:
- msr_info->data = lbrv ? svm->vmcb->save.last_excp_to : 0;
+ msr_info->data = lbrv ? *svm_vmcb_lbr(svm, msr_info->index) : 0;
break;
case MSR_VM_HSAVE_PA:
msr_info->data = svm->nested.hsave_msr;
@@ -3122,35 +3133,14 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
svm_update_lbrv(vcpu);
break;
case MSR_IA32_LASTBRANCHFROMIP:
- if (!lbrv)
- return KVM_MSR_RET_UNSUPPORTED;
- if (!msr->host_initiated)
- return 1;
- svm->vmcb->save.br_from = data;
- vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
- break;
case MSR_IA32_LASTBRANCHTOIP:
- if (!lbrv)
- return KVM_MSR_RET_UNSUPPORTED;
- if (!msr->host_initiated)
- return 1;
- svm->vmcb->save.br_to = data;
- vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
- break;
case MSR_IA32_LASTINTFROMIP:
- if (!lbrv)
- return KVM_MSR_RET_UNSUPPORTED;
- if (!msr->host_initiated)
- return 1;
- svm->vmcb->save.last_excp_from = data;
- vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
- break;
case MSR_IA32_LASTINTTOIP:
if (!lbrv)
return KVM_MSR_RET_UNSUPPORTED;
if (!msr->host_initiated)
return 1;
- svm->vmcb->save.last_excp_to = data;
+ *svm_vmcb_lbr(svm, ecx) = data;
vmcb_mark_dirty(svm->vmcb, VMCB_LBR);
break;
case MSR_VM_HSAVE_PA:
next prev parent reply other threads:[~2026-03-04 0:44 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-03 0:33 [PATCH v7 00/26] Nested SVM fixes, cleanups, and hardening Yosry Ahmed
2026-03-03 0:33 ` [PATCH v7 01/26] KVM: nSVM: Avoid clearing VMCB_LBR in vmcb12 Yosry Ahmed
2026-03-03 0:33 ` [PATCH v7 02/26] KVM: SVM: Switch svm_copy_lbrs() to a macro Yosry Ahmed
2026-03-03 0:33 ` [PATCH v7 03/26] KVM: SVM: Add missing save/restore handling of LBR MSRs Yosry Ahmed
2026-03-03 16:37 ` Sean Christopherson
2026-03-03 19:14 ` Yosry Ahmed
2026-03-04 0:44 ` Sean Christopherson [this message]
2026-03-04 0:48 ` Yosry Ahmed
2026-03-03 0:33 ` [PATCH v7 04/26] KVM: selftests: Add a test for LBR save/restore (ft. nested) Yosry Ahmed
2026-03-03 0:33 ` [PATCH v7 05/26] KVM: nSVM: Always inject a #GP if mapping VMCB12 fails on nested VMRUN Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 06/26] KVM: nSVM: Refactor checking LBRV enablement in vmcb12 into a helper Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 07/26] KVM: nSVM: Refactor writing vmcb12 on nested #VMEXIT as " Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 08/26] KVM: nSVM: Triple fault if mapping VMCB12 fails on nested #VMEXIT Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 09/26] KVM: nSVM: Triple fault if restore host CR3 " Yosry Ahmed
2026-03-03 16:49 ` Sean Christopherson
2026-03-03 19:15 ` Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 10/26] KVM: nSVM: Clear GIF on nested #VMEXIT(INVALID) Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 11/26] KVM: nSVM: Clear EVENTINJ fields in vmcb12 on nested #VMEXIT Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 12/26] KVM: nSVM: Clear tracking of L1->L2 NMI and soft IRQ " Yosry Ahmed
2026-03-03 16:50 ` Sean Christopherson
2026-03-03 19:15 ` Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 13/26] KVM: nSVM: Drop nested_vmcb_check_{save/control}() wrappers Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 14/26] KVM: nSVM: Drop the non-architectural consistency check for NP_ENABLE Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 15/26] KVM: nSVM: Add missing consistency check for nCR3 validity Yosry Ahmed
2026-03-03 16:56 ` Sean Christopherson
2026-03-03 19:17 ` Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 16/26] KVM: nSVM: Add missing consistency check for EFER, CR0, CR4, and CS Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 17/26] KVM: nSVM: Add missing consistency check for EVENTINJ Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 18/26] KVM: SVM: Rename vmcb->nested_ctl to vmcb->misc_ctl Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 19/26] KVM: SVM: Rename vmcb->virt_ext to vmcb->misc_ctl2 Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 20/26] KVM: nSVM: Cache all used fields from VMCB12 Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 21/26] KVM: nSVM: Restrict mapping vmcb12 on nested VMRUN Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 22/26] KVM: nSVM: Use PAGE_MASK to drop lower bits of bitmap GPAs from vmcb12 Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 23/26] KVM: nSVM: Sanitize TLB_CONTROL field when copying " Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 24/26] KVM: nSVM: Sanitize INT/EVENTINJ fields " Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 25/26] KVM: nSVM: Only copy SVM_MISC_ENABLE_NP from VMCB01's misc_ctl Yosry Ahmed
2026-03-03 0:34 ` [PATCH v7 26/26] KVM: selftest: Add a selftest for VMRUN/#VMEXIT with unmappable vmcb12 Yosry Ahmed
2026-03-05 22:30 ` Jim Mattson
2026-03-05 22:52 ` Yosry Ahmed
2026-03-06 0:05 ` Jim Mattson
2026-03-06 0:40 ` Yosry Ahmed
2026-03-06 1:17 ` Jim Mattson
2026-03-06 1:39 ` Sean Christopherson
2026-03-06 1:46 ` Jim Mattson
2026-03-06 15:52 ` Yosry Ahmed
2026-03-06 17:54 ` Yosry Ahmed
2026-03-06 22:15 ` Jim Mattson
2026-03-06 22:35 ` Yosry Ahmed
2026-03-06 16:09 ` Yosry Ahmed
2026-03-06 16:35 ` Sean Christopherson
2026-03-06 17:25 ` Yosry Ahmed
2026-03-05 17:08 ` [PATCH v7 00/26] Nested SVM fixes, cleanups, and hardening Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aaeAYv2i7wjGahY4@google.com \
--to=seanjc@google.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=stable@vger.kernel.org \
--cc=yosry@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.