tsan_rtl_loongarch64.S 4.3 KB

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