> Date: Thu, 13 Jul 2017 15:49:03 +0300 > From: Artturi Alm <artturi....@gmail.com> > > On Sat, Jul 01, 2017 at 10:53:14AM +0300, Artturi Alm wrote: > > Hi, > > > > just in case i didn't make it clear what it is for, here's diff "fixing" > > current uses below, compile-tested. > > > > -Artturi > > > > Hi, > > ping? > Noone up for bikeshedding, or seen useless/worse than handcrafting? > I think this would alleviate from some of the complementary commenting, > regarding the CP15 reg usage, that is currently somewhat of necessity.
I'm not sure myself if doing something like this is actually an improvement. > > diff --git a/sys/arch/arm/arm/cpufunc.c b/sys/arch/arm/arm/cpufunc.c > > index c91108e7066..fcb56627af7 100644 > > --- a/sys/arch/arm/arm/cpufunc.c > > +++ b/sys/arch/arm/arm/cpufunc.c > > @@ -55,6 +55,7 @@ > > #include <machine/pmap.h> > > #include <arm/cpuconf.h> > > #include <arm/cpufunc.h> > > +#include <arm/sysreg.h> > > > > #if defined(PERFCTRS) > > struct arm_pmc_funcs *arm_pmc; > > @@ -176,8 +177,7 @@ arm_get_cachetype_cp15v7(void) > > uint32_t sel, level; > > > > /* CTR - Cache Type Register */ > > - __asm volatile("mrc p15, 0, %0, c0, c0, 1" > > - : "=r" (ctype)); > > + __asm volatile("mrc " SR_STR(CP15_CTR(%0)) "\n" : "=r"(ctype)); > > > > arm_dcache_min_line_size = 1 << (CPU_CT_DMINLINE(ctype) + 2); > > arm_icache_min_line_size = 1 << (CPU_CT_IMINLINE(ctype) + 2); > > @@ -185,8 +185,8 @@ arm_get_cachetype_cp15v7(void) > > min(arm_icache_min_line_size, arm_dcache_min_line_size); > > > > /* CLIDR - Cache Level ID Register */ > > - __asm volatile("mrc p15, 1, %0, c0, c0, 1" > > - : "=r" (cache_level_id) :); > > + __asm volatile("mrc " SR_STR(CP15_CLIDR(%0)) > > + : "=r"(cache_level_id)); > > cpu_drain_writebuf(); > > > > /* L1 Cache available. */ > > @@ -201,17 +201,18 @@ arm_get_cachetype_cp15v7(void) > > cache_level_id & (0x2 << level)) { > > sel = level << 1 | 0 << 0; /* L1 | unified/data cache */ > > /* CSSELR - Cache Size Selection Register */ > > - __asm volatile("mcr p15, 2, %0, c0, c0, 0" > > - :: "r" (sel)); > > + __asm volatile("mcr " SR_STR(CP15_CSSELR(%0)) "\n" > > + :: "r"(sel)); > > cpu_drain_writebuf(); > > /* CCSIDR - Cache Size Identification Register */ > > - __asm volatile("mrc p15, 1, %0, c0, c0, 0" > > - : "=r" (cachereg) :); > > + __asm volatile("mcr " SR_STR(CP15_CCSIDR(%0)) "\n" > > + : "=r"(cachereg)); > > cpu_drain_writebuf(); > > sets = ((cachereg >> 13) & 0x7fff) + 1; > > arm_pdcache_line_size = 1 << ((cachereg & 0x7) + 4); > > arm_pdcache_ways = ((cachereg >> 3) & 0x3ff) + 1; > > - arm_pdcache_size = arm_pdcache_line_size * > > arm_pdcache_ways * sets; > > + arm_pdcache_size = > > + arm_pdcache_line_size * arm_pdcache_ways * sets; > > switch (cachereg & 0xc0000000) { > > case 0x00000000: > > arm_pcache_type = 0; > > @@ -230,24 +231,26 @@ arm_get_cachetype_cp15v7(void) > > if (cache_level_id & (0x1 << level)) { > > sel = level << 1 | 1 << 0; /* L1 | instruction cache */ > > /* CSSELR - Cache Size Selection Register */ > > - __asm volatile("mcr p15, 2, %0, c0, c0, 0" > > - :: "r" (sel)); > > + __asm volatile("mcr " SR_STR(CP15_CSSELR(%0)) "\n" > > + :: "r"(sel)); > > cpu_drain_writebuf(); > > /* CCSIDR - Cache Size Identification Register */ > > - __asm volatile("mrc p15, 1, %0, c0, c0, 0" > > - : "=r" (cachereg) :); > > + __asm volatile("mcr " SR_STR(CP15_CCSIDR(%0)) "\n" > > + : "=r"(cachereg)); > > cpu_drain_writebuf(); > > sets = ((cachereg >> 13) & 0x7fff) + 1; > > arm_picache_line_size = 1 << ((cachereg & 0x7) + 4); > > arm_picache_ways = ((cachereg >> 3) & 0x3ff) + 1; > > - arm_picache_size = arm_picache_line_size * > > arm_picache_ways * sets; > > + arm_picache_size = > > + arm_picache_line_size * arm_picache_ways * sets; > > } > > } > > > > arm_dcache_align = arm_pdcache_line_size; > > arm_dcache_align_mask = arm_dcache_align - 1; > > > > - arm_dcache_l2_nsets = > > arm_pdcache_size/arm_pdcache_ways/arm_pdcache_line_size; > > + arm_dcache_l2_nsets = > > + arm_pdcache_size / arm_pdcache_ways / arm_pdcache_line_size; > > arm_dcache_l2_assoc = log2(arm_pdcache_ways); > > arm_dcache_l2_linesize = log2(arm_pdcache_line_size); > > } > > @@ -255,17 +258,16 @@ arm_get_cachetype_cp15v7(void) > > /* > > */ > > void > > -armv7_idcache_wbinv_all() > > +armv7_idcache_wbinv_all(void) > > { > > - uint32_t arg; > > - arg = 0; > > - __asm volatile("mcr p15, 0, r0, c7, c5, 0" :: "r" (arg)); > > + /* Instruction cache invalidate all PoU */ > > + __asm volatile("mcr " SR_STR(CP15_ICIALLU) "\n" ::: "memory"); > > armv7_dcache_wbinv_all(); > > } > > > > /* brute force cache flushing */ > > void > > -armv7_dcache_wbinv_all() > > +armv7_dcache_wbinv_all(void) > > { > > int sets, ways, lvl; > > int nsets, nways; > > @@ -291,9 +293,9 @@ armv7_dcache_wbinv_all() > > for (ways = 0; ways < nways; ways++) { > > word = wayval | setval | lvl; > > > > - /* Clean D cache SE with Set/Index */ > > - __asm volatile("mcr p15, 0, %0, c7, c10, 2" > > - : : "r" (word)); > > + /* Clean D cache SE with Set/Way */ > > + __asm volatile("mcr " SR_STR(CP15_DCCSW(%0)) "\n" > > + :: "r"(word)); > > wayval += wayincr; > > } > > setval += setincr; > > @@ -310,7 +312,7 @@ armv7_dcache_wbinv_all() > > */ > > > > int > > -set_cpufuncs() > > +set_cpufuncs(void) > > { > > cputype = cpufunc_id(); > > cputype &= CPU_ID_CPU_MASK; > > @@ -323,8 +325,8 @@ set_cpufuncs() > > if ((cputype & CPU_ID_ARCH_MASK) == CPU_ID_ARCH_CPUID) { > > uint32_t mmfr0; > > > > - __asm volatile("mrc p15, 0, %0, c0, c1, 4" > > - : "=r" (mmfr0)); > > + __asm volatile("mrc " SR_STR(CP15_ID_MMFR0(%0)) > > + : "=r"(mmfr0)); > > > > switch (mmfr0 & ID_MMFR0_VMSA_MASK) { > > case VMSA_V7: > > @@ -359,7 +361,7 @@ set_cpufuncs() > > */ > > > > void > > -armv7_setup() > > +armv7_setup(void) > > { > > uint32_t auxctrl, auxctrlmask; > > uint32_t cpuctrl, cpuctrlmask; > > @@ -409,7 +411,7 @@ armv7_setup() > > * Check for the Virtualization Extensions and enable UWXN of > > * those are included. > > */ > > - __asm volatile("mrc p15, 0, %0, c0, c1, 1" : "=r"(id_pfr1)); > > + __asm volatile("mrc " SR_STR(CP15_ID_PFR1(%0)) : "=r"(id_pfr1)); > > if ((id_pfr1 & 0x0000f000) == 0x00001000) { > > cpuctrlmask |= CPU_CONTROL_UWXN; > > cpuctrl |= CPU_CONTROL_UWXN; > > diff --git a/sys/arch/arm/arm/pmap7.c b/sys/arch/arm/arm/pmap7.c > > index f99ee582e00..a4264ab1a04 100644 > > --- a/sys/arch/arm/arm/pmap7.c > > +++ b/sys/arch/arm/arm/pmap7.c > > @@ -193,6 +193,7 @@ > > #include <machine/pcb.h> > > #include <machine/param.h> > > #include <arm/cpufunc.h> > > +#include <arm/sysreg.h> > > > > //#define PMAP_DEBUG > > #ifdef PMAP_DEBUG > > @@ -1822,9 +1823,10 @@ pmap_activate(struct proc *p) > > if (p == curproc) { > > u_int cur_ttb; > > > > - __asm volatile("mrc p15, 0, %0, c2, c0, 0" : "=r"(cur_ttb)); > > + __asm volatile("mrc " SR_STR(CP15_TTBR0(%0)) "\n" > > + : "=r"(cur_ttb)); > > > > - cur_ttb &= ~(L1_TABLE_SIZE - 1); > > + cur_ttb &= L1_TABLE_FRAME; > > > > if (cur_ttb == (u_int)pcb->pcb_pagedir) { > > /* > > @@ -2813,7 +2815,7 @@ void (*pmap_zero_page_func)(struct vm_page > > *); > > void > > pmap_pte_init_armv7(void) > > { > > - uint32_t id_mmfr0, id_mmfr3; > > + u_int mmfr; > > > > /* > > * XXX We want to use proper TEX settings eventually. > > @@ -2863,13 +2865,13 @@ pmap_pte_init_armv7(void) > > pmap_zero_page_func = pmap_zero_page_generic; > > > > /* Check if the PXN bit is supported. */ > > - __asm volatile("mrc p15, 0, %0, c0, c1, 4" : "=r"(id_mmfr0)); > > - if ((id_mmfr0 & ID_MMFR0_VMSA_MASK) >= VMSA_V7_PXN) > > + __asm volatile("mrc " SR_STR(CP15_ID_MMFR0(%0)) "\n" : "=r"(mmfr)); > > + if ((mmfr & ID_MMFR0_VMSA_MASK) >= VMSA_V7_PXN) > > l1_c_pxn = L1_C_V7_PXN; > > > > /* Check for coherent walk. */ > > - __asm volatile("mrc p15, 0, %0, c0, c1, 7" : "=r"(id_mmfr3)); > > - if ((id_mmfr3 & 0x00f00000) == 0x00100000) > > + __asm volatile("mrc " SR_STR(CP15_ID_MMFR3(%0)) "\n" : "=r"(mmfr)); > > + if ((mmfr & 0x00f00000) == 0x00100000) > > pmap_needs_pte_sync = 0; > > } > > > > diff --git a/sys/arch/arm/cortex/agtimer.c b/sys/arch/arm/cortex/agtimer.c > > index 8d622c058a4..935a7ece026 100644 > > --- a/sys/arch/arm/cortex/agtimer.c > > +++ b/sys/arch/arm/cortex/agtimer.c > > @@ -30,6 +30,7 @@ > > #include <machine/fdt.h> > > > > #include <arm/cpufunc.h> > > +#include <arm/sysreg.h> > > #include <arm/cortex/cortex.h> > > > > #include <dev/ofw/fdt.h> > > @@ -98,7 +99,8 @@ agtimer_readcnt64(void) > > { > > uint64_t val; > > > > - __asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (val)); > > + __asm volatile("mrrc " SR_STR(CP15_CNTPCT(%Q0, %R0)) "\n" > > + : "=r"(val)); > > > > return (val); > > } > > @@ -108,7 +110,7 @@ agtimer_get_ctrl(void) > > { > > uint32_t val; > > > > - __asm volatile("mrc p15, 0, %0, c14, c2, 1" : "=r" (val)); > > + __asm volatile("mrc " SR_STR(CP15_CNTP_CTL(%0)) "\n" : "=r"(val)); > > > > return (val); > > } > > @@ -116,11 +118,8 @@ agtimer_get_ctrl(void) > > static inline int > > agtimer_set_ctrl(uint32_t val) > > { > > - __asm volatile("mcr p15, 0, %[val], c14, c2, 1" : : > > - [val] "r" (val)); > > - > > + __asm volatile("mcr " SR_STR(CP15_CNTP_CTL(%0)) "\n" :: "r"(val)); > > cpu_drain_writebuf(); > > - //isb(); > > > > return (0); > > } > > @@ -128,10 +127,8 @@ agtimer_set_ctrl(uint32_t val) > > static inline int > > agtimer_set_tval(uint32_t val) > > { > > - __asm volatile("mcr p15, 0, %[val], c14, c2, 0" : : > > - [val] "r" (val)); > > + __asm volatile("mcr " SR_STR(CP15_CNTP_TVAL(%0)) "\n" :: "r"(val)); > > cpu_drain_writebuf(); > > - //isb(); > > > > return (0); > > } > > @@ -387,9 +384,11 @@ agtimer_init(void) > > uint32_t id_pfr1, cntfrq = 0; > > > > /* Check for Generic Timer support. */ > > - __asm volatile("mrc p15, 0, %0, c0, c1, 1" : "=r"(id_pfr1)); > > + __asm volatile("mrc " SR_STR(CP15_ID_PFR1(%0)) "\n" > > + : "=r"(id_pfr1)); > > if ((id_pfr1 & 0x000f0000) == 0x00010000) > > - __asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (cntfrq)); > > + __asm volatile("mrc " SR_STR(CP15_CNTFRQ(%0)) "\n" > > + : "=r"(cntfrq)); > > > > if (cntfrq != 0) { > > agtimer_frequency = cntfrq; > > diff --git a/sys/arch/arm/include/cpu.h b/sys/arch/arm/include/cpu.h > > index 312c2f6c9c9..e09bfd49570 100644 > > --- a/sys/arch/arm/include/cpu.h > > +++ b/sys/arch/arm/include/cpu.h > > @@ -101,6 +101,7 @@ > > #endif > > #include <machine/frame.h> > > #include <machine/pcb.h> > > +#include <arm/sysreg.h> > > #endif /* !_LOCORE */ > > > > #include <arm/armreg.h> > > @@ -215,7 +216,7 @@ static inline struct cpu_info * > > curcpu(void) > > { > > struct cpu_info *__ci; > > - __asm volatile("mrc p15, 0, %0, c13, c0, 4" : "=r" (__ci)); > > + __asm volatile("mrc " SR_STR(CP15_TPIDRPRW(%0)) "\n" : "=r"(__ci)); > > return (__ci); > > } > > > > diff --git a/sys/arch/arm/include/pte.h b/sys/arch/arm/include/pte.h > > index 53b6cc8831f..ac80e32379a 100644 > > --- a/sys/arch/arm/include/pte.h > > +++ b/sys/arch/arm/include/pte.h > > @@ -118,7 +118,10 @@ typedef uint32_t pt_entry_t; /* L2 table > > entry */ > > #define L2_ADDR_BITS 0x000ff000 /* L2 PTE address bits */ > > > > #define L1_TABLE_SIZE 0x4000 /* 16K */ > > +#define L1_TABLE_OFFSET (L1_TABLE_SIZE - 1) > > +#define L1_TABLE_FRAME (~L1_TABLE_OFFSET) > > #define L2_TABLE_SIZE 0x1000 /* 4K */ > > + > > /* > > * The new pmap deals with the 1KB coarse L2 tables by > > * allocating them from a pool. Until every port has been converted, > > diff --git a/sys/arch/arm/include/sysreg.h b/sys/arch/arm/include/sysreg.h > > index c2aab7d6667..f41a3b362ec 100644 > > --- a/sys/arch/arm/include/sysreg.h > > +++ b/sys/arch/arm/include/sysreg.h > > @@ -269,4 +269,20 @@ > > */ > > #define CP15_CBAR(rr) p15, 4, rr, c15, c0, 0 /* Configuration > > Base Address Register */ > > > > +/* > > + * SysRegSTRing-Macro to be used within asm(), to allow using macros above. > > + * like: > > + * > > + * u_int > > + * cpu_mpidr(void) > > + * { > > + * u_int mpidr; > > + * asm volatile("mrc " SR_STR(CP15_MPIDR(%0)) "\n" : > > "=r"(mpidr)); > > + * return mpidr; > > + * } > > + * > > + */ > > +#define __SRSTR(...) #__VA_ARGS__ > > +#define SR_STR(x) __SRSTR(x) > > + > > #endif /* !MACHINE_SYSREG_H */ > > diff --git a/sys/arch/arm/mainbus/mainbus.c b/sys/arch/arm/mainbus/mainbus.c > > index 3d36366c95b..2b65d2b9ba7 100644 > > --- a/sys/arch/arm/mainbus/mainbus.c > > +++ b/sys/arch/arm/mainbus/mainbus.c > > @@ -26,6 +26,7 @@ > > #include <dev/ofw/fdt.h> > > > > #include <arm/mainbus/mainbus.h> > > +#include <arm/sysreg.h> > > > > int mainbus_match(struct device *, void *, void *); > > void mainbus_attach(struct device *, struct device *, void *); > > @@ -253,7 +254,7 @@ mainbus_match_primary(struct device *parent, void > > *match, void *aux) > > struct cfdata *cf = match; > > uint32_t mpidr; > > > > - __asm volatile("mrc p15, 0, %0, c0, c0, 5" : "=r " (mpidr)); > > + __asm volatile("mrc " SR_STR(CP15_MPIDR(%0)) "\n" : "=r"(mpidr)); > > > > if (fa->fa_nreg < 1 || fa->fa_reg[0].addr != (mpidr & MPIDR_AFF)) > > return 0; > > @@ -268,7 +269,7 @@ mainbus_match_secondary(struct device *parent, void > > *match, void *aux) > > struct cfdata *cf = match; > > uint32_t mpidr; > > > > - __asm volatile("mrc p15, 0, %0, c0, c0, 5" : "=r " (mpidr)); > > + __asm volatile("mrc " SR_STR(CP15_MPIDR(%0)) "\n" : "=r"(mpidr)); > > > > if (fa->fa_nreg < 1 || fa->fa_reg[0].addr == (mpidr & MPIDR_AFF)) > > return 0; > > diff --git a/sys/arch/armv7/armv7/armv7_machdep.c > > b/sys/arch/armv7/armv7/armv7_machdep.c > > index aa1c549b29b..b4ae9a36174 100644 > > --- a/sys/arch/armv7/armv7/armv7_machdep.c > > +++ b/sys/arch/armv7/armv7/armv7_machdep.c > > @@ -119,6 +119,7 @@ > > > > #include <arm/undefined.h> > > #include <arm/machdep.h> > > +#include <arm/sysreg.h> > > #include <arm/armv7/armv7var.h> > > #include <armv7/armv7/armv7_machdep.h> > > > > @@ -293,12 +294,9 @@ static __inline > > pd_entry_t * > > read_ttb(void) > > { > > - long ttb; > > - > > - __asm volatile("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttb)); > > - > > - > > - return (pd_entry_t *)(ttb & ~((1<<14)-1)); > > + u_int ttb; > > + __asm volatile("mrc " SR_STR(CP15_TTBR0(%0)) "\n" : "=r"(ttb)); > > + return (pd_entry_t *)(ttb & L1_TABLE_FRAME); > > } > > > > #define VERBOSE_INIT_ARM > >