On Tue, Jul 28, 2020 at 4:38 PM Babu Moger <babu.moger@xxxxxxx> wrote: > > Change intercept_cr to generic intercepts in vmcb_control_area. > Use the new __set_intercept, __clr_intercept and __is_intercept > where applicable. > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- > arch/x86/include/asm/svm.h | 42 ++++++++++++++++++++++++++++++++---------- > arch/x86/kvm/svm/nested.c | 26 +++++++++++++++++--------- > arch/x86/kvm/svm/svm.c | 4 ++-- > arch/x86/kvm/svm/svm.h | 6 +++--- > 4 files changed, 54 insertions(+), 24 deletions(-) > > diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h > index 8a1f5382a4ea..d4739f4eae63 100644 > --- a/arch/x86/include/asm/svm.h > +++ b/arch/x86/include/asm/svm.h > @@ -4,6 +4,37 @@ > > #include <uapi/asm/svm.h> > > +/* > + * VMCB Control Area intercept bits starting > + * at Byte offset 000h (Vector 0). > + */ > + > +enum vector_offset { > + CR_VECTOR = 0, > + MAX_VECTORS, > +}; > + > +enum { > + /* Byte offset 000h (Vector 0) */ > + INTERCEPT_CR0_READ = 0, > + INTERCEPT_CR1_READ, > + INTERCEPT_CR2_READ, > + INTERCEPT_CR3_READ, > + INTERCEPT_CR4_READ, > + INTERCEPT_CR5_READ, > + INTERCEPT_CR6_READ, > + INTERCEPT_CR7_READ, > + INTERCEPT_CR8_READ, > + INTERCEPT_CR0_WRITE = 16, > + INTERCEPT_CR1_WRITE, > + INTERCEPT_CR2_WRITE, > + INTERCEPT_CR3_WRITE, > + INTERCEPT_CR4_WRITE, > + INTERCEPT_CR5_WRITE, > + INTERCEPT_CR6_WRITE, > + INTERCEPT_CR7_WRITE, > + INTERCEPT_CR8_WRITE, > +}; > > enum { > INTERCEPT_INTR, > @@ -57,7 +88,7 @@ enum { > > > struct __attribute__ ((__packed__)) vmcb_control_area { > - u32 intercept_cr; > + u32 intercepts[MAX_VECTORS]; > u32 intercept_dr; > u32 intercept_exceptions; > u64 intercept; > @@ -240,15 +271,6 @@ struct __attribute__ ((__packed__)) vmcb { > #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK > #define SVM_SELECTOR_CODE_MASK (1 << 3) > > -#define INTERCEPT_CR0_READ 0 > -#define INTERCEPT_CR3_READ 3 > -#define INTERCEPT_CR4_READ 4 > -#define INTERCEPT_CR8_READ 8 > -#define INTERCEPT_CR0_WRITE (16 + 0) > -#define INTERCEPT_CR3_WRITE (16 + 3) > -#define INTERCEPT_CR4_WRITE (16 + 4) > -#define INTERCEPT_CR8_WRITE (16 + 8) > - > #define INTERCEPT_DR0_READ 0 > #define INTERCEPT_DR1_READ 1 > #define INTERCEPT_DR2_READ 2 > diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c > index 6bceafb19108..46f5c82d9b45 100644 > --- a/arch/x86/kvm/svm/nested.c > +++ b/arch/x86/kvm/svm/nested.c > @@ -105,6 +105,7 @@ static void nested_svm_uninit_mmu_context(struct kvm_vcpu *vcpu) > void recalc_intercepts(struct vcpu_svm *svm) > { > struct vmcb_control_area *c, *h, *g; > + unsigned int i; > > mark_dirty(svm->vmcb, VMCB_INTERCEPTS); > > @@ -117,15 +118,17 @@ void recalc_intercepts(struct vcpu_svm *svm) > > svm->nested.host_intercept_exceptions = h->intercept_exceptions; > > - c->intercept_cr = h->intercept_cr; > + 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; > > if (g->int_ctl & V_INTR_MASKING_MASK) { > /* We only want the cr8 intercept bits of L1 */ > - c->intercept_cr &= ~(1U << INTERCEPT_CR8_READ); > - c->intercept_cr &= ~(1U << INTERCEPT_CR8_WRITE); > + __clr_intercept(&c->intercepts, INTERCEPT_CR8_READ); > + __clr_intercept(&c->intercepts, INTERCEPT_CR8_WRITE); Why the direct calls to the __clr_intercept worker function? Can't these be calls to clr_cr_intercept()? Likewise throughout.