Skip to content

Commit d8c7456

Browse files
yosrym93opsiff
authored andcommitted
KVM: SVM: Introduce svm_recalc_lbr_msr_intercepts()
Introduce a helper updating the intercepts for LBR MSRs, similar to the one introduced upstream by commit 160f143 ("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> (cherry picked from commit 991d961055d0378fa8bb2a2026d713b0214bfcad) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent 1a22986 commit d8c7456

1 file changed

Lines changed: 21 additions & 11 deletions

File tree

arch/x86/kvm/svm/svm.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,18 +1028,31 @@ void svm_copy_lbrs(struct vmcb *to_vmcb, struct vmcb *from_vmcb)
10281028
vmcb_mark_dirty(to_vmcb, VMCB_LBR);
10291029
}
10301030

1031-
void svm_enable_lbrv(struct kvm_vcpu *vcpu)
1031+
static void svm_recalc_lbr_msr_intercepts(struct kvm_vcpu *vcpu)
10321032
{
10331033
struct vcpu_svm *svm = to_svm(vcpu);
1034+
bool intercept = !(svm->vmcb->control.virt_ext & LBR_CTL_ENABLE_MASK);
10341035

1035-
svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
1036-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 1, 1);
1037-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 1, 1);
1038-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 1, 1);
1039-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1);
1036+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP,
1037+
!intercept, !intercept);
1038+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP,
1039+
!intercept, !intercept);
1040+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP,
1041+
!intercept, !intercept);
1042+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP,
1043+
!intercept, !intercept);
10401044

10411045
if (sev_es_guest(vcpu->kvm))
1042-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR, 1, 1);
1046+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR,
1047+
!intercept, !intercept);
1048+
}
1049+
1050+
void svm_enable_lbrv(struct kvm_vcpu *vcpu)
1051+
{
1052+
struct vcpu_svm *svm = to_svm(vcpu);
1053+
1054+
svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
1055+
svm_recalc_lbr_msr_intercepts(vcpu);
10431056

10441057
/* Move the LBR msrs to the vmcb02 so that the guest can see them. */
10451058
if (is_guest_mode(vcpu))
@@ -1053,10 +1066,7 @@ static void svm_disable_lbrv(struct kvm_vcpu *vcpu)
10531066
KVM_BUG_ON(sev_es_guest(vcpu->kvm), vcpu->kvm);
10541067

10551068
svm->vmcb->control.virt_ext &= ~LBR_CTL_ENABLE_MASK;
1056-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 0, 0);
1057-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 0, 0);
1058-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 0, 0);
1059-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 0, 0);
1069+
svm_recalc_lbr_msr_intercepts(vcpu);
10601070

10611071
/*
10621072
* Move the LBR msrs back to the vmcb01 to avoid copying them

0 commit comments

Comments
 (0)