From e78a0f58f23347c822c182d1c01f6eb9b9866d60 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 16 Sep 2015 01:49:49 +0300 Subject: 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 --- libc/sysdeps/linux/xtensa/bits/setjmp.h | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libc/sysdeps/linux/xtensa/bits') diff --git a/libc/sysdeps/linux/xtensa/bits/setjmp.h b/libc/sysdeps/linux/xtensa/bits/setjmp.h index 183fa3e64..5d3e5509e 100644 --- a/libc/sysdeps/linux/xtensa/bits/setjmp.h +++ b/libc/sysdeps/linux/xtensa/bits/setjmp.h @@ -23,6 +23,7 @@ # error "Never include directly; use instead." #endif +#if defined(__XTENSA_WINDOWED_ABI__) /* The jmp_buf structure for Xtensa holds the following (where "proc" is the procedure that calls setjmp): 4-12 registers from the window of proc, the 4 words from the save area at proc's $sp (in case a @@ -30,5 +31,13 @@ proc. Everything else is saved on the stack in the normal save areas. */ typedef int __jmp_buf[17]; +#elif defined(__XTENSA_CALL0_ABI__) +/* The jmp_buf structure for Xtensa Call0 ABI holds the return address, + the stack pointer and callee-saved registers (a12 - a15). */ + +typedef int __jmp_buf[6]; +#else +#error Unsupported Xtensa ABI +#endif #endif /* bits/setjmp.h */ -- cgit v1.2.3