static_call.h 1.0 KB

1234567891011121314151617181920212223242526272829
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_POWERPC_STATIC_CALL_H
  3. #define _ASM_POWERPC_STATIC_CALL_H
  4. #define __PPC_SCT(name, inst) \
  5. asm(".pushsection .text, \"ax\" \n" \
  6. ".align 5 \n" \
  7. ".globl " STATIC_CALL_TRAMP_STR(name) " \n" \
  8. STATIC_CALL_TRAMP_STR(name) ": \n" \
  9. inst " \n" \
  10. " lis 12,2f@ha \n" \
  11. " lwz 12,2f@l(12) \n" \
  12. " mtctr 12 \n" \
  13. " bctr \n" \
  14. "1: li 3, 0 \n" \
  15. " blr \n" \
  16. "2: .long 0 \n" \
  17. ".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \
  18. ".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
  19. ".popsection \n")
  20. #define PPC_SCT_RET0 20 /* Offset of label 1 */
  21. #define PPC_SCT_DATA 28 /* Offset of label 2 */
  22. #define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func) __PPC_SCT(name, "b " #func)
  23. #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) __PPC_SCT(name, "blr")
  24. #define ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name) __PPC_SCT(name, "b .+20")
  25. #endif /* _ASM_POWERPC_STATIC_CALL_H */