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