nospec-insn.h 2.4 KB

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