Skip to content

Commit

Permalink
ARM: 9151/1: Thumb2: avoid __builtin_thread_pointer() on Clang
Browse files Browse the repository at this point in the history
If available, we use the __builtin_thread_pointer() helper to get the
value of the TLS register, to help the compiler understand that it
doesn't need to reload it every time we access 'current'.

Unfortunately, Clang fails to emit the MRC system register read
directly when building for Thumb2, and instead, it issues a call to the
__aeabi_read_tp helper, which the kernel does not provide, and so this
result in link failures at build time.

So create a special case for this, and emit the MRC directly using an
asm() block, just like we do when the helper is not available to begin
with.

Link: ClangBuiltLinux#1485

Reviewed-by: Nick Desaulniers <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
Tested-by: Nathan Chancellor <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Russell King (Oracle) <[email protected]>
  • Loading branch information
ardbiesheuvel authored and Russell King (Oracle) committed Oct 30, 2021
1 parent fa191b7 commit c1e42ef
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion arch/arm/include/asm/current.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,17 @@ static inline struct task_struct *get_current(void)
{
struct task_struct *cur;

#if __has_builtin(__builtin_thread_pointer)
#if __has_builtin(__builtin_thread_pointer) && \
!(defined(CONFIG_THUMB2_KERNEL) && \
defined(CONFIG_CC_IS_CLANG) && CONFIG_CLANG_VERSION < 130001)
/*
* Use the __builtin helper when available - this results in better
* code, especially when using GCC in combination with the per-task
* stack protector, as the compiler will recognize that it needs to
* load the TLS register only once in every function.
*
* Clang < 13.0.1 gets this wrong for Thumb2 builds:
* https://github.com/ClangBuiltLinux/linux/issues/1485
*/
cur = __builtin_thread_pointer();
#else
Expand Down

0 comments on commit c1e42ef

Please sign in to comment.