Skip to content

Commit c2690b5

Browse files
aiksean-jc
authored andcommitted
KVM: SVM/SEV/SEV-ES: Rework intercepts
Currently SVM setup is done sequentially in init_vmcb() -> sev_init_vmcb() -> sev_es_init_vmcb() and tries keeping SVM/SEV/SEV-ES bits separated. One of the exceptions is DR intercepts which is for SEV-ES before sev_es_init_vmcb() runs. Move the SEV-ES intercept setup to sev_es_init_vmcb(). From now on set_dr_intercepts()/clr_dr_intercepts() handle SVM/SEV only. No functional change intended. Suggested-by: Sean Christopherson <[email protected]> Signed-off-by: Alexey Kardashevskiy <[email protected]> Reviewed-by: Santosh Shukla <[email protected]> Reviewed-by: Tom Lendacky <[email protected]> Link: https://lore.kernel.org/r/[email protected] [sean: drop comment about intercepting DR7] Signed-off-by: Sean Christopherson <[email protected]>
1 parent 2837dd0 commit c2690b5

File tree

2 files changed

+20
-23
lines changed

2 files changed

+20
-23
lines changed

arch/x86/kvm/svm/sev.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2951,6 +2951,7 @@ int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in)
29512951

29522952
static void sev_es_init_vmcb(struct vcpu_svm *svm)
29532953
{
2954+
struct vmcb *vmcb = svm->vmcb01.ptr;
29542955
struct kvm_vcpu *vcpu = &svm->vcpu;
29552956

29562957
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ES_ENABLE;
@@ -2979,6 +2980,11 @@ static void sev_es_init_vmcb(struct vcpu_svm *svm)
29792980
svm_set_intercept(svm, TRAP_CR4_WRITE);
29802981
svm_set_intercept(svm, TRAP_CR8_WRITE);
29812982

2983+
vmcb->control.intercepts[INTERCEPT_DR] = 0;
2984+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_READ);
2985+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_WRITE);
2986+
recalc_intercepts(svm);
2987+
29822988
/* Can't intercept XSETBV, HV can't modify XCR0 directly */
29832989
svm_clr_intercept(svm, INTERCEPT_XSETBV);
29842990

arch/x86/kvm/svm/svm.c

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -681,23 +681,20 @@ static void set_dr_intercepts(struct vcpu_svm *svm)
681681
{
682682
struct vmcb *vmcb = svm->vmcb01.ptr;
683683

684-
if (!sev_es_guest(svm->vcpu.kvm)) {
685-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR0_READ);
686-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR1_READ);
687-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR2_READ);
688-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR3_READ);
689-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR4_READ);
690-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR5_READ);
691-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR6_READ);
692-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR0_WRITE);
693-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR1_WRITE);
694-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR2_WRITE);
695-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR3_WRITE);
696-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR4_WRITE);
697-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR5_WRITE);
698-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR6_WRITE);
699-
}
700-
684+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR0_READ);
685+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR1_READ);
686+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR2_READ);
687+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR3_READ);
688+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR4_READ);
689+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR5_READ);
690+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR6_READ);
691+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR0_WRITE);
692+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR1_WRITE);
693+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR2_WRITE);
694+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR3_WRITE);
695+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR4_WRITE);
696+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR5_WRITE);
697+
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR6_WRITE);
701698
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_READ);
702699
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_WRITE);
703700

@@ -710,12 +707,6 @@ static void clr_dr_intercepts(struct vcpu_svm *svm)
710707

711708
vmcb->control.intercepts[INTERCEPT_DR] = 0;
712709

713-
/* DR7 access must remain intercepted for an SEV-ES guest */
714-
if (sev_es_guest(svm->vcpu.kvm)) {
715-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_READ);
716-
vmcb_set_intercept(&vmcb->control, INTERCEPT_DR7_WRITE);
717-
}
718-
719710
recalc_intercepts(svm);
720711
}
721712

0 commit comments

Comments
 (0)