> -----Original Message----- > From: Jim Mattson <jmattson@xxxxxxxxxx> > Sent: Tuesday, July 28, 2020 6:59 PM > To: Moger, Babu <Babu.Moger@xxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>; Vitaly Kuznetsov > <vkuznets@xxxxxxxxxx>; Wanpeng Li <wanpengli@xxxxxxxxxxx>; Sean > Christopherson <sean.j.christopherson@xxxxxxxxx>; kvm list > <kvm@xxxxxxxxxxxxxxx>; Joerg Roedel <joro@xxxxxxxxxx>; the arch/x86 > maintainers <x86@xxxxxxxxxx>; LKML <linux-kernel@xxxxxxxxxxxxxxx>; Ingo > Molnar <mingo@xxxxxxxxxx>; Borislav Petkov <bp@xxxxxxxxx>; H . Peter Anvin > <hpa@xxxxxxxxx>; Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Subject: Re: [PATCH v3 03/11] KVM: SVM: Change intercept_dr to generic > intercepts > > On Tue, Jul 28, 2020 at 4:38 PM Babu Moger <babu.moger@xxxxxxx> wrote: > > > > Modify intercept_dr to generic intercepts in vmcb_control_area. > > Use generic __set_intercept, __clr_intercept and __is_intercept to > > set/clear/test the intercept_dr bits. > > > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > > --- > > arch/x86/include/asm/svm.h | 36 ++++++++++++++++++------------------ > > arch/x86/kvm/svm/nested.c | 6 +----- > > arch/x86/kvm/svm/svm.c | 4 ++-- > > arch/x86/kvm/svm/svm.h | 34 +++++++++++++++++----------------- > > 4 files changed, 38 insertions(+), 42 deletions(-) > > > > diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h > > index d4739f4eae63..ffc89d8e4fcb 100644 > > --- a/arch/x86/include/asm/svm.h > > +++ b/arch/x86/include/asm/svm.h > > @@ -11,6 +11,7 @@ > > > > enum vector_offset { > > CR_VECTOR = 0, > > + DR_VECTOR, > > MAX_VECTORS, > > }; > > > > @@ -34,6 +35,23 @@ enum { > > INTERCEPT_CR6_WRITE, > > INTERCEPT_CR7_WRITE, > > INTERCEPT_CR8_WRITE, > > + /* Byte offset 004h (Vector 1) */ > > + INTERCEPT_DR0_READ = 32, > > + INTERCEPT_DR1_READ, > > + INTERCEPT_DR2_READ, > > + INTERCEPT_DR3_READ, > > + INTERCEPT_DR4_READ, > > + INTERCEPT_DR5_READ, > > + INTERCEPT_DR6_READ, > > + INTERCEPT_DR7_READ, > > + INTERCEPT_DR0_WRITE = 48, > > + INTERCEPT_DR1_WRITE, > > + INTERCEPT_DR2_WRITE, > > + INTERCEPT_DR3_WRITE, > > + INTERCEPT_DR4_WRITE, > > + INTERCEPT_DR5_WRITE, > > + INTERCEPT_DR6_WRITE, > > + INTERCEPT_DR7_WRITE, > > }; > > > > enum { > > @@ -89,7 +107,6 @@ enum { > > > > struct __attribute__ ((__packed__)) vmcb_control_area { > > u32 intercepts[MAX_VECTORS]; > > - u32 intercept_dr; > > u32 intercept_exceptions; > > u64 intercept; > > u8 reserved_1[40]; > > @@ -271,23 +288,6 @@ struct __attribute__ ((__packed__)) vmcb { > > #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK #define > > SVM_SELECTOR_CODE_MASK (1 << 3) > > > > -#define INTERCEPT_DR0_READ 0 > > -#define INTERCEPT_DR1_READ 1 > > -#define INTERCEPT_DR2_READ 2 > > -#define INTERCEPT_DR3_READ 3 > > -#define INTERCEPT_DR4_READ 4 > > -#define INTERCEPT_DR5_READ 5 > > -#define INTERCEPT_DR6_READ 6 > > -#define INTERCEPT_DR7_READ 7 > > -#define INTERCEPT_DR0_WRITE (16 + 0) > > -#define INTERCEPT_DR1_WRITE (16 + 1) > > -#define INTERCEPT_DR2_WRITE (16 + 2) > > -#define INTERCEPT_DR3_WRITE (16 + 3) > > -#define INTERCEPT_DR4_WRITE (16 + 4) > > -#define INTERCEPT_DR5_WRITE (16 + 5) > > -#define INTERCEPT_DR6_WRITE (16 + 6) > > -#define INTERCEPT_DR7_WRITE (16 + 7) > > - > > #define SVM_EVTINJ_VEC_MASK 0xff > > > > #define SVM_EVTINJ_TYPE_SHIFT 8 > > diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c > > index 46f5c82d9b45..71ca89afb2a3 100644 > > --- a/arch/x86/kvm/svm/nested.c > > +++ b/arch/x86/kvm/svm/nested.c > > @@ -121,7 +121,6 @@ void recalc_intercepts(struct vcpu_svm *svm) > > for (i = 0; i < MAX_VECTORS; i++) > > c->intercepts[i] = h->intercepts[i]; > > > > - c->intercept_dr = h->intercept_dr; > > c->intercept_exceptions = h->intercept_exceptions; > > c->intercept = h->intercept; > > > > @@ -144,7 +143,6 @@ void recalc_intercepts(struct vcpu_svm *svm) > > for (i = 0; i < MAX_VECTORS; i++) > > c->intercepts[i] |= g->intercepts[i]; > > > > - c->intercept_dr |= g->intercept_dr; > > c->intercept_exceptions |= g->intercept_exceptions; > > c->intercept |= g->intercept; > > } > > @@ -157,7 +155,6 @@ static void copy_vmcb_control_area(struct > vmcb_control_area *dst, > > for (i = 0; i < MAX_VECTORS; i++) > > dst->intercepts[i] = from->intercepts[i]; > > > > - dst->intercept_dr = from->intercept_dr; > > dst->intercept_exceptions = from->intercept_exceptions; > > dst->intercept = from->intercept; > > dst->iopm_base_pa = from->iopm_base_pa; > > @@ -717,8 +714,7 @@ static int nested_svm_intercept(struct vcpu_svm > *svm) > > break; > > } > > case SVM_EXIT_READ_DR0 ... SVM_EXIT_WRITE_DR7: { > > - u32 bit = 1U << (exit_code - SVM_EXIT_READ_DR0); > > - if (svm->nested.ctl.intercept_dr & bit) > > + if (__is_intercept(&svm->nested.ctl.intercepts, > > + exit_code)) > > Can I assume that all of these __<function> calls will become <function> calls > when the grand unification is done? (Maybe I should just look ahead.) There are two types of calls here. 1. Calls like set_cr_intercept, clr_cr_intercept, set_dr_intercept, clr_dr_intercept, set_exception_intercept, clr_exception_intercept. These calls pass svm data structure. I replaced these calls with either set_intercept or clr_intercept because we have combined all the intercept vectors into one 32 bit array. 2. Some calls sets or clears the bit directly like c->intercept_cr &= ~(1U << INTERCEPT_CR8_READ); Replaced these with __clr_intercept or __set_intercepts. There is a scope to make all these calls set_intercept or clr_intercept. These calls use another call get_host_vmcb to get the address. We can take that up as next cleanup.