xtensa: definitions for call0 ABI
Add assembly macros for calls, call arguments, preserved registers, function entry and return for windowed and call0 ABIs. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
61a6b91283
commit
5cce39b6aa
|
@ -194,6 +194,12 @@
|
|||
#define XTENSA_STACK_ALIGNMENT 16
|
||||
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
||||
/* Assembly instructions for windowed kernel ABI. */
|
||||
#define KABI_W
|
||||
/* Assembly instructions for call0 kernel ABI (will be ignored). */
|
||||
#define KABI_C0 #
|
||||
|
||||
#define XTENSA_FRAME_SIZE_RESERVE 16
|
||||
#define XTENSA_SPILL_STACK_RESERVE 32
|
||||
|
||||
|
@ -206,8 +212,34 @@
|
|||
#define abi_ret(frame_size) retw
|
||||
#define abi_ret_default retw
|
||||
|
||||
/* direct call */
|
||||
#define abi_call call4
|
||||
/* indirect call */
|
||||
#define abi_callx callx4
|
||||
/* outgoing call argument registers */
|
||||
#define abi_arg0 a6
|
||||
#define abi_arg1 a7
|
||||
#define abi_arg2 a8
|
||||
#define abi_arg3 a9
|
||||
#define abi_arg4 a10
|
||||
#define abi_arg5 a11
|
||||
/* return value */
|
||||
#define abi_rv a6
|
||||
/* registers preserved across call */
|
||||
#define abi_saved0 a2
|
||||
#define abi_saved1 a3
|
||||
|
||||
/* none of the above */
|
||||
#define abi_tmp0 a4
|
||||
#define abi_tmp1 a5
|
||||
|
||||
#elif defined(__XTENSA_CALL0_ABI__)
|
||||
|
||||
/* Assembly instructions for windowed kernel ABI (will be ignored). */
|
||||
#define KABI_W #
|
||||
/* Assembly instructions for call0 kernel ABI. */
|
||||
#define KABI_C0
|
||||
|
||||
#define XTENSA_SPILL_STACK_RESERVE 0
|
||||
|
||||
#define abi_entry(frame_size) __abi_entry (frame_size)
|
||||
|
@ -233,10 +265,43 @@
|
|||
|
||||
#define abi_ret_default ret
|
||||
|
||||
/* direct call */
|
||||
#define abi_call call0
|
||||
/* indirect call */
|
||||
#define abi_callx callx0
|
||||
/* outgoing call argument registers */
|
||||
#define abi_arg0 a2
|
||||
#define abi_arg1 a3
|
||||
#define abi_arg2 a4
|
||||
#define abi_arg3 a5
|
||||
#define abi_arg4 a6
|
||||
#define abi_arg5 a7
|
||||
/* return value */
|
||||
#define abi_rv a2
|
||||
/* registers preserved across call */
|
||||
#define abi_saved0 a12
|
||||
#define abi_saved1 a13
|
||||
|
||||
/* none of the above */
|
||||
#define abi_tmp0 a8
|
||||
#define abi_tmp1 a9
|
||||
|
||||
#else
|
||||
#error Unsupported Xtensa ABI
|
||||
#endif
|
||||
|
||||
#if defined(USER_SUPPORT_WINDOWED)
|
||||
/* Assembly instructions for windowed user ABI. */
|
||||
#define UABI_W
|
||||
/* Assembly instructions for call0 user ABI (will be ignored). */
|
||||
#define UABI_C0 #
|
||||
#else
|
||||
/* Assembly instructions for windowed user ABI (will be ignored). */
|
||||
#define UABI_W #
|
||||
/* Assembly instructions for call0 user ABI. */
|
||||
#define UABI_C0
|
||||
#endif
|
||||
|
||||
#define __XTENSA_HANDLER .section ".exception.text", "ax"
|
||||
|
||||
#endif /* _XTENSA_ASMMACRO_H */
|
||||
|
|
|
@ -26,4 +26,15 @@
|
|||
#define XCHAL_SPANNING_WAY 0
|
||||
#endif
|
||||
|
||||
#if XCHAL_HAVE_WINDOWED
|
||||
#if defined(CONFIG_USER_ABI_DEFAULT) || defined(CONFIG_USER_ABI_CALL0_PROBE)
|
||||
/* Whether windowed ABI is supported in userspace. */
|
||||
#define USER_SUPPORT_WINDOWED
|
||||
#endif
|
||||
#if defined(__XTENSA_WINDOWED_ABI__) || defined(USER_SUPPORT_WINDOWED)
|
||||
/* Whether windowed ABI is supported either in userspace or in the kernel. */
|
||||
#define SUPPORT_WINDOWED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,12 +18,6 @@
|
|||
#include <asm/types.h>
|
||||
#include <asm/regs.h>
|
||||
|
||||
/* Assertions. */
|
||||
|
||||
#if (XCHAL_HAVE_WINDOWED != 1)
|
||||
# error Linux requires the Xtensa Windowed Registers Option.
|
||||
#endif
|
||||
|
||||
/* Xtensa ABI requires stack alignment to be at least 16 */
|
||||
|
||||
#define STACK_ALIGN (XCHAL_DATA_WIDTH > 16 ? XCHAL_DATA_WIDTH : 16)
|
||||
|
@ -105,8 +99,18 @@
|
|||
#define WSBITS (XCHAL_NUM_AREGS / 4) /* width of WINDOWSTART in bits */
|
||||
#define WBBITS (XCHAL_NUM_AREGS_LOG2 - 2) /* width of WINDOWBASE in bits */
|
||||
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
#define KERNEL_PS_WOE_MASK PS_WOE_MASK
|
||||
#elif defined(__XTENSA_CALL0_ABI__)
|
||||
#define KERNEL_PS_WOE_MASK 0
|
||||
#else
|
||||
#error Unsupported xtensa ABI
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
||||
/* Build a valid return address for the specified call winsize.
|
||||
* winsize must be 1 (call4), 2 (call8), or 3 (call12)
|
||||
*/
|
||||
|
@ -117,6 +121,22 @@
|
|||
*/
|
||||
#define MAKE_PC_FROM_RA(ra,sp) (((ra) & 0x3fffffff) | ((sp) & 0xc0000000))
|
||||
|
||||
#elif defined(__XTENSA_CALL0_ABI__)
|
||||
|
||||
/* Build a valid return address for the specified call winsize.
|
||||
* winsize must be 1 (call4), 2 (call8), or 3 (call12)
|
||||
*/
|
||||
#define MAKE_RA_FOR_CALL(ra, ws) (ra)
|
||||
|
||||
/* Convert return address to a valid pc
|
||||
* Note: We assume that the stack pointer is in the same 1GB ranges as the ra
|
||||
*/
|
||||
#define MAKE_PC_FROM_RA(ra, sp) (ra)
|
||||
|
||||
#else
|
||||
#error Unsupported Xtensa ABI
|
||||
#endif
|
||||
|
||||
/* Spill slot location for the register reg in the spill area under the stack
|
||||
* pointer sp. reg must be in the range [0..4).
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue