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.)