On Fri, Jan 24, 2020 at 07:03:36AM +0000, Christophe Leroy wrote: > >Le 24/01/2020 à 06:46, Michael Ellerman a écrit : > >> > >>If I do this it seems to work, but feels a little dicey: > >> > >> asm ("" : "=r" (r1)); > >> sp = r1 & (THREAD_SIZE - 1); > > > > > >Or we could do add in asm/reg.h what we have in boot/reg.h: > > > >register void *__stack_pointer asm("r1"); > >#define get_sp() (__stack_pointer) > > > >And use get_sp() > > > > It works, and I guess doing it this way is acceptable as it's exactly > what's done for current in asm/current.h with register r2.
That is a *global* register variable. That works. We still need to document a bit better what it does exactly, but this is the expected use case, so that will work. > Now I (still) get: > > sp = get_sp() & (THREAD_SIZE - 1); > b9c: 54 24 04 fe clrlwi r4,r1,19 > if (unlikely(sp < 2048)) { > ba4: 2f 84 07 ff cmpwi cr7,r4,2047 > > Allthough GCC 8.1 what doing exactly the same with the form CLANG don't > like: > > register unsigned long r1 asm("r1"); > long sp = r1 & (THREAD_SIZE - 1); > b84: 54 24 04 fe clrlwi r4,r1,19 > if (unlikely(sp < 2048)) { > b8c: 2f 84 07 ff cmpwi cr7,r4,2047 Sure, if it did what you expected, things will usually work out fine ;-) (Pity that the compiler didn't come up with rlwinm. r4,r1,0,19,20 bne bad Or are the low bits of r4 used later again?) Segher