xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_rtl_loongarch64.S (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1*bdd1243dSDimitry Andric#include "sanitizer_common/sanitizer_asm.h"
2*bdd1243dSDimitry Andric
3*bdd1243dSDimitry Andric.section .text
4*bdd1243dSDimitry Andric
5*bdd1243dSDimitry AndricASM_HIDDEN(__tsan_setjmp)
6*bdd1243dSDimitry Andric.comm _ZN14__interception11real_setjmpE,8,8
7*bdd1243dSDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(setjmp)
8*bdd1243dSDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
9*bdd1243dSDimitry AndricASM_SYMBOL_INTERCEPTOR(setjmp):
10*bdd1243dSDimitry Andric  CFI_STARTPROC
11*bdd1243dSDimitry Andric
12*bdd1243dSDimitry Andric  // Save frame pointer and return address register
13*bdd1243dSDimitry Andric  addi.d $sp, $sp, -32
14*bdd1243dSDimitry Andric  st.d $ra, $sp, 24
15*bdd1243dSDimitry Andric  st.d $fp, $sp, 16
16*bdd1243dSDimitry Andric  CFI_DEF_CFA_OFFSET (32)
17*bdd1243dSDimitry Andric  CFI_OFFSET (1, -8)
18*bdd1243dSDimitry Andric  CFI_OFFSET (22, -16)
19*bdd1243dSDimitry Andric
20*bdd1243dSDimitry Andric  // Adjust the SP for previous frame
21*bdd1243dSDimitry Andric  addi.d $fp, $sp, 32
22*bdd1243dSDimitry Andric  CFI_DEF_CFA_REGISTER (22)
23*bdd1243dSDimitry Andric
24*bdd1243dSDimitry Andric  // Save env parameter
25*bdd1243dSDimitry Andric  st.d $a0, $sp, 8
26*bdd1243dSDimitry Andric  CFI_OFFSET (4, -24)
27*bdd1243dSDimitry Andric
28*bdd1243dSDimitry Andric  // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
29*bdd1243dSDimitry Andric  addi.d  $a0, $fp, 0
30*bdd1243dSDimitry Andric
31*bdd1243dSDimitry Andric  // call tsan interceptor
32*bdd1243dSDimitry Andric  bl      ASM_SYMBOL(__tsan_setjmp)
33*bdd1243dSDimitry Andric
34*bdd1243dSDimitry Andric  // Restore env parameter
35*bdd1243dSDimitry Andric  ld.d $a0, $sp, 8
36*bdd1243dSDimitry Andric  CFI_RESTORE (4)
37*bdd1243dSDimitry Andric
38*bdd1243dSDimitry Andric  // Restore frame/link register
39*bdd1243dSDimitry Andric  ld.d $fp, $sp, 16
40*bdd1243dSDimitry Andric  ld.d $ra, $sp, 24
41*bdd1243dSDimitry Andric  addi.d $sp, $sp, 32
42*bdd1243dSDimitry Andric  CFI_RESTORE (22)
43*bdd1243dSDimitry Andric  CFI_RESTORE (1)
44*bdd1243dSDimitry Andric  CFI_DEF_CFA (3, 0)
45*bdd1243dSDimitry Andric
46*bdd1243dSDimitry Andric  // tail jump to libc setjmp
47*bdd1243dSDimitry Andric  la.local $a1, _ZN14__interception11real_setjmpE
48*bdd1243dSDimitry Andric  ld.d $a1, $a1, 0
49*bdd1243dSDimitry Andric  jr $a1
50*bdd1243dSDimitry Andric
51*bdd1243dSDimitry Andric  CFI_ENDPROC
52*bdd1243dSDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
53*bdd1243dSDimitry Andric
54*bdd1243dSDimitry Andric.comm _ZN14__interception12real__setjmpE,8,8
55*bdd1243dSDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
56*bdd1243dSDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
57*bdd1243dSDimitry AndricASM_SYMBOL_INTERCEPTOR(_setjmp):
58*bdd1243dSDimitry Andric  CFI_STARTPROC
59*bdd1243dSDimitry Andric
60*bdd1243dSDimitry Andric  // Save frame pointer and return address register
61*bdd1243dSDimitry Andric  addi.d $sp, $sp, -32
62*bdd1243dSDimitry Andric  st.d $ra, $sp, 24
63*bdd1243dSDimitry Andric  st.d $fp, $sp, 16
64*bdd1243dSDimitry Andric  CFI_DEF_CFA_OFFSET (32)
65*bdd1243dSDimitry Andric  CFI_OFFSET (1, -8)
66*bdd1243dSDimitry Andric  CFI_OFFSET (22, -16)
67*bdd1243dSDimitry Andric
68*bdd1243dSDimitry Andric  // Adjust the SP for previous frame
69*bdd1243dSDimitry Andric  addi.d $fp, $sp, 32
70*bdd1243dSDimitry Andric  CFI_DEF_CFA_REGISTER (22)
71*bdd1243dSDimitry Andric
72*bdd1243dSDimitry Andric  // Save env parameter
73*bdd1243dSDimitry Andric  st.d $a0, $sp, 8
74*bdd1243dSDimitry Andric  CFI_OFFSET (4, -24)
75*bdd1243dSDimitry Andric
76*bdd1243dSDimitry Andric  // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
77*bdd1243dSDimitry Andric  addi.d  $a0, $fp, 0
78*bdd1243dSDimitry Andric
79*bdd1243dSDimitry Andric  // call tsan interceptor
80*bdd1243dSDimitry Andric  bl      ASM_SYMBOL(__tsan_setjmp)
81*bdd1243dSDimitry Andric
82*bdd1243dSDimitry Andric  // Restore env parameter
83*bdd1243dSDimitry Andric  ld.d $a0, $sp, 8
84*bdd1243dSDimitry Andric  CFI_RESTORE (4)
85*bdd1243dSDimitry Andric
86*bdd1243dSDimitry Andric  // Restore frame/link register
87*bdd1243dSDimitry Andric  ld.d $fp, $sp, 16
88*bdd1243dSDimitry Andric  ld.d $ra, $sp, 24
89*bdd1243dSDimitry Andric  addi.d $sp, $sp, 32
90*bdd1243dSDimitry Andric  CFI_RESTORE (22)
91*bdd1243dSDimitry Andric  CFI_RESTORE (1)
92*bdd1243dSDimitry Andric  CFI_DEF_CFA (3, 0)
93*bdd1243dSDimitry Andric
94*bdd1243dSDimitry Andric  // tail jump to libc setjmp
95*bdd1243dSDimitry Andric  la.local $a1, _ZN14__interception12real__setjmpE
96*bdd1243dSDimitry Andric  ld.d $a1, $a1, 0
97*bdd1243dSDimitry Andric  jr $a1
98*bdd1243dSDimitry Andric
99*bdd1243dSDimitry Andric  CFI_ENDPROC
100*bdd1243dSDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
101*bdd1243dSDimitry Andric
102*bdd1243dSDimitry Andric.comm _ZN14__interception14real_sigsetjmpE,8,8
103*bdd1243dSDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
104*bdd1243dSDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
105*bdd1243dSDimitry AndricASM_SYMBOL_INTERCEPTOR(sigsetjmp):
106*bdd1243dSDimitry Andric  CFI_STARTPROC
107*bdd1243dSDimitry Andric
108*bdd1243dSDimitry Andric  // Save frame pointer and return address register
109*bdd1243dSDimitry Andric  addi.d $sp, $sp, -32
110*bdd1243dSDimitry Andric  st.d $ra, $sp, 24
111*bdd1243dSDimitry Andric  st.d $fp, $sp, 16
112*bdd1243dSDimitry Andric  CFI_DEF_CFA_OFFSET (32)
113*bdd1243dSDimitry Andric  CFI_OFFSET (1, -8)
114*bdd1243dSDimitry Andric  CFI_OFFSET (22, -16)
115*bdd1243dSDimitry Andric
116*bdd1243dSDimitry Andric  // Adjust the SP for previous frame
117*bdd1243dSDimitry Andric  addi.d $fp, $sp, 32
118*bdd1243dSDimitry Andric  CFI_DEF_CFA_REGISTER (22)
119*bdd1243dSDimitry Andric
120*bdd1243dSDimitry Andric  // Save env parameter
121*bdd1243dSDimitry Andric  st.d $a0, $sp, 8
122*bdd1243dSDimitry Andric  CFI_OFFSET (4, -24)
123*bdd1243dSDimitry Andric
124*bdd1243dSDimitry Andric  // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
125*bdd1243dSDimitry Andric  addi.d  $a0, $fp, 0
126*bdd1243dSDimitry Andric
127*bdd1243dSDimitry Andric  // call tsan interceptor
128*bdd1243dSDimitry Andric  bl      ASM_SYMBOL(__tsan_setjmp)
129*bdd1243dSDimitry Andric
130*bdd1243dSDimitry Andric  // Restore env parameter
131*bdd1243dSDimitry Andric  ld.d $a0, $sp, 8
132*bdd1243dSDimitry Andric  CFI_RESTORE (4)
133*bdd1243dSDimitry Andric
134*bdd1243dSDimitry Andric  // Restore frame/link register
135*bdd1243dSDimitry Andric  ld.d $fp, $sp, 16
136*bdd1243dSDimitry Andric  ld.d $ra, $sp, 24
137*bdd1243dSDimitry Andric  addi.d $sp, $sp, 32
138*bdd1243dSDimitry Andric  CFI_RESTORE (22)
139*bdd1243dSDimitry Andric  CFI_RESTORE (1)
140*bdd1243dSDimitry Andric  CFI_DEF_CFA (3, 0)
141*bdd1243dSDimitry Andric
142*bdd1243dSDimitry Andric  // tail jump to libc setjmp
143*bdd1243dSDimitry Andric  la.local $a1, _ZN14__interception14real_sigsetjmpE
144*bdd1243dSDimitry Andric  ld.d $a1, $a1, 0
145*bdd1243dSDimitry Andric  jr $a1
146*bdd1243dSDimitry Andric
147*bdd1243dSDimitry Andric  CFI_ENDPROC
148*bdd1243dSDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
149*bdd1243dSDimitry Andric
150*bdd1243dSDimitry Andric.comm _ZN14__interception16real___sigsetjmpE,8,8
151*bdd1243dSDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
152*bdd1243dSDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
153*bdd1243dSDimitry AndricASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
154*bdd1243dSDimitry Andric  CFI_STARTPROC
155*bdd1243dSDimitry Andric
156*bdd1243dSDimitry Andric  // Save frame pointer and return address register
157*bdd1243dSDimitry Andric  addi.d $sp, $sp, -32
158*bdd1243dSDimitry Andric  st.d $ra, $sp, 24
159*bdd1243dSDimitry Andric  st.d $fp, $sp, 16
160*bdd1243dSDimitry Andric  CFI_DEF_CFA_OFFSET (32)
161*bdd1243dSDimitry Andric  CFI_OFFSET (1, -8)
162*bdd1243dSDimitry Andric  CFI_OFFSET (22, -16)
163*bdd1243dSDimitry Andric
164*bdd1243dSDimitry Andric  // Adjust the SP for previous frame
165*bdd1243dSDimitry Andric  addi.d $fp, $sp, 32
166*bdd1243dSDimitry Andric  CFI_DEF_CFA_REGISTER (22)
167*bdd1243dSDimitry Andric
168*bdd1243dSDimitry Andric  // Save env parameter
169*bdd1243dSDimitry Andric  st.d $a0, $sp, 8
170*bdd1243dSDimitry Andric  CFI_OFFSET (4, -24)
171*bdd1243dSDimitry Andric
172*bdd1243dSDimitry Andric  // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
173*bdd1243dSDimitry Andric  addi.d  $a0, $fp, 0
174*bdd1243dSDimitry Andric
175*bdd1243dSDimitry Andric  // call tsan interceptor
176*bdd1243dSDimitry Andric  bl      ASM_SYMBOL(__tsan_setjmp)
177*bdd1243dSDimitry Andric
178*bdd1243dSDimitry Andric  // Restore env parameter
179*bdd1243dSDimitry Andric  ld.d $a0, $sp, 8
180*bdd1243dSDimitry Andric  CFI_RESTORE (4)
181*bdd1243dSDimitry Andric
182*bdd1243dSDimitry Andric  // Restore frame/link register
183*bdd1243dSDimitry Andric  ld.d $fp, $sp, 16
184*bdd1243dSDimitry Andric  ld.d $ra, $sp, 24
185*bdd1243dSDimitry Andric  addi.d $sp, $sp, 32
186*bdd1243dSDimitry Andric  CFI_RESTORE (22)
187*bdd1243dSDimitry Andric  CFI_RESTORE (1)
188*bdd1243dSDimitry Andric  CFI_DEF_CFA (3, 0)
189*bdd1243dSDimitry Andric
190*bdd1243dSDimitry Andric  // tail jump to libc setjmp
191*bdd1243dSDimitry Andric  la.local $a1, _ZN14__interception16real___sigsetjmpE
192*bdd1243dSDimitry Andric  ld.d $a1, $a1, 0
193*bdd1243dSDimitry Andric  jr $a1
194*bdd1243dSDimitry Andric
195*bdd1243dSDimitry Andric  CFI_ENDPROC
196*bdd1243dSDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
197