summaryrefslogtreecommitdiff
path: root/ldso/ldso/xtensa/dl-tlsdesc.S
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2015-09-16 01:49:49 +0300
committerWaldemar Brodkorb <wbx@openadk.org>2015-10-08 20:31:24 +0200
commite78a0f58f23347c822c182d1c01f6eb9b9866d60 (patch)
tree723cfbcd2411d889fb4956adb7f2d11a6d766050 /ldso/ldso/xtensa/dl-tlsdesc.S
parent9fae2ad9937279c9f7f40975ac14cb7b57f4a36d (diff)
xtensa: support call0 ABI
Most changes are mechanical replacement of 'retw' instruction with 'abi_ret' macro, defined to 'retw' or 'ret' according to ABI. Assembly code that makes calls is duplicated for call0 ABI with changed register numbers for parameters/return value and call instruction. 'entry' instructions are replaced with 'abi_entry' macro. More interesting changes: - non-leaf assembly functions (e.g. _dl_tlsdesc_dynamic, _dl_linux_resolve, SYSCALL_ERROR_HANDLER, PSEUDO) now need to preserve registers around intermediate calls they make, use temporary stack frame for that; - setjmp/longjmp only need to save and restore return address, stack pointer and callee-saved registers in the jmpbuf; - __clone and syscall functions had hardcoded offsets to parameter passed on stack, on call0 ABI they don't need stack frame, so the offset is different. Replace these offsets with FRAMESIZE macro. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Diffstat (limited to 'ldso/ldso/xtensa/dl-tlsdesc.S')
-rw-r--r--ldso/ldso/xtensa/dl-tlsdesc.S45
1 files changed, 25 insertions, 20 deletions
diff --git a/ldso/ldso/xtensa/dl-tlsdesc.S b/ldso/ldso/xtensa/dl-tlsdesc.S
index 0638af439..6f417f61a 100644
--- a/ldso/ldso/xtensa/dl-tlsdesc.S
+++ b/ldso/ldso/xtensa/dl-tlsdesc.S
@@ -23,16 +23,11 @@
#include "tlsdesc.h"
.text
- .align 4
- .hidden _dl_tlsdesc_return
- .global _dl_tlsdesc_return
- .type _dl_tlsdesc_return, @function
-_dl_tlsdesc_return:
- entry a1, 16
+HIDDEN_ENTRY (_dl_tlsdesc_return)
rur.threadptr a3
add a2, a2, a3
- retw
- .size _dl_tlsdesc_return, .-_dl_tlsdesc_return
+ abi_ret
+END (_dl_tlsdesc_return)
#ifdef SHARED
@@ -57,12 +52,7 @@ _dl_tlsdesc_return:
}
*/
- .align 4
- .hidden _dl_tlsdesc_dynamic
- .global _dl_tlsdesc_dynamic
- .type _dl_tlsdesc_dynamic, @function
-_dl_tlsdesc_dynamic:
- entry a1, 32
+HIDDEN_ENTRY (_dl_tlsdesc_dynamic)
/* dtv_t *dtv = (dtv_t *)THREAD_DTV(); */
rur.threadptr a3
@@ -83,16 +73,31 @@ _dl_tlsdesc_dynamic:
+ td->tlsinfo.ti_offset - __builtin_thread_pointer(); */
l32i a6, a2, TLSDESC_MODOFF
sub a2, a6, a3
- retw
+ abi_ret
/* return __tls_get_addr (&td->tlsinfo) - __builtin_thread_pointer(); */
.Lslow:
- mov a10, a2
- movi a8, __tls_get_addr
- callx8 a8
- sub a2, a10, a3
+#if defined(__XTENSA_WINDOWED_ABI__)
+ mov a6, a2
+ movi a4, __tls_get_addr
+ callx4 a4
+ sub a2, a6, a3
retw
- .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
+#elif defined(__XTENSA_CALL0_ABI__)
+ addi a1, a1, -16
+ s32i a0, a1, 0
+ s32i a3, a1, 4
+ movi a0, __tls_get_addr
+ callx0 a0
+ l32i a3, a1, 4
+ l32i a0, a1, 0
+ sub a2, a2, a3
+ addi a1, a1, 16
+ ret
+#else
+#error Unsupported Xtensa ABI
+#endif
+END (_dl_tlsdesc_dynamic)
#endif /* SHARED */
#endif