1 // The content of this file is x86_64-only:
2 #if defined(__x86_64__)
4 #include "sanitizer_common/sanitizer_asm.h"
6 #if !defined(__APPLE__)
12 ASM_HIDDEN(__tsan_trace_switch)
13 .globl ASM_SYMBOL(__tsan_trace_switch_thunk)
14 ASM_SYMBOL(__tsan_trace_switch_thunk):
16 # Save scratch registers.
18 CFI_ADJUST_CFA_OFFSET(8)
19 CFI_REL_OFFSET(%rax, 0)
21 CFI_ADJUST_CFA_OFFSET(8)
22 CFI_REL_OFFSET(%rcx, 0)
24 CFI_ADJUST_CFA_OFFSET(8)
25 CFI_REL_OFFSET(%rdx, 0)
27 CFI_ADJUST_CFA_OFFSET(8)
28 CFI_REL_OFFSET(%rsi, 0)
30 CFI_ADJUST_CFA_OFFSET(8)
31 CFI_REL_OFFSET(%rdi, 0)
33 CFI_ADJUST_CFA_OFFSET(8)
34 CFI_REL_OFFSET(%r8, 0)
36 CFI_ADJUST_CFA_OFFSET(8)
37 CFI_REL_OFFSET(%r9, 0)
39 CFI_ADJUST_CFA_OFFSET(8)
40 CFI_REL_OFFSET(%r10, 0)
42 CFI_ADJUST_CFA_OFFSET(8)
43 CFI_REL_OFFSET(%r11, 0)
45 push %rbx # non-scratch
46 CFI_ADJUST_CFA_OFFSET(8)
47 CFI_REL_OFFSET(%rbx, 0)
48 mov %rsp, %rbx # save current rsp
49 CFI_DEF_CFA_REGISTER(%rbx)
50 shr $4, %rsp # clear 4 lsb, align to 16
53 call ASM_SYMBOL(__tsan_trace_switch)
55 # Unalign stack frame back.
56 mov %rbx, %rsp # restore the original rsp
57 CFI_DEF_CFA_REGISTER(%rsp)
59 CFI_ADJUST_CFA_OFFSET(-8)
60 # Restore scratch registers.
62 CFI_ADJUST_CFA_OFFSET(-8)
64 CFI_ADJUST_CFA_OFFSET(-8)
66 CFI_ADJUST_CFA_OFFSET(-8)
68 CFI_ADJUST_CFA_OFFSET(-8)
70 CFI_ADJUST_CFA_OFFSET(-8)
72 CFI_ADJUST_CFA_OFFSET(-8)
74 CFI_ADJUST_CFA_OFFSET(-8)
76 CFI_ADJUST_CFA_OFFSET(-8)
78 CFI_ADJUST_CFA_OFFSET(-8)
92 ASM_HIDDEN(__tsan_report_race)
93 .globl ASM_SYMBOL(__tsan_report_race_thunk)
94 ASM_SYMBOL(__tsan_report_race_thunk):
96 # Save scratch registers.
98 CFI_ADJUST_CFA_OFFSET(8)
99 CFI_REL_OFFSET(%rax, 0)
101 CFI_ADJUST_CFA_OFFSET(8)
102 CFI_REL_OFFSET(%rcx, 0)
104 CFI_ADJUST_CFA_OFFSET(8)
105 CFI_REL_OFFSET(%rdx, 0)
107 CFI_ADJUST_CFA_OFFSET(8)
108 CFI_REL_OFFSET(%rsi, 0)
110 CFI_ADJUST_CFA_OFFSET(8)
111 CFI_REL_OFFSET(%rdi, 0)
113 CFI_ADJUST_CFA_OFFSET(8)
114 CFI_REL_OFFSET(%r8, 0)
116 CFI_ADJUST_CFA_OFFSET(8)
117 CFI_REL_OFFSET(%r9, 0)
119 CFI_ADJUST_CFA_OFFSET(8)
120 CFI_REL_OFFSET(%r10, 0)
122 CFI_ADJUST_CFA_OFFSET(8)
123 CFI_REL_OFFSET(%r11, 0)
125 push %rbx # non-scratch
126 CFI_ADJUST_CFA_OFFSET(8)
127 CFI_REL_OFFSET(%rbx, 0)
128 mov %rsp, %rbx # save current rsp
129 CFI_DEF_CFA_REGISTER(%rbx)
130 shr $4, %rsp # clear 4 lsb, align to 16
133 call ASM_SYMBOL(__tsan_report_race)
135 # Unalign stack frame back.
136 mov %rbx, %rsp # restore the original rsp
137 CFI_DEF_CFA_REGISTER(%rsp)
139 CFI_ADJUST_CFA_OFFSET(-8)
140 # Restore scratch registers.
142 CFI_ADJUST_CFA_OFFSET(-8)
144 CFI_ADJUST_CFA_OFFSET(-8)
146 CFI_ADJUST_CFA_OFFSET(-8)
148 CFI_ADJUST_CFA_OFFSET(-8)
150 CFI_ADJUST_CFA_OFFSET(-8)
152 CFI_ADJUST_CFA_OFFSET(-8)
154 CFI_ADJUST_CFA_OFFSET(-8)
156 CFI_ADJUST_CFA_OFFSET(-8)
158 CFI_ADJUST_CFA_OFFSET(-8)
172 ASM_HIDDEN(__tsan_setjmp)
173 #if defined(__NetBSD__)
174 .comm _ZN14__interception15real___setjmp14E,8,8
175 #elif !defined(__APPLE__)
176 .comm _ZN14__interception11real_setjmpE,8,8
178 #if defined(__NetBSD__)
179 .globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)
180 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
181 ASM_SYMBOL_INTERCEPTOR(__setjmp14):
183 .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
184 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
185 ASM_SYMBOL_INTERCEPTOR(setjmp):
188 // save env parameter
190 CFI_ADJUST_CFA_OFFSET(8)
191 CFI_REL_OFFSET(%rdi, 0)
192 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
193 #if defined(__FreeBSD__) || defined(__NetBSD__)
195 #elif defined(__linux__) || defined(__APPLE__)
198 # error "Unknown platform"
200 // call tsan interceptor
201 call ASM_SYMBOL(__tsan_setjmp)
202 // restore env parameter
204 CFI_ADJUST_CFA_OFFSET(-8)
206 // tail jump to libc setjmp
208 #if defined(__NetBSD__)
209 movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
211 #elif !defined(__APPLE__)
212 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
215 jmp ASM_SYMBOL(setjmp)
218 #if defined(__NetBSD__)
219 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
221 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
224 .comm _ZN14__interception12real__setjmpE,8,8
225 .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
226 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
227 ASM_SYMBOL_INTERCEPTOR(_setjmp):
229 // save env parameter
231 CFI_ADJUST_CFA_OFFSET(8)
232 CFI_REL_OFFSET(%rdi, 0)
233 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
234 #if defined(__FreeBSD__) || defined(__NetBSD__)
236 #elif defined(__linux__) || defined(__APPLE__)
239 # error "Unknown platform"
241 // call tsan interceptor
242 call ASM_SYMBOL(__tsan_setjmp)
243 // restore env parameter
245 CFI_ADJUST_CFA_OFFSET(-8)
247 // tail jump to libc setjmp
249 #if !defined(__APPLE__)
250 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
253 jmp ASM_SYMBOL(_setjmp)
256 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
258 #if defined(__NetBSD__)
259 .comm _ZN14__interception18real___sigsetjmp14E,8,8
260 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)
261 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
262 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):
264 .comm _ZN14__interception14real_sigsetjmpE,8,8
265 .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
266 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
267 ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
270 // save env parameter
272 CFI_ADJUST_CFA_OFFSET(8)
273 CFI_REL_OFFSET(%rdi, 0)
274 // save savesigs parameter
276 CFI_ADJUST_CFA_OFFSET(8)
277 CFI_REL_OFFSET(%rsi, 0)
280 CFI_ADJUST_CFA_OFFSET(8)
281 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
282 #if defined(__FreeBSD__) || defined(__NetBSD__)
284 #elif defined(__linux__) || defined(__APPLE__)
287 # error "Unknown platform"
289 // call tsan interceptor
290 call ASM_SYMBOL(__tsan_setjmp)
291 // unalign stack frame
293 CFI_ADJUST_CFA_OFFSET(-8)
294 // restore savesigs parameter
296 CFI_ADJUST_CFA_OFFSET(-8)
298 // restore env parameter
300 CFI_ADJUST_CFA_OFFSET(-8)
302 // tail jump to libc sigsetjmp
304 #if defined(__NetBSD__)
305 movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
307 #elif !defined(__APPLE__)
308 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
311 jmp ASM_SYMBOL(sigsetjmp)
314 #if defined(__NetBSD__)
315 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
317 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
320 #if !defined(__APPLE__) && !defined(__NetBSD__)
321 .comm _ZN14__interception16real___sigsetjmpE,8,8
322 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
323 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
324 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
326 // save env parameter
328 CFI_ADJUST_CFA_OFFSET(8)
329 CFI_REL_OFFSET(%rdi, 0)
330 // save savesigs parameter
332 CFI_ADJUST_CFA_OFFSET(8)
333 CFI_REL_OFFSET(%rsi, 0)
336 CFI_ADJUST_CFA_OFFSET(8)
337 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
338 #if defined(__FreeBSD__)
343 // call tsan interceptor
344 call ASM_SYMBOL(__tsan_setjmp)
345 // unalign stack frame
347 CFI_ADJUST_CFA_OFFSET(-8)
348 // restore savesigs parameter
350 CFI_ADJUST_CFA_OFFSET(-8)
352 // restore env parameter
354 CFI_ADJUST_CFA_OFFSET(-8)
356 // tail jump to libc sigsetjmp
358 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
361 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
362 #endif // !defined(__APPLE__) && !defined(__NetBSD__)
364 NO_EXEC_STACK_DIRECTIVE