Re: READ_ONCE() + STACKPROTECTOR_STRONG == :/ (was Re: [GIT PULL] Please pull powerpc/linux.git powerpc-5.5-2 tag (topic/kasan-bitops))
From: Peter Zijlstra
Date: Thu Dec 12 2019 - 15:54:16 EST
On Thu, Dec 12, 2019 at 09:21:57PM +0100, Peter Zijlstra wrote:
> On Thu, Dec 12, 2019 at 07:34:01PM +0000, Will Deacon wrote:
> > void ool_store_release(volatile unsigned long *ptr, unsigned long val)
> > {
> > smp_store_release(ptr, val);
> > }
> >
> > 0000000000000000 <ool_store_release>:
> > 0: a9be7bfd stp x29, x30, [sp, #-32]!
> > 4: 90000002 adrp x2, 0 <__stack_chk_guard>
> > 8: 91000042 add x2, x2, #0x0
> > c: 910003fd mov x29, sp
> > 10: f9400043 ldr x3, [x2]
> > 14: f9000fa3 str x3, [x29, #24]
> > 18: d2800003 mov x3, #0x0 // #0
> > 1c: c89ffc01 stlr x1, [x0]
> > 20: f9400fa1 ldr x1, [x29, #24]
> > 24: f9400040 ldr x0, [x2]
> > 28: ca000020 eor x0, x1, x0
> > 2c: b5000060 cbnz x0, 38 <ool_store_release+0x38>
> > 30: a8c27bfd ldp x29, x30, [sp], #32
> > 34: d65f03c0 ret
> > 38: 94000000 bl 0 <__stack_chk_fail>
> >
> > It's a mess, and fixing READ_ONCE() doesn't help this case, which is why
> > I was looking at getting rid of volatile where it's not strictly needed.
> > I'm certainly open to other suggestions, I just haven't managed to think
> > of anything else.
>
> We could move the kernel to C++ and write:
>
> std::remove_volatile<typeof(p)>::type __p = (p);
>
> /me runs like hell...
Also, the GCC __auto_type thing strips _Atomic and const qualifiers but
for some obscure raisin forgets to strip volatile :/
https://gcc.gnu.org/ml/gcc-patches/2013-11/msg01378.html
Now, looking at the current GCC source:
https://github.com/gcc-mirror/gcc/blob/97d7270f894395e513667a031a0c309d1819d05e/gcc/c/c-parser.c#L3707
it seems that __typeof__() is supposed to strip all qualifiers from
_Atomic types. That lead me to try:
typeof(_Atomic typeof(p)) __p = (p);
But alas, I still get the same junk you got for ool_store_release() :/