rewrite __aeabi_read_tp in asm
authorSzabolcs Nagy <nsz@port70.net>
Fri, 24 Aug 2018 23:11:59 +0000 (23:11 +0000)
committerRich Felker <dalias@aerifal.cx>
Tue, 28 Aug 2018 21:08:14 +0000 (17:08 -0400)
__aeabi_read_tp used to call c code, but that was incorrect as the
arm runtime abi specifies special pcs for this function: it is only
allowed to clobber r0, ip, lr and cpsr.

maintainer's note: the old code explicitly saved and restored all
general-purpose registers which are call-clobbered in the normal
calling convention, so it's unlikely that any real-world compilers
produced code that could break. however theoretically they could have
chosen to use floating point registers, in which case the caller's
values of those registers would be clobbered.

src/thread/arm/__aeabi_read_tp.s
src/thread/arm/__aeabi_read_tp_c.c [deleted file]

index 9d0cd311b3ae0887526583b4a2a7c4ab58ff87c1..2585620c447e49cdfecf557cf427acb13af64df2 100644 (file)
@@ -2,7 +2,9 @@
 .global __aeabi_read_tp
 .type __aeabi_read_tp,%function
 __aeabi_read_tp:
-       push {r1,r2,r3,lr}
-       bl __aeabi_read_tp_c
-       pop {r1,r2,r3,lr}
-       bx lr
+       ldr r0,1f
+       add r0,r0,pc
+       ldr r0,[r0]
+2:     bx r0
+       .align 2
+1:     .word __a_gettp_ptr - 2b
diff --git a/src/thread/arm/__aeabi_read_tp_c.c b/src/thread/arm/__aeabi_read_tp_c.c
deleted file mode 100644 (file)
index 0c56d61..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "pthread_impl.h"
-#include <stdint.h>
-
-__attribute__((__visibility__("hidden")))
-void *__aeabi_read_tp_c(void)
-{
-       return TP_ADJ(__pthread_self());
-}