On Thu, Sep 28, 2017 at 03:09:48PM +0100, Will Deacon wrote: > SPE is part of the v8.2 architecture, so move its system register and > field definitions into sysreg.h and the new PSB barrier into barrier.h > > Finally, move KVM over to using the generic definitions so that it > doesn't have to open-code its own versions. > > Signed-off-by: Will Deacon <will.dea...@arm.com>
Thanks for splitting this out. FWIW: Acked-by: Mark Rutland <mark.rutl...@arm.com> Mark. > --- > arch/arm64/include/asm/barrier.h | 2 + > arch/arm64/include/asm/sysreg.h | 93 > ++++++++++++++++++++++++++++++++++++++++ > arch/arm64/kvm/hyp/debug-sr.c | 24 +++-------- > 3 files changed, 102 insertions(+), 17 deletions(-) > > diff --git a/arch/arm64/include/asm/barrier.h > b/arch/arm64/include/asm/barrier.h > index 0fe7e43b7fbc..77651c49ef44 100644 > --- a/arch/arm64/include/asm/barrier.h > +++ b/arch/arm64/include/asm/barrier.h > @@ -31,6 +31,8 @@ > #define dmb(opt) asm volatile("dmb " #opt : : : "memory") > #define dsb(opt) asm volatile("dsb " #opt : : : "memory") > > +#define psb_csync() asm volatile("hint #17" : : : "memory") > + > #define mb() dsb(sy) > #define rmb() dsb(ld) > #define wmb() dsb(st) > diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h > index f707fed5886f..94b7a0d42aad 100644 > --- a/arch/arm64/include/asm/sysreg.h > +++ b/arch/arm64/include/asm/sysreg.h > @@ -172,6 +172,99 @@ > #define SYS_FAR_EL1 sys_reg(3, 0, 6, 0, 0) > #define SYS_PAR_EL1 sys_reg(3, 0, 7, 4, 0) > > +/*** Statistical Profiling Extension ***/ > +/* ID registers */ > +#define SYS_PMSIDR_EL1 sys_reg(3, 0, 9, 9, 7) > +#define SYS_PMSIDR_EL1_FE_SHIFT 0 > +#define SYS_PMSIDR_EL1_FT_SHIFT 1 > +#define SYS_PMSIDR_EL1_FL_SHIFT 2 > +#define SYS_PMSIDR_EL1_ARCHINST_SHIFT 3 > +#define SYS_PMSIDR_EL1_LDS_SHIFT 4 > +#define SYS_PMSIDR_EL1_ERND_SHIFT 5 > +#define SYS_PMSIDR_EL1_INTERVAL_SHIFT 8 > +#define SYS_PMSIDR_EL1_INTERVAL_MASK 0xfUL > +#define SYS_PMSIDR_EL1_MAXSIZE_SHIFT 12 > +#define SYS_PMSIDR_EL1_MAXSIZE_MASK 0xfUL > +#define SYS_PMSIDR_EL1_COUNTSIZE_SHIFT 16 > +#define SYS_PMSIDR_EL1_COUNTSIZE_MASK 0xfUL > + > +#define SYS_PMBIDR_EL1 sys_reg(3, 0, 9, 10, 7) > +#define SYS_PMBIDR_EL1_ALIGN_SHIFT 0 > +#define SYS_PMBIDR_EL1_ALIGN_MASK 0xfU > +#define SYS_PMBIDR_EL1_P_SHIFT 4 > +#define SYS_PMBIDR_EL1_F_SHIFT 5 > + > +/* Sampling controls */ > +#define SYS_PMSCR_EL1 sys_reg(3, 0, 9, 9, 0) > +#define SYS_PMSCR_EL1_E0SPE_SHIFT 0 > +#define SYS_PMSCR_EL1_E1SPE_SHIFT 1 > +#define SYS_PMSCR_EL1_CX_SHIFT 3 > +#define SYS_PMSCR_EL1_PA_SHIFT 4 > +#define SYS_PMSCR_EL1_TS_SHIFT 5 > +#define SYS_PMSCR_EL1_PCT_SHIFT 6 > + > +#define SYS_PMSCR_EL2 sys_reg(3, 4, 9, 9, 0) > +#define SYS_PMSCR_EL2_E0HSPE_SHIFT 0 > +#define SYS_PMSCR_EL2_E2SPE_SHIFT 1 > +#define SYS_PMSCR_EL2_CX_SHIFT 3 > +#define SYS_PMSCR_EL2_PA_SHIFT 4 > +#define SYS_PMSCR_EL2_TS_SHIFT 5 > +#define SYS_PMSCR_EL2_PCT_SHIFT 6 > + > +#define SYS_PMSICR_EL1 sys_reg(3, 0, 9, 9, 2) > + > +#define SYS_PMSIRR_EL1 sys_reg(3, 0, 9, 9, 3) > +#define SYS_PMSIRR_EL1_RND_SHIFT 0 > +#define SYS_PMSIRR_EL1_INTERVAL_SHIFT 8 > +#define SYS_PMSIRR_EL1_INTERVAL_MASK 0xffffffUL > + > +/* Filtering controls */ > +#define SYS_PMSFCR_EL1 sys_reg(3, 0, 9, 9, 4) > +#define SYS_PMSFCR_EL1_FE_SHIFT 0 > +#define SYS_PMSFCR_EL1_FT_SHIFT 1 > +#define SYS_PMSFCR_EL1_FL_SHIFT 2 > +#define SYS_PMSFCR_EL1_B_SHIFT 16 > +#define SYS_PMSFCR_EL1_LD_SHIFT 17 > +#define SYS_PMSFCR_EL1_ST_SHIFT 18 > + > +#define SYS_PMSEVFR_EL1 sys_reg(3, 0, 9, 9, 5) > +#define SYS_PMSEVFR_EL1_RES0 0x0000ffff00ff0f55UL > + > +#define SYS_PMSLATFR_EL1 sys_reg(3, 0, 9, 9, 6) > +#define SYS_PMSLATFR_EL1_MINLAT_SHIFT 0 > + > +/* Buffer controls */ > +#define SYS_PMBLIMITR_EL1 sys_reg(3, 0, 9, 10, 0) > +#define SYS_PMBLIMITR_EL1_E_SHIFT 0 > +#define SYS_PMBLIMITR_EL1_FM_SHIFT 1 > +#define SYS_PMBLIMITR_EL1_FM_MASK 0x3UL > +#define SYS_PMBLIMITR_EL1_FM_STOP_IRQ (0 << > SYS_PMBLIMITR_EL1_FM_SHIFT) > + > +#define SYS_PMBPTR_EL1 sys_reg(3, 0, 9, 10, 1) > + > +/* Buffer error reporting */ > +#define SYS_PMBSR_EL1 sys_reg(3, 0, 9, 10, 3) > +#define SYS_PMBSR_EL1_COLL_SHIFT 16 > +#define SYS_PMBSR_EL1_S_SHIFT 17 > +#define SYS_PMBSR_EL1_EA_SHIFT 18 > +#define SYS_PMBSR_EL1_DL_SHIFT 19 > +#define SYS_PMBSR_EL1_EC_SHIFT 26 > +#define SYS_PMBSR_EL1_EC_MASK 0x3fUL > + > +#define SYS_PMBSR_EL1_EC_BUF (0x0UL << SYS_PMBSR_EL1_EC_SHIFT) > +#define SYS_PMBSR_EL1_EC_FAULT_S1 (0x24UL << SYS_PMBSR_EL1_EC_SHIFT) > +#define SYS_PMBSR_EL1_EC_FAULT_S2 (0x25UL << SYS_PMBSR_EL1_EC_SHIFT) > + > +#define SYS_PMBSR_EL1_FAULT_FSC_SHIFT 0 > +#define SYS_PMBSR_EL1_FAULT_FSC_MASK 0x3fUL > + > +#define SYS_PMBSR_EL1_BUF_BSC_SHIFT 0 > +#define SYS_PMBSR_EL1_BUF_BSC_MASK 0x3fUL > + > +#define SYS_PMBSR_EL1_BUF_BSC_FULL (0x1UL << SYS_PMBSR_EL1_BUF_BSC_SHIFT) > + > +/*** End of Statistical Profiling Extension ***/ > + > #define SYS_PMINTENSET_EL1 sys_reg(3, 0, 9, 14, 1) > #define SYS_PMINTENCLR_EL1 sys_reg(3, 0, 9, 14, 2) > > diff --git a/arch/arm64/kvm/hyp/debug-sr.c b/arch/arm64/kvm/hyp/debug-sr.c > index f5154ed3da6c..321c9c05dd9e 100644 > --- a/arch/arm64/kvm/hyp/debug-sr.c > +++ b/arch/arm64/kvm/hyp/debug-sr.c > @@ -65,16 +65,6 @@ > default: write_debug(ptr[0], reg, 0); \ > } > > -#define PMSCR_EL1 sys_reg(3, 0, 9, 9, 0) > - > -#define PMBLIMITR_EL1 sys_reg(3, 0, 9, 10, 0) > -#define PMBLIMITR_EL1_E BIT(0) > - > -#define PMBIDR_EL1 sys_reg(3, 0, 9, 10, 7) > -#define PMBIDR_EL1_P BIT(4) > - > -#define psb_csync() asm volatile("hint #17") > - > static void __hyp_text __debug_save_spe_vhe(u64 *pmscr_el1) > { > /* The vcpu can run. but it can't hide. */ > @@ -90,18 +80,18 @@ static void __hyp_text __debug_save_spe_nvhe(u64 > *pmscr_el1) > return; > > /* Yes; is it owned by EL3? */ > - reg = read_sysreg_s(PMBIDR_EL1); > - if (reg & PMBIDR_EL1_P) > + reg = read_sysreg_s(SYS_PMBIDR_EL1); > + if (reg & BIT(SYS_PMBIDR_EL1_P_SHIFT)) > return; > > /* No; is the host actually using the thing? */ > - reg = read_sysreg_s(PMBLIMITR_EL1); > - if (!(reg & PMBLIMITR_EL1_E)) > + reg = read_sysreg_s(SYS_PMBLIMITR_EL1); > + if (!(reg & BIT(SYS_PMBLIMITR_EL1_E_SHIFT))) > return; > > /* Yes; save the control register and disable data generation */ > - *pmscr_el1 = read_sysreg_s(PMSCR_EL1); > - write_sysreg_s(0, PMSCR_EL1); > + *pmscr_el1 = read_sysreg_s(SYS_PMSCR_EL1); > + write_sysreg_s(0, SYS_PMSCR_EL1); > isb(); > > /* Now drain all buffered data to memory */ > @@ -122,7 +112,7 @@ static void __hyp_text __debug_restore_spe(u64 pmscr_el1) > isb(); > > /* Re-enable data generation */ > - write_sysreg_s(pmscr_el1, PMSCR_EL1); > + write_sysreg_s(pmscr_el1, SYS_PMSCR_EL1); > } > > void __hyp_text __debug_save_state(struct kvm_vcpu *vcpu, > -- > 2.1.4 >