xref: /freebsd/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_rtl_mips64.S (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric.section .text
2*0b57cec5SDimitry Andric.set noreorder
3*0b57cec5SDimitry Andric
4*0b57cec5SDimitry Andric.hidden __tsan_setjmp
5*0b57cec5SDimitry Andric.comm _ZN14__interception11real_setjmpE,8,8
6*0b57cec5SDimitry Andric.globl setjmp
7*0b57cec5SDimitry Andric.type setjmp, @function
8*0b57cec5SDimitry Andricsetjmp:
9*0b57cec5SDimitry Andric
10*0b57cec5SDimitry Andric  // save env parameters
11*0b57cec5SDimitry Andric  daddiu $sp,$sp,-40
12*0b57cec5SDimitry Andric  sd $s0,32($sp)
13*0b57cec5SDimitry Andric  sd $ra,24($sp)
14*0b57cec5SDimitry Andric  sd $fp,16($sp)
15*0b57cec5SDimitry Andric  sd $gp,8($sp)
16*0b57cec5SDimitry Andric
17*0b57cec5SDimitry Andric  // calculate and save pointer to GOT
18*0b57cec5SDimitry Andric  lui $gp,%hi(%neg(%gp_rel(setjmp)))
19*0b57cec5SDimitry Andric  daddu $gp,$gp,$t9
20*0b57cec5SDimitry Andric  daddiu $gp,$gp,%lo(%neg(%gp_rel(setjmp)))
21*0b57cec5SDimitry Andric  move $s0,$gp
22*0b57cec5SDimitry Andric
23*0b57cec5SDimitry Andric  // save jmp_buf
24*0b57cec5SDimitry Andric  sd $a0,0($sp)
25*0b57cec5SDimitry Andric
26*0b57cec5SDimitry Andric  // obtain $sp
27*0b57cec5SDimitry Andric  dadd $a0,$zero,$sp
28*0b57cec5SDimitry Andric
29*0b57cec5SDimitry Andric  // call tsan interceptor
30*0b57cec5SDimitry Andric  jal __tsan_setjmp
31*0b57cec5SDimitry Andric  daddiu $a1,$a0,40
32*0b57cec5SDimitry Andric
33*0b57cec5SDimitry Andric  // restore jmp_buf
34*0b57cec5SDimitry Andric  ld $a0,0($sp)
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andric  // restore gp
37*0b57cec5SDimitry Andric  move $gp,$s0
38*0b57cec5SDimitry Andric
39*0b57cec5SDimitry Andric  // load pointer of libc setjmp to t9
40*0b57cec5SDimitry Andric  dla $t9,(_ZN14__interception11real_setjmpE)
41*0b57cec5SDimitry Andric
42*0b57cec5SDimitry Andric  // restore env parameters
43*0b57cec5SDimitry Andric  ld $gp,8($sp)
44*0b57cec5SDimitry Andric  ld $fp,16($sp)
45*0b57cec5SDimitry Andric  ld $ra,24($sp)
46*0b57cec5SDimitry Andric  ld $s0,32($sp)
47*0b57cec5SDimitry Andric  daddiu $sp,$sp,40
48*0b57cec5SDimitry Andric
49*0b57cec5SDimitry Andric  // tail jump to libc setjmp
50*0b57cec5SDimitry Andric  ld $t9,0($t9)
51*0b57cec5SDimitry Andric  jr $t9
52*0b57cec5SDimitry Andric  nop
53*0b57cec5SDimitry Andric
54*0b57cec5SDimitry Andric.size setjmp, .-setjmp
55*0b57cec5SDimitry Andric
56*0b57cec5SDimitry Andric.hidden __tsan_setjmp
57*0b57cec5SDimitry Andric.globl _setjmp
58*0b57cec5SDimitry Andric.comm _ZN14__interception12real__setjmpE,8,8
59*0b57cec5SDimitry Andric.type _setjmp, @function
60*0b57cec5SDimitry Andric_setjmp:
61*0b57cec5SDimitry Andric
62*0b57cec5SDimitry Andric  // Save env parameters
63*0b57cec5SDimitry Andric  daddiu $sp,$sp,-40
64*0b57cec5SDimitry Andric  sd $s0,32($sp)
65*0b57cec5SDimitry Andric  sd $ra,24($sp)
66*0b57cec5SDimitry Andric  sd $fp,16($sp)
67*0b57cec5SDimitry Andric  sd $gp,8($sp)
68*0b57cec5SDimitry Andric
69*0b57cec5SDimitry Andric  // calculate and save pointer to GOT
70*0b57cec5SDimitry Andric  lui $gp,%hi(%neg(%gp_rel(_setjmp)))
71*0b57cec5SDimitry Andric  daddu $gp,$gp,$t9
72*0b57cec5SDimitry Andric  daddiu $gp,$gp,%lo(%neg(%gp_rel(_setjmp)))
73*0b57cec5SDimitry Andric  move $s0,$gp
74*0b57cec5SDimitry Andric
75*0b57cec5SDimitry Andric  // save jmp_buf
76*0b57cec5SDimitry Andric  sd $a0,0($sp)
77*0b57cec5SDimitry Andric
78*0b57cec5SDimitry Andric  // obtain $sp
79*0b57cec5SDimitry Andric  dadd $a0,$zero,$sp
80*0b57cec5SDimitry Andric
81*0b57cec5SDimitry Andric  // call tsan interceptor
82*0b57cec5SDimitry Andric  jal __tsan_setjmp
83*0b57cec5SDimitry Andric  daddiu $a1,$a0,40
84*0b57cec5SDimitry Andric
85*0b57cec5SDimitry Andric  // restore jmp_buf
86*0b57cec5SDimitry Andric  ld $a0,0($sp)
87*0b57cec5SDimitry Andric
88*0b57cec5SDimitry Andric  // restore gp
89*0b57cec5SDimitry Andric  move $gp,$s0
90*0b57cec5SDimitry Andric
91*0b57cec5SDimitry Andric  // load pointer of libc _setjmp to t9
92*0b57cec5SDimitry Andric  dla $t9,(_ZN14__interception12real__setjmpE)
93*0b57cec5SDimitry Andric
94*0b57cec5SDimitry Andric  // restore env parameters
95*0b57cec5SDimitry Andric  ld $gp,8($sp)
96*0b57cec5SDimitry Andric  ld $fp,16($sp)
97*0b57cec5SDimitry Andric  ld $ra,24($sp)
98*0b57cec5SDimitry Andric  ld $s0,32($sp)
99*0b57cec5SDimitry Andric  daddiu $sp,$sp,40
100*0b57cec5SDimitry Andric
101*0b57cec5SDimitry Andric  // tail jump to libc _setjmp
102*0b57cec5SDimitry Andric  ld $t9,0($t9)
103*0b57cec5SDimitry Andric  jr $t9
104*0b57cec5SDimitry Andric  nop
105*0b57cec5SDimitry Andric
106*0b57cec5SDimitry Andric.size _setjmp, .-_setjmp
107*0b57cec5SDimitry Andric
108*0b57cec5SDimitry Andric.hidden __tsan_setjmp
109*0b57cec5SDimitry Andric.globl sigsetjmp
110*0b57cec5SDimitry Andric.comm _ZN14__interception14real_sigsetjmpE,8,8
111*0b57cec5SDimitry Andric.type sigsetjmp, @function
112*0b57cec5SDimitry Andricsigsetjmp:
113*0b57cec5SDimitry Andric
114*0b57cec5SDimitry Andric  // Save env parameters
115*0b57cec5SDimitry Andric  daddiu $sp,$sp,-48
116*0b57cec5SDimitry Andric  sd $s0,40($sp)
117*0b57cec5SDimitry Andric  sd $ra,32($sp)
118*0b57cec5SDimitry Andric  sd $fp,24($sp)
119*0b57cec5SDimitry Andric  sd $gp,16($sp)
120*0b57cec5SDimitry Andric
121*0b57cec5SDimitry Andric  // calculate and save pointer to GOT
122*0b57cec5SDimitry Andric  lui $gp,%hi(%neg(%gp_rel(sigsetjmp)))
123*0b57cec5SDimitry Andric  daddu $gp,$gp,$t9
124*0b57cec5SDimitry Andric  daddiu $gp,$gp,%lo(%neg(%gp_rel(sigsetjmp)))
125*0b57cec5SDimitry Andric  move $s0,$gp
126*0b57cec5SDimitry Andric
127*0b57cec5SDimitry Andric  // save jmp_buf and savesig
128*0b57cec5SDimitry Andric  sd $a0,0($sp)
129*0b57cec5SDimitry Andric  sd $a1,8($sp)
130*0b57cec5SDimitry Andric
131*0b57cec5SDimitry Andric  // obtain $sp
132*0b57cec5SDimitry Andric  dadd $a0,$zero,$sp
133*0b57cec5SDimitry Andric
134*0b57cec5SDimitry Andric  // call tsan interceptor
135*0b57cec5SDimitry Andric  jal __tsan_setjmp
136*0b57cec5SDimitry Andric  daddiu $a1,$a0,48
137*0b57cec5SDimitry Andric
138*0b57cec5SDimitry Andric  // restore jmp_buf and savesig
139*0b57cec5SDimitry Andric  ld $a0,0($sp)
140*0b57cec5SDimitry Andric  ld $a1,8($sp)
141*0b57cec5SDimitry Andric
142*0b57cec5SDimitry Andric  // restore gp
143*0b57cec5SDimitry Andric  move $gp,$s0
144*0b57cec5SDimitry Andric
145*0b57cec5SDimitry Andric  // load pointer of libc sigsetjmp to t9
146*0b57cec5SDimitry Andric  dla $t9,(_ZN14__interception14real_sigsetjmpE)
147*0b57cec5SDimitry Andric
148*0b57cec5SDimitry Andric  // restore env parameters
149*0b57cec5SDimitry Andric  ld $gp,16($sp)
150*0b57cec5SDimitry Andric  ld $fp,24($sp)
151*0b57cec5SDimitry Andric  ld $ra,32($sp)
152*0b57cec5SDimitry Andric  ld $s0,40($sp)
153*0b57cec5SDimitry Andric  daddiu $sp,$sp,48
154*0b57cec5SDimitry Andric
155*0b57cec5SDimitry Andric  // tail jump to libc sigsetjmp
156*0b57cec5SDimitry Andric  ld $t9,0($t9)
157*0b57cec5SDimitry Andric  jr $t9
158*0b57cec5SDimitry Andric  nop
159*0b57cec5SDimitry Andric
160*0b57cec5SDimitry Andric.size sigsetjmp, .-sigsetjmp
161*0b57cec5SDimitry Andric
162*0b57cec5SDimitry Andric.hidden __tsan_setjmp
163*0b57cec5SDimitry Andric.comm _ZN14__interception16real___sigsetjmpE,8,8
164*0b57cec5SDimitry Andric.globl __sigsetjmp
165*0b57cec5SDimitry Andric.type __sigsetjmp, @function
166*0b57cec5SDimitry Andric__sigsetjmp:
167*0b57cec5SDimitry Andric
168*0b57cec5SDimitry Andric  // Save env parameters
169*0b57cec5SDimitry Andric  daddiu $sp,$sp,-48
170*0b57cec5SDimitry Andric  sd $s0,40($sp)
171*0b57cec5SDimitry Andric  sd $ra,32($sp)
172*0b57cec5SDimitry Andric  sd $fp,24($sp)
173*0b57cec5SDimitry Andric  sd $gp,16($sp)
174*0b57cec5SDimitry Andric
175*0b57cec5SDimitry Andric  // calculate and save pointer to GOT
176*0b57cec5SDimitry Andric  lui $gp,%hi(%neg(%gp_rel(__sigsetjmp)))
177*0b57cec5SDimitry Andric  daddu $gp,$gp,$t9
178*0b57cec5SDimitry Andric  daddiu $gp,$gp,%lo(%neg(%gp_rel(__sigsetjmp)))
179*0b57cec5SDimitry Andric  move $s0,$gp
180*0b57cec5SDimitry Andric
181*0b57cec5SDimitry Andric  // save jmp_buf and savesig
182*0b57cec5SDimitry Andric  sd $a0,0($sp)
183*0b57cec5SDimitry Andric  sd $a1,8($sp)
184*0b57cec5SDimitry Andric
185*0b57cec5SDimitry Andric  // obtain $sp
186*0b57cec5SDimitry Andric  dadd $a0,$zero,$sp
187*0b57cec5SDimitry Andric
188*0b57cec5SDimitry Andric  // call tsan interceptor
189*0b57cec5SDimitry Andric  jal __tsan_setjmp
190*0b57cec5SDimitry Andric  daddiu $a1,$a0,48
191*0b57cec5SDimitry Andric
192*0b57cec5SDimitry Andric  // restore jmp_buf and savesig
193*0b57cec5SDimitry Andric  ld $a0,0($sp)
194*0b57cec5SDimitry Andric  ld $a1,8($sp)
195*0b57cec5SDimitry Andric
196*0b57cec5SDimitry Andric  // restore gp
197*0b57cec5SDimitry Andric  move $gp,$s0
198*0b57cec5SDimitry Andric
199*0b57cec5SDimitry Andric  // load pointer to libc __sigsetjmp in t9
200*0b57cec5SDimitry Andric  dla $t9,(_ZN14__interception16real___sigsetjmpE)
201*0b57cec5SDimitry Andric
202*0b57cec5SDimitry Andric  // restore env parameters
203*0b57cec5SDimitry Andric  ld $gp,16($sp)
204*0b57cec5SDimitry Andric  ld $fp,24($sp)
205*0b57cec5SDimitry Andric  ld $ra,32($sp)
206*0b57cec5SDimitry Andric  ld $s0,40($sp)
207*0b57cec5SDimitry Andric  daddiu $sp,$sp,48
208*0b57cec5SDimitry Andric
209*0b57cec5SDimitry Andric  // tail jump to libc __sigsetjmp
210*0b57cec5SDimitry Andric  ld $t9,0($t9)
211*0b57cec5SDimitry Andric  jr $t9
212*0b57cec5SDimitry Andric  nop
213*0b57cec5SDimitry Andric
214*0b57cec5SDimitry Andric.size __sigsetjmp, .-__sigsetjmp
215