summaryrefslogtreecommitdiff
path: root/ldso/ldso/xtensa/dl-startup.h
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-startup.h
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-startup.h')
-rw-r--r--ldso/ldso/xtensa/dl-startup.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h
index 8fe54a3c7..aece0cd96 100644
--- a/ldso/ldso/xtensa/dl-startup.h
+++ b/ldso/ldso/xtensa/dl-startup.h
@@ -23,6 +23,7 @@ __asm__ (
" .align 4\n"
"0: movi a3, _start+3\n"
" sub a2, a0, a3\n"
+#if defined(__XTENSA_WINDOWED_ABI__)
" # Make sure a0 is cleared to mark the top of stack.\n"
" movi a0, 0\n"
" # user_entry_point = _dl_start(pointer to argument block)\n"
@@ -32,6 +33,17 @@ __asm__ (
" callx4 a4\n"
" # Save user_entry_point so we can jump to it.\n"
" mov a3, a6\n"
+#elif defined(__XTENSA_CALL0_ABI__)
+ " # user_entry_point = _dl_start(pointer to argument block)\n"
+ " movi a0, _dl_start\n"
+ " add a0, a0, a2\n"
+ " mov a2, sp\n"
+ " callx0 a0\n"
+ " # Save user_entry_point so we can jump to it.\n"
+ " mov a3, a2\n"
+#else
+#error Unsupported Xtensa ABI
+#endif
" l32i a7, sp, 0 # load argc\n"
" # Load _dl_skip_args into a4.\n"
" movi a4, _dl_skip_args\n"