13.7.2017 17.50 "Mark Kettenis" <mark.kette...@xs4all.nl> kirjoitti:
> 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. Ok, i'll try to get some fbsd dev to comment why they never went for this, just for my own curiousity, so not pushing the diff any further. -Artturi > > 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 > >