selftests/powerpc: Add 32-bit support to asm helpers
Add support for 32-bit builds to the asm helpers. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220627140239.2464900-6-mpe@ellerman.id.au
This commit is contained in:
Родитель
cfbc0723d1
Коммит
bd4d3042e7
|
@ -5,6 +5,16 @@
|
|||
#include <ppc-asm.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#define PPC_LL ld
|
||||
#define PPC_STL std
|
||||
#define PPC_STLU stdu
|
||||
#else
|
||||
#define PPC_LL lwz
|
||||
#define PPC_STL stw
|
||||
#define PPC_STLU stwu
|
||||
#endif
|
||||
|
||||
#define LOAD_REG_IMMEDIATE(reg, expr) \
|
||||
lis reg, (expr)@highest; \
|
||||
ori reg, reg, (expr)@higher; \
|
||||
|
@ -14,16 +24,20 @@
|
|||
|
||||
/*
|
||||
* Note: These macros assume that variables being stored on the stack are
|
||||
* doublewords, while this is usually the case it may not always be the
|
||||
* sizeof(long), while this is usually the case it may not always be the
|
||||
* case for each use case.
|
||||
*/
|
||||
#ifdef __powerpc64__
|
||||
|
||||
// ABIv2
|
||||
#if defined(_CALL_ELF) && _CALL_ELF == 2
|
||||
#define STACK_FRAME_MIN_SIZE 32
|
||||
#define STACK_FRAME_TOC_POS 24
|
||||
#define __STACK_FRAME_PARAM(_param) (32 + ((_param)*8))
|
||||
#define __STACK_FRAME_LOCAL(_num_params, _var_num) \
|
||||
((STACK_FRAME_PARAM(_num_params)) + ((_var_num)*8))
|
||||
#else
|
||||
|
||||
#else // ABIv1 below
|
||||
#define STACK_FRAME_MIN_SIZE 112
|
||||
#define STACK_FRAME_TOC_POS 40
|
||||
#define __STACK_FRAME_PARAM(i) (48 + ((i)*8))
|
||||
|
@ -34,7 +48,24 @@
|
|||
*/
|
||||
#define __STACK_FRAME_LOCAL(_num_params, _var_num) \
|
||||
(112 + ((_var_num)*8))
|
||||
#endif
|
||||
|
||||
|
||||
#endif // ABIv2
|
||||
|
||||
// Common 64-bit
|
||||
#define STACK_FRAME_LR_POS 16
|
||||
#define STACK_FRAME_CR_POS 8
|
||||
|
||||
#else // 32-bit below
|
||||
|
||||
#define STACK_FRAME_MIN_SIZE 16
|
||||
#define STACK_FRAME_LR_POS 4
|
||||
|
||||
#define __STACK_FRAME_PARAM(_param) (STACK_FRAME_MIN_SIZE + ((_param)*4))
|
||||
#define __STACK_FRAME_LOCAL(_num_params, _var_num) \
|
||||
((STACK_FRAME_PARAM(_num_params)) + ((_var_num)*4))
|
||||
|
||||
#endif // __powerpc64__
|
||||
|
||||
/* Parameter x saved to the stack */
|
||||
#define STACK_FRAME_PARAM(var) __STACK_FRAME_PARAM(var)
|
||||
|
@ -42,8 +73,6 @@
|
|||
/* Local variable x saved to the stack after x parameters */
|
||||
#define STACK_FRAME_LOCAL(num_params, var) \
|
||||
__STACK_FRAME_LOCAL(num_params, var)
|
||||
#define STACK_FRAME_LR_POS 16
|
||||
#define STACK_FRAME_CR_POS 8
|
||||
|
||||
/*
|
||||
* It is very important to note here that _extra is the extra amount of
|
||||
|
@ -56,13 +85,13 @@
|
|||
* preprocessed incorrectly, hence r0.
|
||||
*/
|
||||
#define PUSH_BASIC_STACK(_extra) \
|
||||
mflr r0; \
|
||||
std r0, STACK_FRAME_LR_POS(%r1); \
|
||||
stdu %r1, -(((_extra + 15) & ~15) + STACK_FRAME_MIN_SIZE)(%r1);
|
||||
mflr r0; \
|
||||
PPC_STL r0, STACK_FRAME_LR_POS(%r1); \
|
||||
PPC_STLU %r1, -(((_extra + 15) & ~15) + STACK_FRAME_MIN_SIZE)(%r1);
|
||||
|
||||
#define POP_BASIC_STACK(_extra) \
|
||||
addi %r1, %r1, (((_extra + 15) & ~15) + STACK_FRAME_MIN_SIZE); \
|
||||
ld r0, STACK_FRAME_LR_POS(%r1); \
|
||||
PPC_LL r0, STACK_FRAME_LR_POS(%r1); \
|
||||
mtlr r0;
|
||||
|
||||
#endif /* _SELFTESTS_POWERPC_BASIC_ASM_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче