1 #include "sanitizer_common/sanitizer_asm.h"
4 .hidden __tsan_trace_switch
5 .globl __tsan_trace_switch_thunk
6 __tsan_trace_switch_thunk:
8 # Save scratch registers.
10 CFI_ADJUST_CFA_OFFSET(8)
11 CFI_REL_OFFSET(%rax, 0)
13 CFI_ADJUST_CFA_OFFSET(8)
14 CFI_REL_OFFSET(%rcx, 0)
16 CFI_ADJUST_CFA_OFFSET(8)
17 CFI_REL_OFFSET(%rdx, 0)
19 CFI_ADJUST_CFA_OFFSET(8)
20 CFI_REL_OFFSET(%rsi, 0)
22 CFI_ADJUST_CFA_OFFSET(8)
23 CFI_REL_OFFSET(%rdi, 0)
25 CFI_ADJUST_CFA_OFFSET(8)
26 CFI_REL_OFFSET(%r8, 0)
28 CFI_ADJUST_CFA_OFFSET(8)
29 CFI_REL_OFFSET(%r9, 0)
31 CFI_ADJUST_CFA_OFFSET(8)
32 CFI_REL_OFFSET(%r10, 0)
34 CFI_ADJUST_CFA_OFFSET(8)
35 CFI_REL_OFFSET(%r11, 0)
37 push %rbx # non-scratch
38 CFI_ADJUST_CFA_OFFSET(8)
39 CFI_REL_OFFSET(%rbx, 0)
40 mov %rsp, %rbx # save current rsp
41 CFI_DEF_CFA_REGISTER(%rbx)
42 shr $4, %rsp # clear 4 lsb, align to 16
45 call __tsan_trace_switch
47 # Unalign stack frame back.
48 mov %rbx, %rsp # restore the original rsp
49 CFI_DEF_CFA_REGISTER(%rsp)
51 CFI_ADJUST_CFA_OFFSET(-8)
52 # Restore scratch registers.
54 CFI_ADJUST_CFA_OFFSET(-8)
56 CFI_ADJUST_CFA_OFFSET(-8)
58 CFI_ADJUST_CFA_OFFSET(-8)
60 CFI_ADJUST_CFA_OFFSET(-8)
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)
84 .hidden __tsan_report_race
85 .globl __tsan_report_race_thunk
86 __tsan_report_race_thunk:
88 # Save scratch registers.
90 CFI_ADJUST_CFA_OFFSET(8)
91 CFI_REL_OFFSET(%rax, 0)
93 CFI_ADJUST_CFA_OFFSET(8)
94 CFI_REL_OFFSET(%rcx, 0)
96 CFI_ADJUST_CFA_OFFSET(8)
97 CFI_REL_OFFSET(%rdx, 0)
99 CFI_ADJUST_CFA_OFFSET(8)
100 CFI_REL_OFFSET(%rsi, 0)
102 CFI_ADJUST_CFA_OFFSET(8)
103 CFI_REL_OFFSET(%rdi, 0)
105 CFI_ADJUST_CFA_OFFSET(8)
106 CFI_REL_OFFSET(%r8, 0)
108 CFI_ADJUST_CFA_OFFSET(8)
109 CFI_REL_OFFSET(%r9, 0)
111 CFI_ADJUST_CFA_OFFSET(8)
112 CFI_REL_OFFSET(%r10, 0)
114 CFI_ADJUST_CFA_OFFSET(8)
115 CFI_REL_OFFSET(%r11, 0)
117 push %rbx # non-scratch
118 CFI_ADJUST_CFA_OFFSET(8)
119 CFI_REL_OFFSET(%rbx, 0)
120 mov %rsp, %rbx # save current rsp
121 CFI_DEF_CFA_REGISTER(%rbx)
122 shr $4, %rsp # clear 4 lsb, align to 16
125 call __tsan_report_race
127 # Unalign stack frame back.
128 mov %rbx, %rsp # restore the original rsp
129 CFI_DEF_CFA_REGISTER(%rsp)
131 CFI_ADJUST_CFA_OFFSET(-8)
132 # Restore scratch registers.
134 CFI_ADJUST_CFA_OFFSET(-8)
136 CFI_ADJUST_CFA_OFFSET(-8)
138 CFI_ADJUST_CFA_OFFSET(-8)
140 CFI_ADJUST_CFA_OFFSET(-8)
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)
164 .hidden __tsan_setjmp
165 .comm _ZN14__interception11real_setjmpE,8,8
167 .type setjmp, @function
170 // save env parameter
172 CFI_ADJUST_CFA_OFFSET(8)
173 CFI_REL_OFFSET(%rdi, 0)
175 #if defined(__FreeBSD__)
181 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
184 // call tsan interceptor
186 // restore env parameter
188 CFI_ADJUST_CFA_OFFSET(-8)
190 // tail jump to libc setjmp
192 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
195 .size setjmp, .-setjmp
197 .comm _ZN14__interception12real__setjmpE,8,8
199 .type _setjmp, @function
202 // save env parameter
204 CFI_ADJUST_CFA_OFFSET(8)
205 CFI_REL_OFFSET(%rdi, 0)
207 #if defined(__FreeBSD__)
213 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
216 // call tsan interceptor
218 // restore env parameter
220 CFI_ADJUST_CFA_OFFSET(-8)
222 // tail jump to libc setjmp
224 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
227 .size _setjmp, .-_setjmp
229 .comm _ZN14__interception14real_sigsetjmpE,8,8
231 .type sigsetjmp, @function
234 // save env parameter
236 CFI_ADJUST_CFA_OFFSET(8)
237 CFI_REL_OFFSET(%rdi, 0)
238 // save savesigs parameter
240 CFI_ADJUST_CFA_OFFSET(8)
241 CFI_REL_OFFSET(%rsi, 0)
244 CFI_ADJUST_CFA_OFFSET(8)
246 #if defined(__FreeBSD__)
252 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
255 // call tsan interceptor
257 // unalign stack frame
259 CFI_ADJUST_CFA_OFFSET(-8)
260 // restore savesigs parameter
262 CFI_ADJUST_CFA_OFFSET(-8)
264 // restore env parameter
266 CFI_ADJUST_CFA_OFFSET(-8)
268 // tail jump to libc sigsetjmp
270 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
273 .size sigsetjmp, .-sigsetjmp
275 .comm _ZN14__interception16real___sigsetjmpE,8,8
277 .type __sigsetjmp, @function
280 // save env parameter
282 CFI_ADJUST_CFA_OFFSET(8)
283 CFI_REL_OFFSET(%rdi, 0)
284 // save savesigs parameter
286 CFI_ADJUST_CFA_OFFSET(8)
287 CFI_REL_OFFSET(%rsi, 0)
290 CFI_ADJUST_CFA_OFFSET(8)
292 #if defined(__FreeBSD__)
298 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
301 // call tsan interceptor
303 // unalign stack frame
305 CFI_ADJUST_CFA_OFFSET(-8)
306 // restore savesigs parameter
308 CFI_ADJUST_CFA_OFFSET(-8)
310 // restore env parameter
312 CFI_ADJUST_CFA_OFFSET(-8)
314 // tail jump to libc sigsetjmp
316 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
319 .size __sigsetjmp, .-__sigsetjmp
321 #if defined(__FreeBSD__) || defined(__linux__)
322 /* We do not need executable stack. */
323 .section .note.GNU-stack,"",@progbits