tsan_rtl_riscv64.S 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "sanitizer_common/sanitizer_asm.h"
  2. .section .text
  3. .comm _ZN14__interception11real_setjmpE,8,8
  4. .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
  5. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
  6. ASM_SYMBOL_INTERCEPTOR(setjmp):
  7. CFI_STARTPROC
  8. // Save frame pointer and return address register
  9. addi sp, sp, -32
  10. sd ra, 24(sp)
  11. sd s0, 16(sp)
  12. CFI_DEF_CFA_OFFSET (32)
  13. CFI_OFFSET (1, -8)
  14. CFI_OFFSET (8, -16)
  15. // Adjust the SP for previous frame
  16. addi s0, sp, 32
  17. CFI_DEF_CFA_REGISTER (8)
  18. // Save env parameter
  19. sd a0, 8(sp)
  20. CFI_OFFSET (10, -24)
  21. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  22. addi a0, s0, 0
  23. // call tsan interceptor
  24. call ASM_SYMBOL(__tsan_setjmp)
  25. // Restore env parameter
  26. ld a0, 8(sp)
  27. CFI_RESTORE (10)
  28. // Restore frame/link register
  29. ld s0, 16(sp)
  30. ld ra, 24(sp)
  31. addi sp, sp, 32
  32. CFI_RESTORE (8)
  33. CFI_RESTORE (1)
  34. CFI_DEF_CFA (2, 0)
  35. // tail jump to libc setjmp
  36. la t1, _ZN14__interception11real_setjmpE
  37. ld t1, 0(t1)
  38. jr t1
  39. CFI_ENDPROC
  40. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
  41. .comm _ZN14__interception12real__setjmpE,8,8
  42. .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
  43. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
  44. ASM_SYMBOL_INTERCEPTOR(_setjmp):
  45. CFI_STARTPROC
  46. // Save frame pointer and return address register
  47. addi sp, sp, -32
  48. sd ra, 24(sp)
  49. sd s0, 16(sp)
  50. CFI_DEF_CFA_OFFSET (32)
  51. CFI_OFFSET (1, -8)
  52. CFI_OFFSET (8, -16)
  53. // Adjust the SP for previous frame
  54. addi s0, sp, 32
  55. CFI_DEF_CFA_REGISTER (8)
  56. // Save env parameter
  57. sd a0, 8(sp)
  58. CFI_OFFSET (10, -24)
  59. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  60. addi a0, s0, 0
  61. // call tsan interceptor
  62. call ASM_SYMBOL(__tsan_setjmp)
  63. // Restore env parameter
  64. ld a0, 8(sp)
  65. CFI_RESTORE (10)
  66. // Restore frame/link register
  67. ld s0, 16(sp)
  68. ld ra, 24(sp)
  69. addi sp, sp, 32
  70. CFI_RESTORE (8)
  71. CFI_RESTORE (1)
  72. CFI_DEF_CFA (2, 0)
  73. // tail jump to libc setjmp
  74. la t1, _ZN14__interception12real__setjmpE
  75. ld t1, 0(t1)
  76. jr t1
  77. CFI_ENDPROC
  78. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
  79. .comm _ZN14__interception14real_sigsetjmpE,8,8
  80. .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
  81. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
  82. ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
  83. CFI_STARTPROC
  84. // Save frame pointer and return address register
  85. addi sp, sp, -32
  86. sd ra, 24(sp)
  87. sd s0, 16(sp)
  88. CFI_DEF_CFA_OFFSET (32)
  89. CFI_OFFSET (1, -8)
  90. CFI_OFFSET (8, -16)
  91. // Adjust the SP for previous frame
  92. addi s0, sp, 32
  93. CFI_DEF_CFA_REGISTER (8)
  94. // Save env parameter
  95. sd a0, 8(sp)
  96. sd a1, 0(sp)
  97. CFI_OFFSET (10, -24)
  98. CFI_OFFSET (11, -32)
  99. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  100. addi a0, s0, 0
  101. // call tsan interceptor
  102. call ASM_SYMBOL(__tsan_setjmp)
  103. // Restore env parameter
  104. ld a0, 8(sp)
  105. ld a1, 0(sp)
  106. CFI_RESTORE (10)
  107. CFI_RESTORE (11)
  108. // Restore frame/link register
  109. ld s0, 16(sp)
  110. ld ra, 24(sp)
  111. addi sp, sp, 32
  112. CFI_RESTORE (8)
  113. CFI_RESTORE (1)
  114. CFI_DEF_CFA (2, 0)
  115. // tail jump to libc setjmp
  116. la t1, _ZN14__interception14real_sigsetjmpE
  117. ld t1, 0(t1)
  118. jr t1
  119. CFI_ENDPROC
  120. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
  121. .comm _ZN14__interception16real___sigsetjmpE,8,8
  122. .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
  123. ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
  124. ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
  125. CFI_STARTPROC
  126. // Save frame pointer and return address register
  127. addi sp, sp, -32
  128. sd ra, 24(sp)
  129. sd s0, 16(sp)
  130. CFI_DEF_CFA_OFFSET (32)
  131. CFI_OFFSET (1, -8)
  132. CFI_OFFSET (8, -16)
  133. // Adjust the SP for previous frame
  134. addi s0, sp, 32
  135. CFI_DEF_CFA_REGISTER (8)
  136. // Save env parameter
  137. sd a0, 8(sp)
  138. sd a1, 0(sp)
  139. CFI_OFFSET (10, -24)
  140. CFI_OFFSET (11, -32)
  141. // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
  142. addi a0, s0, 0
  143. // call tsan interceptor
  144. call ASM_SYMBOL(__tsan_setjmp)
  145. // Restore env parameter
  146. ld a0, 8(sp)
  147. ld a1, 0(sp)
  148. CFI_RESTORE (10)
  149. CFI_RESTORE (11)
  150. // Restore frame/link register
  151. ld s0, 16(sp)
  152. ld ra, 24(sp)
  153. addi sp, sp, 32
  154. CFI_RESTORE (8)
  155. CFI_RESTORE (1)
  156. CFI_DEF_CFA (2, 0)
  157. // tail jump to libc setjmp
  158. la t1, _ZN14__interception16real___sigsetjmpE
  159. ld t1, 0(t1)
  160. jr t1
  161. CFI_ENDPROC
  162. ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))