]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: SVM: Introduce svm_recalc_lbr_msr_intercepts()
authorYosry Ahmed <yosry.ahmed@linux.dev>
Thu, 20 Nov 2025 23:39:32 +0000 (23:39 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 6 Dec 2025 21:25:02 +0000 (06:25 +0900)
Introduce a helper updating the intercepts for LBR MSRs, similar to the
one introduced upstream by commit 160f143cc131 ("KVM: SVM: Manually
recalc all MSR intercepts on userspace MSR filter change"). The main
difference is that this version uses set_msr_interception(), which has
inverted polarity compared to svm_set_intercept_for_msr().

This is intended to simplify incoming backports. No functional changes
intended.

Signed-off-by: Yosry Ahmed <yosry.ahmed@linux.dev>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/svm/svm.c

index e4b68bafcdac670e780ac64daf59573819568623..1e1210e5ef45dec3b2b456d1942cbb8576567192 100644 (file)
@@ -995,18 +995,31 @@ void svm_copy_lbrs(struct vmcb *to_vmcb, struct vmcb *from_vmcb)
        vmcb_mark_dirty(to_vmcb, VMCB_LBR);
 }
 
-void svm_enable_lbrv(struct kvm_vcpu *vcpu)
+static void svm_recalc_lbr_msr_intercepts(struct kvm_vcpu *vcpu)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
+       bool intercept = !(svm->vmcb->control.virt_ext & LBR_CTL_ENABLE_MASK);
 
-       svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 1, 1);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 1, 1);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 1, 1);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1);
+       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP,
+                            !intercept, !intercept);
+       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP,
+                            !intercept, !intercept);
+       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP,
+                            !intercept, !intercept);
+       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP,
+                            !intercept, !intercept);
 
        if (sev_es_guest(vcpu->kvm))
-               set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR, 1, 1);
+               set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR,
+                                    !intercept, !intercept);
+}
+
+void svm_enable_lbrv(struct kvm_vcpu *vcpu)
+{
+       struct vcpu_svm *svm = to_svm(vcpu);
+
+       svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
+       svm_recalc_lbr_msr_intercepts(vcpu);
 
        /* Move the LBR msrs to the vmcb02 so that the guest can see them. */
        if (is_guest_mode(vcpu))
@@ -1020,10 +1033,7 @@ static void svm_disable_lbrv(struct kvm_vcpu *vcpu)
        KVM_BUG_ON(sev_es_guest(vcpu->kvm), vcpu->kvm);
 
        svm->vmcb->control.virt_ext &= ~LBR_CTL_ENABLE_MASK;
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 0, 0);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 0, 0);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 0, 0);
-       set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 0, 0);
+       svm_recalc_lbr_msr_intercepts(vcpu);
 
        /*
         * Move the LBR msrs back to the vmcb01 to avoid copying them