tsan_rtl_aarch64.S 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. // The content of this file is AArch64-only:
  2. #if defined(__aarch64__)
  3. #include "sanitizer_common/sanitizer_asm.h"
  4. #if !defined(__APPLE__)
  5. .section .text
  6. #else
  7. .section __TEXT,__text
  8. .align 3
  9. #endif
  10. ASM_HIDDEN(__tsan_setjmp)
  11. .comm _ZN14__interception11real_setjmpE,8,8
  12. .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
  13. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
  14. ASM_SYMBOL_INTERCEPTOR(setjmp):
  15. CFI_STARTPROC
  16. // Save frame/link register
  17. stp x29, x30, [sp, -32]!
  18. CFI_DEF_CFA_OFFSET (32)
  19. CFI_OFFSET (29, -32)
  20. CFI_OFFSET (30, -24)
  21. // Adjust the SP for previous frame
  22. add x29, sp, 0
  23. CFI_DEF_CFA_REGISTER (29)
  24. // Save env parameter
  25. str x0, [sp, 16]
  26. CFI_OFFSET (0, -16)
  27. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  28. add x0, x29, 32
  29. // call tsan interceptor
  30. bl ASM_SYMBOL(__tsan_setjmp)
  31. // Restore env parameter
  32. ldr x0, [sp, 16]
  33. CFI_RESTORE (0)
  34. // Restore frame/link register
  35. ldp x29, x30, [sp], 32
  36. CFI_RESTORE (29)
  37. CFI_RESTORE (30)
  38. CFI_DEF_CFA (31, 0)
  39. // tail jump to libc setjmp
  40. #if !defined(__APPLE__)
  41. adrp x1, :got:_ZN14__interception11real_setjmpE
  42. ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE]
  43. ldr x1, [x1]
  44. #else
  45. adrp x1, _setjmp@GOTPAGE
  46. ldr x1, [x1, _setjmp@GOTPAGEOFF]
  47. #endif
  48. br x1
  49. CFI_ENDPROC
  50. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
  51. .comm _ZN14__interception12real__setjmpE,8,8
  52. .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
  53. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
  54. ASM_SYMBOL_INTERCEPTOR(_setjmp):
  55. CFI_STARTPROC
  56. // Save frame/link register
  57. stp x29, x30, [sp, -32]!
  58. CFI_DEF_CFA_OFFSET (32)
  59. CFI_OFFSET (29, -32)
  60. CFI_OFFSET (30, -24)
  61. // Adjust the SP for previous frame
  62. add x29, sp, 0
  63. CFI_DEF_CFA_REGISTER (29)
  64. // Save env parameter
  65. str x0, [sp, 16]
  66. CFI_OFFSET (0, -16)
  67. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  68. add x0, x29, 32
  69. // call tsan interceptor
  70. bl ASM_SYMBOL(__tsan_setjmp)
  71. // Restore env parameter
  72. ldr x0, [sp, 16]
  73. CFI_RESTORE (0)
  74. // Restore frame/link register
  75. ldp x29, x30, [sp], 32
  76. CFI_RESTORE (29)
  77. CFI_RESTORE (30)
  78. CFI_DEF_CFA (31, 0)
  79. // tail jump to libc setjmp
  80. #if !defined(__APPLE__)
  81. adrp x1, :got:_ZN14__interception12real__setjmpE
  82. ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE]
  83. ldr x1, [x1]
  84. #else
  85. adrp x1, __setjmp@GOTPAGE
  86. ldr x1, [x1, __setjmp@GOTPAGEOFF]
  87. #endif
  88. br x1
  89. CFI_ENDPROC
  90. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
  91. .comm _ZN14__interception14real_sigsetjmpE,8,8
  92. .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
  93. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
  94. ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
  95. CFI_STARTPROC
  96. // Save frame/link register
  97. stp x29, x30, [sp, -32]!
  98. CFI_DEF_CFA_OFFSET (32)
  99. CFI_OFFSET (29, -32)
  100. CFI_OFFSET (30, -24)
  101. // Adjust the SP for previous frame
  102. add x29, sp, 0
  103. CFI_DEF_CFA_REGISTER (29)
  104. // Save env and savesigs parameter
  105. stp x0, x1, [sp, 16]
  106. CFI_OFFSET (0, -16)
  107. CFI_OFFSET (1, -8)
  108. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  109. add x0, x29, 32
  110. // call tsan interceptor
  111. bl ASM_SYMBOL(__tsan_setjmp)
  112. // Restore env and savesigs parameter
  113. ldp x0, x1, [sp, 16]
  114. CFI_RESTORE (0)
  115. CFI_RESTORE (1)
  116. // Restore frame/link register
  117. ldp x29, x30, [sp], 32
  118. CFI_RESTORE (29)
  119. CFI_RESTORE (30)
  120. CFI_DEF_CFA (31, 0)
  121. // tail jump to libc sigsetjmp
  122. #if !defined(__APPLE__)
  123. adrp x2, :got:_ZN14__interception14real_sigsetjmpE
  124. ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE]
  125. ldr x2, [x2]
  126. #else
  127. adrp x2, _sigsetjmp@GOTPAGE
  128. ldr x2, [x2, _sigsetjmp@GOTPAGEOFF]
  129. #endif
  130. br x2
  131. CFI_ENDPROC
  132. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
  133. #if !defined(__APPLE__)
  134. .comm _ZN14__interception16real___sigsetjmpE,8,8
  135. .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
  136. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
  137. ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
  138. CFI_STARTPROC
  139. // Save frame/link register
  140. stp x29, x30, [sp, -32]!
  141. CFI_DEF_CFA_OFFSET (32)
  142. CFI_OFFSET (29, -32)
  143. CFI_OFFSET (30, -24)
  144. // Adjust the SP for previous frame
  145. add x29, sp, 0
  146. CFI_DEF_CFA_REGISTER (29)
  147. // Save env and savesigs parameter
  148. stp x0, x1, [sp, 16]
  149. CFI_OFFSET (0, -16)
  150. CFI_OFFSET (1, -8)
  151. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  152. add x0, x29, 32
  153. // call tsan interceptor
  154. bl ASM_SYMBOL(__tsan_setjmp)
  155. // Restore env and savesigs parameter
  156. ldp x0, x1, [sp, 16]
  157. CFI_RESTORE (0)
  158. CFI_RESTORE (1)
  159. // Restore frame/link register
  160. ldp x29, x30, [sp], 32
  161. CFI_RESTORE (29)
  162. CFI_RESTORE (30)
  163. CFI_DEF_CFA (31, 0)
  164. // tail jump to libc __sigsetjmp
  165. #if !defined(__APPLE__)
  166. adrp x2, :got:_ZN14__interception16real___sigsetjmpE
  167. ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE]
  168. ldr x2, [x2]
  169. #else
  170. adrp x2, ASM_SYMBOL(__sigsetjmp)@page
  171. add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff
  172. #endif
  173. br x2
  174. CFI_ENDPROC
  175. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
  176. #endif
  177. NO_EXEC_STACK_DIRECTIVE
  178. #endif