Skip to content

Commit d8a64e5

Browse files
yosrym93gregkh
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>
1 parent 592db83 commit d8a64e5

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
@@ -995,18 +995,31 @@ void svm_copy_lbrs(struct vmcb *to_vmcb, struct vmcb *from_vmcb)
995995
vmcb_mark_dirty(to_vmcb, VMCB_LBR);
996996
}
997997

998-
void svm_enable_lbrv(struct kvm_vcpu *vcpu)
998+
static void svm_recalc_lbr_msr_intercepts(struct kvm_vcpu *vcpu)
999999
{
10001000
struct vcpu_svm *svm = to_svm(vcpu);
1001+
bool intercept = !(svm->vmcb->control.virt_ext & LBR_CTL_ENABLE_MASK);
10011002

1002-
svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
1003-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 1, 1);
1004-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 1, 1);
1005-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 1, 1);
1006-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1);
1003+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP,
1004+
!intercept, !intercept);
1005+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP,
1006+
!intercept, !intercept);
1007+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP,
1008+
!intercept, !intercept);
1009+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP,
1010+
!intercept, !intercept);
10071011

10081012
if (sev_es_guest(vcpu->kvm))
1009-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR, 1, 1);
1013+
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_DEBUGCTLMSR,
1014+
!intercept, !intercept);
1015+
}
1016+
1017+
void svm_enable_lbrv(struct kvm_vcpu *vcpu)
1018+
{
1019+
struct vcpu_svm *svm = to_svm(vcpu);
1020+
1021+
svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK;
1022+
svm_recalc_lbr_msr_intercepts(vcpu);
10101023

10111024
/* Move the LBR msrs to the vmcb02 so that the guest can see them. */
10121025
if (is_guest_mode(vcpu))
@@ -1020,10 +1033,7 @@ static void svm_disable_lbrv(struct kvm_vcpu *vcpu)
10201033
KVM_BUG_ON(sev_es_guest(vcpu->kvm), vcpu->kvm);
10211034

10221035
svm->vmcb->control.virt_ext &= ~LBR_CTL_ENABLE_MASK;
1023-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHFROMIP, 0, 0);
1024-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 0, 0);
1025-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 0, 0);
1026-
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 0, 0);
1036+
svm_recalc_lbr_msr_intercepts(vcpu);
10271037

10281038
/*
10291039
* Move the LBR msrs back to the vmcb01 to avoid copying them

0 commit comments

Comments
 (0)