[PATCH v5 4/5] ARM: smp: Store current pointer in TPIDRURO register if available

Ard Biesheuvel ardb at kernel.org
Tue Sep 21 08:59:50 PDT 2021


On Tue, 21 Sept 2021 at 17:46, Linus Walleij <linus.walleij at linaro.org> wrote:
>
> On Sat, Sep 18, 2021 at 10:44 AM Ard Biesheuvel <ardb at kernel.org> wrote:
>
> > Now that the user space TLS register is assigned on every return to user
> > space, we can use it to keep the 'current' pointer while running in the
> > kernel. This removes the need to access it via thread_info, which is
> > located at the base of the stack, but will be moved out of there in a
> > subsequent patch.
> >
> > Use the __builtin_thread_pointer() helper when available - this will
> > help GCC understand that reloading the value within the same function is
> > not necessary, even when using the per-task stack protector (which also
> > generates accesses via the TLS register). For example, the generated
> > code below loads TPIDRURO only once, and uses it to access both the
> > stack canary and the preempt_count fields.
> >
> > <do_one_initcall>:
> >        e92d 41f0       stmdb   sp!, {r4, r5, r6, r7, r8, lr}
> >        ee1d 4f70       mrc     15, 0, r4, cr13, cr0, {3}
> >        4606            mov     r6, r0
> >        b094            sub     sp, #80 ; 0x50
> >        f8d4 34e8       ldr.w   r3, [r4, #1256] ; 0x4e8  <- stack canary
> >        9313            str     r3, [sp, #76]   ; 0x4c
> >        f8d4 8004       ldr.w   r8, [r4, #4]             <- preempt count
> >
> > Co-developed-by: Keith Packard <keithpac at amazon.com>
> > Signed-off-by: Keith Packard <keithpac at amazon.com>
> > Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
>
> I like the __builtin trick, I had to look up the patch that adds
> this to GCC to understand what is going on.

Yes. Note that patch #1 adds a call to gen_load_tp_hard() to the GCC
plugin, which is what backs __builtin_thread_pointer() when -mtp=cp15
is used. This is what permits GCC to infer that it can reuse the
value. (Inline asm is completely opaque to the compiler so it lacks
the implicit connotation that the thread pointer cannot change values
halfway through a function)

> Reviewed-by: Linus Walleij <linus.walleij at linaro.org>
>

Thanks!



More information about the linux-arm-kernel mailing list