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)
193 #if defined(__FreeBSD__) || defined(__NetBSD__)
196 #elif defined(__APPLE__)
199 #elif defined(__linux__)
202 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
205 # error "Unknown platform"
207 // call tsan interceptor
208 call ASM_SYMBOL(__tsan_setjmp)
209 // restore env parameter
211 CFI_ADJUST_CFA_OFFSET(-8)
213 // tail jump to libc setjmp
215 #if defined(__NetBSD__)
216 movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
218 #elif !defined(__APPLE__)
219 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
222 jmp ASM_SYMBOL(setjmp)
225 #if defined(__NetBSD__)
226 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
228 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
231 .comm _ZN14__interception12real__setjmpE,8,8
232 .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
233 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
234 ASM_SYMBOL_INTERCEPTOR(_setjmp):
236 // save env parameter
238 CFI_ADJUST_CFA_OFFSET(8)
239 CFI_REL_OFFSET(%rdi, 0)
241 #if defined(__FreeBSD__) || defined(__NetBSD__)
244 #elif defined(__APPLE__)
247 #elif defined(__linux__)
250 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
253 # error "Unknown platform"
255 // call tsan interceptor
256 call ASM_SYMBOL(__tsan_setjmp)
257 // restore env parameter
259 CFI_ADJUST_CFA_OFFSET(-8)
261 // tail jump to libc setjmp
263 #if !defined(__APPLE__)
264 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
267 jmp ASM_SYMBOL(_setjmp)
270 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
272 #if defined(__NetBSD__)
273 .comm _ZN14__interception18real___sigsetjmp14E,8,8
274 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)
275 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
276 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):
278 .comm _ZN14__interception14real_sigsetjmpE,8,8
279 .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
280 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
281 ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
284 // save env parameter
286 CFI_ADJUST_CFA_OFFSET(8)
287 CFI_REL_OFFSET(%rdi, 0)
288 // save savesigs parameter
290 CFI_ADJUST_CFA_OFFSET(8)
291 CFI_REL_OFFSET(%rsi, 0)
294 CFI_ADJUST_CFA_OFFSET(8)
296 #if defined(__FreeBSD__) || defined(__NetBSD__)
299 #elif defined(__APPLE__)
302 #elif defined(__linux__)
305 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
308 # error "Unknown platform"
310 // call tsan interceptor
311 call ASM_SYMBOL(__tsan_setjmp)
312 // unalign stack frame
314 CFI_ADJUST_CFA_OFFSET(-8)
315 // restore savesigs parameter
317 CFI_ADJUST_CFA_OFFSET(-8)
319 // restore env parameter
321 CFI_ADJUST_CFA_OFFSET(-8)
323 // tail jump to libc sigsetjmp
325 #if defined(__NetBSD__)
326 movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
328 #elif !defined(__APPLE__)
329 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
332 jmp ASM_SYMBOL(sigsetjmp)
335 #if defined(__NetBSD__)
336 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
338 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
341 #if !defined(__APPLE__) && !defined(__NetBSD__)
342 .comm _ZN14__interception16real___sigsetjmpE,8,8
343 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
344 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
345 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
347 // save env parameter
349 CFI_ADJUST_CFA_OFFSET(8)
350 CFI_REL_OFFSET(%rdi, 0)
351 // save savesigs parameter
353 CFI_ADJUST_CFA_OFFSET(8)
354 CFI_REL_OFFSET(%rsi, 0)
357 CFI_ADJUST_CFA_OFFSET(8)
359 #if defined(__FreeBSD__)
365 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
368 // call tsan interceptor
369 call ASM_SYMBOL(__tsan_setjmp)
370 // unalign stack frame
372 CFI_ADJUST_CFA_OFFSET(-8)
373 // restore savesigs parameter
375 CFI_ADJUST_CFA_OFFSET(-8)
377 // restore env parameter
379 CFI_ADJUST_CFA_OFFSET(-8)
381 // tail jump to libc sigsetjmp
383 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
386 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
387 #endif // !defined(__APPLE__) && !defined(__NetBSD__)
389 #if defined(__FreeBSD__) || defined(__linux__)
390 /* We do not need executable stack. */
391 /* This note is not needed on NetBSD. */
392 .section .note.GNU-stack,"",@progbits