Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_POWERPC_STATIC_CALL_H
0003 #define _ASM_POWERPC_STATIC_CALL_H
0004 
0005 #define __PPC_SCT(name, inst)                   \
0006     asm(".pushsection .text, \"ax\"             \n" \
0007         ".align 5                       \n" \
0008         ".globl " STATIC_CALL_TRAMP_STR(name) "     \n" \
0009         STATIC_CALL_TRAMP_STR(name) ":          \n" \
0010         inst "                      \n" \
0011         "   lis 12,2f@ha                \n" \
0012         "   lwz 12,2f@l(12)             \n" \
0013         "   mtctr   12                  \n" \
0014         "   bctr                        \n" \
0015         "1: li  3, 0                    \n" \
0016         "   blr                     \n" \
0017         "2: .long 0                     \n" \
0018         ".type " STATIC_CALL_TRAMP_STR(name) ", @function   \n" \
0019         ".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
0020         ".popsection                    \n")
0021 
0022 #define PPC_SCT_RET0        20      /* Offset of label 1 */
0023 #define PPC_SCT_DATA        28      /* Offset of label 2 */
0024 
0025 #define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func)   __PPC_SCT(name, "b " #func)
0026 #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name)    __PPC_SCT(name, "blr")
0027 #define ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name)    __PPC_SCT(name, "b .+20")
0028 
0029 #endif /* _ASM_POWERPC_STATIC_CALL_H */