On Sat, Feb 27, 2016 at 05:03:46PM +0100, Patrick Wildt wrote: > On Fri, Feb 26, 2016 at 08:59:41PM -0800, Philip Guenther wrote: > > On Sat, Feb 20, 2016 at 1:49 PM, Patrick Wildt <patr...@blueri.se> wrote: > > > since ARMv6 the coprocessor provides special registers to store software > > > defined values. Those registers are: > > > > > > * TPIDRURW -> kernel RW, user RW > > > * TPIDRURO -> kernel RW, user RO > > > * TPIDRPRW -> kernel RW > > > > > > TPIDRPRW is typically used to store the pointer to the curcpu struct, > > > while TPIDRURO is used to point to the TCB. > > > > > > The following diff implements using TPIDRPRW to store and retrieve the > > > curcpu struct pointer. This will especially be helpful in future MP > > > efforts. I have guarded it for ARMv7 only, as that's the only hardware > > > I have that supports it and I was able to test on. > > > > I don't know arm, but of those choices that makes sense. > > > > > > > If TCB_GET()'s only user is libpthread, then it could make sense to > > > store the TCB pointer in TPIDRURO. If it's possible that it's also > > > used in ports, then the arm packages won't be compatible to > > > armish/zaurus anymore. But the TCB stuff is not part of this diff. > > > > The userland bits in <machine/tcb.h> should match the platform's ABI > > for the thread register. The last time I tried to figure this out > > from the arm ABI docs I wanted to stab someone, but I was hopefully > > just looking at the wrong docs. Looking at the bits in FreeBSD I see > > > > static inline void > > set_tls(void *tls) > > { > > __asm __volatile("mcr p15, 0, %0, c13, c0, 3" : : "r" (tls)); > > } > > > > so, uh, whichever register that sets is presumably the correct one for > > userland. > > Yep, that's TPIDRURO. It's not a lot of work to use this register, but > it might just not work out as zaurus and armv7 use the same packages.
Time to revisit this and switch to the armv7 path in lib/librthread/arch/arm/_atomic_lock.c ?