]> git.ipfire.org Git - thirdparty/gcc.git/blob - libsanitizer/tsan/tsan_rtl_amd64.S
All source files: Merge from upstream 285547.
[thirdparty/gcc.git] / libsanitizer / tsan / tsan_rtl_amd64.S
1 #include "sanitizer_common/sanitizer_asm.h"
2 #if !defined(__APPLE__)
3 .section .text
4 #else
5 .section __TEXT,__text
6 #endif
7
8 ASM_HIDDEN(__tsan_trace_switch)
9 .globl ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk)
10 ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk):
11 CFI_STARTPROC
12 # Save scratch registers.
13 push %rax
14 CFI_ADJUST_CFA_OFFSET(8)
15 CFI_REL_OFFSET(%rax, 0)
16 push %rcx
17 CFI_ADJUST_CFA_OFFSET(8)
18 CFI_REL_OFFSET(%rcx, 0)
19 push %rdx
20 CFI_ADJUST_CFA_OFFSET(8)
21 CFI_REL_OFFSET(%rdx, 0)
22 push %rsi
23 CFI_ADJUST_CFA_OFFSET(8)
24 CFI_REL_OFFSET(%rsi, 0)
25 push %rdi
26 CFI_ADJUST_CFA_OFFSET(8)
27 CFI_REL_OFFSET(%rdi, 0)
28 push %r8
29 CFI_ADJUST_CFA_OFFSET(8)
30 CFI_REL_OFFSET(%r8, 0)
31 push %r9
32 CFI_ADJUST_CFA_OFFSET(8)
33 CFI_REL_OFFSET(%r9, 0)
34 push %r10
35 CFI_ADJUST_CFA_OFFSET(8)
36 CFI_REL_OFFSET(%r10, 0)
37 push %r11
38 CFI_ADJUST_CFA_OFFSET(8)
39 CFI_REL_OFFSET(%r11, 0)
40 # Align stack frame.
41 push %rbx # non-scratch
42 CFI_ADJUST_CFA_OFFSET(8)
43 CFI_REL_OFFSET(%rbx, 0)
44 mov %rsp, %rbx # save current rsp
45 CFI_DEF_CFA_REGISTER(%rbx)
46 shr $4, %rsp # clear 4 lsb, align to 16
47 shl $4, %rsp
48
49 call ASM_TSAN_SYMBOL(__tsan_trace_switch)
50
51 # Unalign stack frame back.
52 mov %rbx, %rsp # restore the original rsp
53 CFI_DEF_CFA_REGISTER(%rsp)
54 pop %rbx
55 CFI_ADJUST_CFA_OFFSET(-8)
56 # Restore scratch registers.
57 pop %r11
58 CFI_ADJUST_CFA_OFFSET(-8)
59 pop %r10
60 CFI_ADJUST_CFA_OFFSET(-8)
61 pop %r9
62 CFI_ADJUST_CFA_OFFSET(-8)
63 pop %r8
64 CFI_ADJUST_CFA_OFFSET(-8)
65 pop %rdi
66 CFI_ADJUST_CFA_OFFSET(-8)
67 pop %rsi
68 CFI_ADJUST_CFA_OFFSET(-8)
69 pop %rdx
70 CFI_ADJUST_CFA_OFFSET(-8)
71 pop %rcx
72 CFI_ADJUST_CFA_OFFSET(-8)
73 pop %rax
74 CFI_ADJUST_CFA_OFFSET(-8)
75 CFI_RESTORE(%rax)
76 CFI_RESTORE(%rbx)
77 CFI_RESTORE(%rcx)
78 CFI_RESTORE(%rdx)
79 CFI_RESTORE(%rsi)
80 CFI_RESTORE(%rdi)
81 CFI_RESTORE(%r8)
82 CFI_RESTORE(%r9)
83 CFI_RESTORE(%r10)
84 CFI_RESTORE(%r11)
85 ret
86 CFI_ENDPROC
87
88 ASM_HIDDEN(__tsan_report_race)
89 .globl ASM_TSAN_SYMBOL(__tsan_report_race_thunk)
90 ASM_TSAN_SYMBOL(__tsan_report_race_thunk):
91 CFI_STARTPROC
92 # Save scratch registers.
93 push %rax
94 CFI_ADJUST_CFA_OFFSET(8)
95 CFI_REL_OFFSET(%rax, 0)
96 push %rcx
97 CFI_ADJUST_CFA_OFFSET(8)
98 CFI_REL_OFFSET(%rcx, 0)
99 push %rdx
100 CFI_ADJUST_CFA_OFFSET(8)
101 CFI_REL_OFFSET(%rdx, 0)
102 push %rsi
103 CFI_ADJUST_CFA_OFFSET(8)
104 CFI_REL_OFFSET(%rsi, 0)
105 push %rdi
106 CFI_ADJUST_CFA_OFFSET(8)
107 CFI_REL_OFFSET(%rdi, 0)
108 push %r8
109 CFI_ADJUST_CFA_OFFSET(8)
110 CFI_REL_OFFSET(%r8, 0)
111 push %r9
112 CFI_ADJUST_CFA_OFFSET(8)
113 CFI_REL_OFFSET(%r9, 0)
114 push %r10
115 CFI_ADJUST_CFA_OFFSET(8)
116 CFI_REL_OFFSET(%r10, 0)
117 push %r11
118 CFI_ADJUST_CFA_OFFSET(8)
119 CFI_REL_OFFSET(%r11, 0)
120 # Align stack frame.
121 push %rbx # non-scratch
122 CFI_ADJUST_CFA_OFFSET(8)
123 CFI_REL_OFFSET(%rbx, 0)
124 mov %rsp, %rbx # save current rsp
125 CFI_DEF_CFA_REGISTER(%rbx)
126 shr $4, %rsp # clear 4 lsb, align to 16
127 shl $4, %rsp
128
129 call ASM_TSAN_SYMBOL(__tsan_report_race)
130
131 # Unalign stack frame back.
132 mov %rbx, %rsp # restore the original rsp
133 CFI_DEF_CFA_REGISTER(%rsp)
134 pop %rbx
135 CFI_ADJUST_CFA_OFFSET(-8)
136 # Restore scratch registers.
137 pop %r11
138 CFI_ADJUST_CFA_OFFSET(-8)
139 pop %r10
140 CFI_ADJUST_CFA_OFFSET(-8)
141 pop %r9
142 CFI_ADJUST_CFA_OFFSET(-8)
143 pop %r8
144 CFI_ADJUST_CFA_OFFSET(-8)
145 pop %rdi
146 CFI_ADJUST_CFA_OFFSET(-8)
147 pop %rsi
148 CFI_ADJUST_CFA_OFFSET(-8)
149 pop %rdx
150 CFI_ADJUST_CFA_OFFSET(-8)
151 pop %rcx
152 CFI_ADJUST_CFA_OFFSET(-8)
153 pop %rax
154 CFI_ADJUST_CFA_OFFSET(-8)
155 CFI_RESTORE(%rax)
156 CFI_RESTORE(%rbx)
157 CFI_RESTORE(%rcx)
158 CFI_RESTORE(%rdx)
159 CFI_RESTORE(%rsi)
160 CFI_RESTORE(%rdi)
161 CFI_RESTORE(%r8)
162 CFI_RESTORE(%r9)
163 CFI_RESTORE(%r10)
164 CFI_RESTORE(%r11)
165 ret
166 CFI_ENDPROC
167
168 ASM_HIDDEN(__tsan_setjmp)
169 #if !defined(__APPLE__)
170 .comm _ZN14__interception11real_setjmpE,8,8
171 #endif
172 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)
173 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
174 ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp):
175 CFI_STARTPROC
176 // save env parameter
177 push %rdi
178 CFI_ADJUST_CFA_OFFSET(8)
179 CFI_REL_OFFSET(%rdi, 0)
180 // obtain %rsp
181 #if defined(__FreeBSD__)
182 lea 8(%rsp), %rdi
183 mov %rdi, %rsi
184 #elif defined(__APPLE__)
185 lea 16(%rsp), %rdi
186 mov %rdi, %rsi
187 #elif defined(__linux__)
188 lea 16(%rsp), %rdi
189 mov %rdi, %rsi
190 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
191 rol $0x11, %rsi
192 #else
193 # error "Unknown platform"
194 #endif
195 // call tsan interceptor
196 call ASM_TSAN_SYMBOL(__tsan_setjmp)
197 // restore env parameter
198 pop %rdi
199 CFI_ADJUST_CFA_OFFSET(-8)
200 CFI_RESTORE(%rdi)
201 // tail jump to libc setjmp
202 movl $0, %eax
203 #if !defined(__APPLE__)
204 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
205 jmp *(%rdx)
206 #else
207 jmp ASM_TSAN_SYMBOL(setjmp)
208 #endif
209 CFI_ENDPROC
210 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
211
212 .comm _ZN14__interception12real__setjmpE,8,8
213 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)
214 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
215 ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp):
216 CFI_STARTPROC
217 // save env parameter
218 push %rdi
219 CFI_ADJUST_CFA_OFFSET(8)
220 CFI_REL_OFFSET(%rdi, 0)
221 // obtain %rsp
222 #if defined(__FreeBSD__)
223 lea 8(%rsp), %rdi
224 mov %rdi, %rsi
225 #elif defined(__APPLE__)
226 lea 16(%rsp), %rdi
227 mov %rdi, %rsi
228 #elif defined(__linux__)
229 lea 16(%rsp), %rdi
230 mov %rdi, %rsi
231 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
232 rol $0x11, %rsi
233 #else
234 # error "Unknown platform"
235 #endif
236 // call tsan interceptor
237 call ASM_TSAN_SYMBOL(__tsan_setjmp)
238 // restore env parameter
239 pop %rdi
240 CFI_ADJUST_CFA_OFFSET(-8)
241 CFI_RESTORE(%rdi)
242 // tail jump to libc setjmp
243 movl $0, %eax
244 #if !defined(__APPLE__)
245 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
246 jmp *(%rdx)
247 #else
248 jmp ASM_TSAN_SYMBOL(_setjmp)
249 #endif
250 CFI_ENDPROC
251 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
252
253 .comm _ZN14__interception14real_sigsetjmpE,8,8
254 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)
255 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
256 ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp):
257 CFI_STARTPROC
258 // save env parameter
259 push %rdi
260 CFI_ADJUST_CFA_OFFSET(8)
261 CFI_REL_OFFSET(%rdi, 0)
262 // save savesigs parameter
263 push %rsi
264 CFI_ADJUST_CFA_OFFSET(8)
265 CFI_REL_OFFSET(%rsi, 0)
266 // align stack frame
267 sub $8, %rsp
268 CFI_ADJUST_CFA_OFFSET(8)
269 // obtain %rsp
270 #if defined(__FreeBSD__)
271 lea 24(%rsp), %rdi
272 mov %rdi, %rsi
273 #elif defined(__APPLE__)
274 lea 32(%rsp), %rdi
275 mov %rdi, %rsi
276 #elif defined(__linux__)
277 lea 32(%rsp), %rdi
278 mov %rdi, %rsi
279 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
280 rol $0x11, %rsi
281 #else
282 # error "Unknown platform"
283 #endif
284 // call tsan interceptor
285 call ASM_TSAN_SYMBOL(__tsan_setjmp)
286 // unalign stack frame
287 add $8, %rsp
288 CFI_ADJUST_CFA_OFFSET(-8)
289 // restore savesigs parameter
290 pop %rsi
291 CFI_ADJUST_CFA_OFFSET(-8)
292 CFI_RESTORE(%rsi)
293 // restore env parameter
294 pop %rdi
295 CFI_ADJUST_CFA_OFFSET(-8)
296 CFI_RESTORE(%rdi)
297 // tail jump to libc sigsetjmp
298 movl $0, %eax
299 #if !defined(__APPLE__)
300 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
301 jmp *(%rdx)
302 #else
303 jmp ASM_TSAN_SYMBOL(sigsetjmp)
304 #endif
305 CFI_ENDPROC
306 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
307
308 #if !defined(__APPLE__)
309 .comm _ZN14__interception16real___sigsetjmpE,8,8
310 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)
311 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
312 ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp):
313 CFI_STARTPROC
314 // save env parameter
315 push %rdi
316 CFI_ADJUST_CFA_OFFSET(8)
317 CFI_REL_OFFSET(%rdi, 0)
318 // save savesigs parameter
319 push %rsi
320 CFI_ADJUST_CFA_OFFSET(8)
321 CFI_REL_OFFSET(%rsi, 0)
322 // align stack frame
323 sub $8, %rsp
324 CFI_ADJUST_CFA_OFFSET(8)
325 // obtain %rsp
326 #if defined(__FreeBSD__)
327 lea 24(%rsp), %rdi
328 mov %rdi, %rsi
329 #else
330 lea 32(%rsp), %rdi
331 mov %rdi, %rsi
332 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
333 rol $0x11, %rsi
334 #endif
335 // call tsan interceptor
336 call ASM_TSAN_SYMBOL(__tsan_setjmp)
337 // unalign stack frame
338 add $8, %rsp
339 CFI_ADJUST_CFA_OFFSET(-8)
340 // restore savesigs parameter
341 pop %rsi
342 CFI_ADJUST_CFA_OFFSET(-8)
343 CFI_RESTORE(%rsi)
344 // restore env parameter
345 pop %rdi
346 CFI_ADJUST_CFA_OFFSET(-8)
347 CFI_RESTORE(%rdi)
348 // tail jump to libc sigsetjmp
349 movl $0, %eax
350 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
351 jmp *(%rdx)
352 CFI_ENDPROC
353 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
354 #endif // !defined(__APPLE__)
355
356 #if defined(__FreeBSD__) || defined(__linux__)
357 /* We do not need executable stack. */
358 .section .note.GNU-stack,"",@progbits
359 #endif