nospec-insn.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_S390_NOSPEC_ASM_H
  3. #define _ASM_S390_NOSPEC_ASM_H
  4. #include <asm/alternative-asm.h>
  5. #include <asm/asm-offsets.h>
  6. #include <asm/dwarf.h>
  7. #ifdef __ASSEMBLY__
  8. #ifdef CC_USING_EXPOLINE
  9. _LC_BR_R1 = __LC_BR_R1
  10. /*
  11. * The expoline macros are used to create thunks in the same format
  12. * as gcc generates them. The 'comdat' section flag makes sure that
  13. * the various thunks are merged into a single copy.
  14. */
  15. .macro __THUNK_PROLOG_NAME name
  16. .pushsection .text.\name,"axG",@progbits,\name,comdat
  17. .globl \name
  18. .hidden \name
  19. .type \name,@function
  20. \name:
  21. CFI_STARTPROC
  22. .endm
  23. .macro __THUNK_EPILOG
  24. CFI_ENDPROC
  25. .popsection
  26. .endm
  27. .macro __THUNK_PROLOG_BR r1,r2
  28. __THUNK_PROLOG_NAME __s390x_indirect_jump_r\r2\()use_r\r1
  29. .endm
  30. .macro __THUNK_PROLOG_BC d0,r1,r2
  31. __THUNK_PROLOG_NAME __s390x_indirect_branch_\d0\()_\r2\()use_\r1
  32. .endm
  33. .macro __THUNK_BR r1,r2
  34. jg __s390x_indirect_jump_r\r2\()use_r\r1
  35. .endm
  36. .macro __THUNK_BC d0,r1,r2
  37. jg __s390x_indirect_branch_\d0\()_\r2\()use_\r1
  38. .endm
  39. .macro __THUNK_BRASL r1,r2,r3
  40. brasl \r1,__s390x_indirect_jump_r\r3\()use_r\r2
  41. .endm
  42. .macro __DECODE_RR expand,reg,ruse
  43. .set __decode_fail,1
  44. .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  45. .ifc \reg,%r\r1
  46. .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  47. .ifc \ruse,%r\r2
  48. \expand \r1,\r2
  49. .set __decode_fail,0
  50. .endif
  51. .endr
  52. .endif
  53. .endr
  54. .if __decode_fail == 1
  55. .error "__DECODE_RR failed"
  56. .endif
  57. .endm
  58. .macro __DECODE_RRR expand,rsave,rtarget,ruse
  59. .set __decode_fail,1
  60. .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  61. .ifc \rsave,%r\r1
  62. .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  63. .ifc \rtarget,%r\r2
  64. .irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  65. .ifc \ruse,%r\r3
  66. \expand \r1,\r2,\r3
  67. .set __decode_fail,0
  68. .endif
  69. .endr
  70. .endif
  71. .endr
  72. .endif
  73. .endr
  74. .if __decode_fail == 1
  75. .error "__DECODE_RRR failed"
  76. .endif
  77. .endm
  78. .macro __DECODE_DRR expand,disp,reg,ruse
  79. .set __decode_fail,1
  80. .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  81. .ifc \reg,%r\r1
  82. .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  83. .ifc \ruse,%r\r2
  84. \expand \disp,\r1,\r2
  85. .set __decode_fail,0
  86. .endif
  87. .endr
  88. .endif
  89. .endr
  90. .if __decode_fail == 1
  91. .error "__DECODE_DRR failed"
  92. .endif
  93. .endm
  94. .macro __THUNK_EX_BR reg,ruse
  95. # Be very careful when adding instructions to this macro!
  96. # The ALTERNATIVE replacement code has a .+10 which targets
  97. # the "br \reg" after the code has been patched.
  98. #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
  99. exrl 0,555f
  100. j .
  101. #else
  102. .ifc \reg,%r1
  103. ALTERNATIVE "ex %r0,_LC_BR_R1", ".insn ril,0xc60000000000,0,.+10", 35
  104. j .
  105. .else
  106. larl \ruse,555f
  107. ex 0,0(\ruse)
  108. j .
  109. .endif
  110. #endif
  111. 555: br \reg
  112. .endm
  113. .macro __THUNK_EX_BC disp,reg,ruse
  114. #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
  115. exrl 0,556f
  116. j .
  117. #else
  118. larl \ruse,556f
  119. ex 0,0(\ruse)
  120. j .
  121. #endif
  122. 556: b \disp(\reg)
  123. .endm
  124. .macro GEN_BR_THUNK reg,ruse=%r1
  125. __DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse
  126. __THUNK_EX_BR \reg,\ruse
  127. __THUNK_EPILOG
  128. .endm
  129. .macro GEN_B_THUNK disp,reg,ruse=%r1
  130. __DECODE_DRR __THUNK_PROLOG_BC,\disp,\reg,\ruse
  131. __THUNK_EX_BC \disp,\reg,\ruse
  132. __THUNK_EPILOG
  133. .endm
  134. .macro BR_EX reg,ruse=%r1
  135. 557: __DECODE_RR __THUNK_BR,\reg,\ruse
  136. .pushsection .s390_indirect_branches,"a",@progbits
  137. .long 557b-.
  138. .popsection
  139. .endm
  140. .macro B_EX disp,reg,ruse=%r1
  141. 558: __DECODE_DRR __THUNK_BC,\disp,\reg,\ruse
  142. .pushsection .s390_indirect_branches,"a",@progbits
  143. .long 558b-.
  144. .popsection
  145. .endm
  146. .macro BASR_EX rsave,rtarget,ruse=%r1
  147. 559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse
  148. .pushsection .s390_indirect_branches,"a",@progbits
  149. .long 559b-.
  150. .popsection
  151. .endm
  152. #else
  153. .macro GEN_BR_THUNK reg,ruse=%r1
  154. .endm
  155. .macro GEN_B_THUNK disp,reg,ruse=%r1
  156. .endm
  157. .macro BR_EX reg,ruse=%r1
  158. br \reg
  159. .endm
  160. .macro B_EX disp,reg,ruse=%r1
  161. b \disp(\reg)
  162. .endm
  163. .macro BASR_EX rsave,rtarget,ruse=%r1
  164. basr \rsave,\rtarget
  165. .endm
  166. #endif /* CC_USING_EXPOLINE */
  167. #endif /* __ASSEMBLY__ */
  168. #endif /* _ASM_S390_NOSPEC_ASM_H */