linkage.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_X86_LINKAGE_H
  3. #define _ASM_X86_LINKAGE_H
  4. #include <linux/stringify.h>
  5. #include <asm/ibt.h>
  6. #undef notrace
  7. #define notrace __attribute__((no_instrument_function))
  8. #ifdef CONFIG_64BIT
  9. /*
  10. * The generic version tends to create spurious ENDBR instructions under
  11. * certain conditions.
  12. */
  13. #define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0" : "=r" (__here)); __here; })
  14. #endif
  15. #ifdef CONFIG_X86_32
  16. #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
  17. #endif /* CONFIG_X86_32 */
  18. #ifdef __ASSEMBLY__
  19. #if defined(CONFIG_X86_64) || defined(CONFIG_X86_ALIGNMENT_16)
  20. #define __ALIGN .p2align 4, 0x90
  21. #define __ALIGN_STR __stringify(__ALIGN)
  22. #endif
  23. #if defined(CONFIG_RETHUNK) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO)
  24. #define RET jmp __x86_return_thunk
  25. #else /* CONFIG_RETPOLINE */
  26. #ifdef CONFIG_SLS
  27. #define RET ret; int3
  28. #else
  29. #define RET ret
  30. #endif
  31. #endif /* CONFIG_RETPOLINE */
  32. #else /* __ASSEMBLY__ */
  33. #if defined(CONFIG_RETHUNK) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO)
  34. #define ASM_RET "jmp __x86_return_thunk\n\t"
  35. #else /* CONFIG_RETPOLINE */
  36. #ifdef CONFIG_SLS
  37. #define ASM_RET "ret; int3\n\t"
  38. #else
  39. #define ASM_RET "ret\n\t"
  40. #endif
  41. #endif /* CONFIG_RETPOLINE */
  42. #endif /* __ASSEMBLY__ */
  43. #define __CFI_TYPE(name) \
  44. SYM_START(__cfi_##name, SYM_L_LOCAL, SYM_A_NONE) \
  45. .fill 11, 1, 0x90 ASM_NL \
  46. .byte 0xb8 ASM_NL \
  47. .long __kcfi_typeid_##name ASM_NL \
  48. SYM_FUNC_END(__cfi_##name)
  49. /* SYM_TYPED_FUNC_START -- use for indirectly called globals, w/ CFI type */
  50. #define SYM_TYPED_FUNC_START(name) \
  51. SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
  52. ENDBR
  53. /* SYM_FUNC_START -- use for global functions */
  54. #define SYM_FUNC_START(name) \
  55. SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
  56. ENDBR
  57. /* SYM_FUNC_START_NOALIGN -- use for global functions, w/o alignment */
  58. #define SYM_FUNC_START_NOALIGN(name) \
  59. SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \
  60. ENDBR
  61. /* SYM_FUNC_START_LOCAL -- use for local functions */
  62. #define SYM_FUNC_START_LOCAL(name) \
  63. SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) \
  64. ENDBR
  65. /* SYM_FUNC_START_LOCAL_NOALIGN -- use for local functions, w/o alignment */
  66. #define SYM_FUNC_START_LOCAL_NOALIGN(name) \
  67. SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \
  68. ENDBR
  69. /* SYM_FUNC_START_WEAK -- use for weak functions */
  70. #define SYM_FUNC_START_WEAK(name) \
  71. SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) \
  72. ENDBR
  73. /* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */
  74. #define SYM_FUNC_START_WEAK_NOALIGN(name) \
  75. SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \
  76. ENDBR
  77. #endif /* _ASM_X86_LINKAGE_H */