nospec-insn.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_S390_NOSPEC_ASM_H
  3. #define _ASM_S390_NOSPEC_ASM_H
  4. #include <linux/linkage.h>
  5. #include <linux/export.h>
  6. #include <asm/dwarf.h>
  7. #ifdef __ASSEMBLER__
  8. #ifdef CC_USING_EXPOLINE
  9. /*
  10. * The expoline macros are used to create thunks in the same format
  11. * as gcc generates them. The 'comdat' section flag makes sure that
  12. * the various thunks are merged into a single copy.
  13. */
  14. .macro __THUNK_PROLOG_NAME name
  15. #ifdef CONFIG_EXPOLINE_EXTERN
  16. SYM_CODE_START(\name)
  17. #else
  18. .pushsection .text..\name,"axG",@progbits,\name,comdat
  19. .globl \name
  20. .hidden \name
  21. .type \name,@function
  22. \name:
  23. CFI_STARTPROC
  24. #endif
  25. .endm
  26. .macro __THUNK_EPILOG_NAME name
  27. #ifdef CONFIG_EXPOLINE_EXTERN
  28. SYM_CODE_END(\name)
  29. EXPORT_SYMBOL(\name)
  30. #else
  31. CFI_ENDPROC
  32. .popsection
  33. #endif
  34. .endm
  35. .macro __THUNK_PROLOG_BR r1
  36. __THUNK_PROLOG_NAME __s390_indirect_jump_r\r1
  37. .endm
  38. .macro __THUNK_EPILOG_BR r1
  39. __THUNK_EPILOG_NAME __s390_indirect_jump_r\r1
  40. .endm
  41. .macro __THUNK_BR r1
  42. jg __s390_indirect_jump_r\r1
  43. .endm
  44. .macro __THUNK_BRASL r1,r2
  45. brasl \r1,__s390_indirect_jump_r\r2
  46. .endm
  47. .macro __DECODE_R expand,reg
  48. .set .L__decode_fail,1
  49. .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  50. .ifc \reg,%r\r1
  51. \expand \r1
  52. .set .L__decode_fail,0
  53. .endif
  54. .endr
  55. .if .L__decode_fail == 1
  56. .error "__DECODE_R failed"
  57. .endif
  58. .endm
  59. .macro __DECODE_RR expand,rsave,rtarget
  60. .set .L__decode_fail,1
  61. .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  62. .ifc \rsave,%r\r1
  63. .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  64. .ifc \rtarget,%r\r2
  65. \expand \r1,\r2
  66. .set .L__decode_fail,0
  67. .endif
  68. .endr
  69. .endif
  70. .endr
  71. .if .L__decode_fail == 1
  72. .error "__DECODE_RR failed"
  73. .endif
  74. .endm
  75. .macro __THUNK_EX_BR reg
  76. exrl 0,555f
  77. j .
  78. 555: br \reg
  79. .endm
  80. #ifdef CONFIG_EXPOLINE_EXTERN
  81. .macro GEN_BR_THUNK reg
  82. .endm
  83. .macro GEN_BR_THUNK_EXTERN reg
  84. #else
  85. .macro GEN_BR_THUNK reg
  86. #endif
  87. __DECODE_R __THUNK_PROLOG_BR,\reg
  88. __THUNK_EX_BR \reg
  89. __DECODE_R __THUNK_EPILOG_BR,\reg
  90. .endm
  91. .macro BR_EX reg
  92. 557: __DECODE_R __THUNK_BR,\reg
  93. .pushsection .s390_indirect_branches,"a",@progbits
  94. .long 557b-.
  95. .popsection
  96. .endm
  97. .macro BASR_EX rsave,rtarget
  98. 559: __DECODE_RR __THUNK_BRASL,\rsave,\rtarget
  99. .pushsection .s390_indirect_branches,"a",@progbits
  100. .long 559b-.
  101. .popsection
  102. .endm
  103. #else
  104. .macro GEN_BR_THUNK reg
  105. .endm
  106. .macro BR_EX reg
  107. br \reg
  108. .endm
  109. .macro BASR_EX rsave,rtarget
  110. basr \rsave,\rtarget
  111. .endm
  112. #endif /* CC_USING_EXPOLINE */
  113. #endif /* __ASSEMBLER__ */
  114. #endif /* _ASM_S390_NOSPEC_ASM_H */