]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_amd64.S
MFV: r342049
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / tsan / rtl / tsan_rtl_amd64.S
1 // The content of this file is x86_64-only:
2 #if defined(__x86_64__)
3
4 #include "sanitizer_common/sanitizer_asm.h"
5
6 #if !defined(__APPLE__)
7 .section .text
8 #else
9 .section __TEXT,__text
10 #endif
11
12 ASM_HIDDEN(__tsan_trace_switch)
13 .globl ASM_SYMBOL(__tsan_trace_switch_thunk)
14 ASM_SYMBOL(__tsan_trace_switch_thunk):
15   CFI_STARTPROC
16   # Save scratch registers.
17   push %rax
18   CFI_ADJUST_CFA_OFFSET(8)
19   CFI_REL_OFFSET(%rax, 0)
20   push %rcx
21   CFI_ADJUST_CFA_OFFSET(8)
22   CFI_REL_OFFSET(%rcx, 0)
23   push %rdx
24   CFI_ADJUST_CFA_OFFSET(8)
25   CFI_REL_OFFSET(%rdx, 0)
26   push %rsi
27   CFI_ADJUST_CFA_OFFSET(8)
28   CFI_REL_OFFSET(%rsi, 0)
29   push %rdi
30   CFI_ADJUST_CFA_OFFSET(8)
31   CFI_REL_OFFSET(%rdi, 0)
32   push %r8
33   CFI_ADJUST_CFA_OFFSET(8)
34   CFI_REL_OFFSET(%r8, 0)
35   push %r9
36   CFI_ADJUST_CFA_OFFSET(8)
37   CFI_REL_OFFSET(%r9, 0)
38   push %r10
39   CFI_ADJUST_CFA_OFFSET(8)
40   CFI_REL_OFFSET(%r10, 0)
41   push %r11
42   CFI_ADJUST_CFA_OFFSET(8)
43   CFI_REL_OFFSET(%r11, 0)
44   # Align stack frame.
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
51   shl $4, %rsp
52
53   call ASM_SYMBOL(__tsan_trace_switch)
54
55   # Unalign stack frame back.
56   mov %rbx, %rsp  # restore the original rsp
57   CFI_DEF_CFA_REGISTER(%rsp)
58   pop %rbx
59   CFI_ADJUST_CFA_OFFSET(-8)
60   # Restore scratch registers.
61   pop %r11
62   CFI_ADJUST_CFA_OFFSET(-8)
63   pop %r10
64   CFI_ADJUST_CFA_OFFSET(-8)
65   pop %r9
66   CFI_ADJUST_CFA_OFFSET(-8)
67   pop %r8
68   CFI_ADJUST_CFA_OFFSET(-8)
69   pop %rdi
70   CFI_ADJUST_CFA_OFFSET(-8)
71   pop %rsi
72   CFI_ADJUST_CFA_OFFSET(-8)
73   pop %rdx
74   CFI_ADJUST_CFA_OFFSET(-8)
75   pop %rcx
76   CFI_ADJUST_CFA_OFFSET(-8)
77   pop %rax
78   CFI_ADJUST_CFA_OFFSET(-8)
79   CFI_RESTORE(%rax)
80   CFI_RESTORE(%rbx)
81   CFI_RESTORE(%rcx)
82   CFI_RESTORE(%rdx)
83   CFI_RESTORE(%rsi)
84   CFI_RESTORE(%rdi)
85   CFI_RESTORE(%r8)
86   CFI_RESTORE(%r9)
87   CFI_RESTORE(%r10)
88   CFI_RESTORE(%r11)
89   ret
90   CFI_ENDPROC
91
92 ASM_HIDDEN(__tsan_report_race)
93 .globl ASM_SYMBOL(__tsan_report_race_thunk)
94 ASM_SYMBOL(__tsan_report_race_thunk):
95   CFI_STARTPROC
96   # Save scratch registers.
97   push %rax
98   CFI_ADJUST_CFA_OFFSET(8)
99   CFI_REL_OFFSET(%rax, 0)
100   push %rcx
101   CFI_ADJUST_CFA_OFFSET(8)
102   CFI_REL_OFFSET(%rcx, 0)
103   push %rdx
104   CFI_ADJUST_CFA_OFFSET(8)
105   CFI_REL_OFFSET(%rdx, 0)
106   push %rsi
107   CFI_ADJUST_CFA_OFFSET(8)
108   CFI_REL_OFFSET(%rsi, 0)
109   push %rdi
110   CFI_ADJUST_CFA_OFFSET(8)
111   CFI_REL_OFFSET(%rdi, 0)
112   push %r8
113   CFI_ADJUST_CFA_OFFSET(8)
114   CFI_REL_OFFSET(%r8, 0)
115   push %r9
116   CFI_ADJUST_CFA_OFFSET(8)
117   CFI_REL_OFFSET(%r9, 0)
118   push %r10
119   CFI_ADJUST_CFA_OFFSET(8)
120   CFI_REL_OFFSET(%r10, 0)
121   push %r11
122   CFI_ADJUST_CFA_OFFSET(8)
123   CFI_REL_OFFSET(%r11, 0)
124   # Align stack frame.
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
131   shl $4, %rsp
132
133   call ASM_SYMBOL(__tsan_report_race)
134
135   # Unalign stack frame back.
136   mov %rbx, %rsp  # restore the original rsp
137   CFI_DEF_CFA_REGISTER(%rsp)
138   pop %rbx
139   CFI_ADJUST_CFA_OFFSET(-8)
140   # Restore scratch registers.
141   pop %r11
142   CFI_ADJUST_CFA_OFFSET(-8)
143   pop %r10
144   CFI_ADJUST_CFA_OFFSET(-8)
145   pop %r9
146   CFI_ADJUST_CFA_OFFSET(-8)
147   pop %r8
148   CFI_ADJUST_CFA_OFFSET(-8)
149   pop %rdi
150   CFI_ADJUST_CFA_OFFSET(-8)
151   pop %rsi
152   CFI_ADJUST_CFA_OFFSET(-8)
153   pop %rdx
154   CFI_ADJUST_CFA_OFFSET(-8)
155   pop %rcx
156   CFI_ADJUST_CFA_OFFSET(-8)
157   pop %rax
158   CFI_ADJUST_CFA_OFFSET(-8)
159   CFI_RESTORE(%rax)
160   CFI_RESTORE(%rbx)
161   CFI_RESTORE(%rcx)
162   CFI_RESTORE(%rdx)
163   CFI_RESTORE(%rsi)
164   CFI_RESTORE(%rdi)
165   CFI_RESTORE(%r8)
166   CFI_RESTORE(%r9)
167   CFI_RESTORE(%r10)
168   CFI_RESTORE(%r11)
169   ret
170   CFI_ENDPROC
171
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
177 #endif
178 #if defined(__NetBSD__)
179 .globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)
180 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
181 ASM_SYMBOL_INTERCEPTOR(__setjmp14):
182 #else
183 .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
184 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
185 ASM_SYMBOL_INTERCEPTOR(setjmp):
186 #endif
187   CFI_STARTPROC
188   // save env parameter
189   push %rdi
190   CFI_ADJUST_CFA_OFFSET(8)
191   CFI_REL_OFFSET(%rdi, 0)
192   // obtain %rsp
193 #if defined(__FreeBSD__) || defined(__NetBSD__)
194   lea 8(%rsp), %rdi
195   mov %rdi, %rsi
196 #elif defined(__APPLE__)
197   lea 16(%rsp), %rdi
198   mov %rdi, %rsi
199 #elif defined(__linux__)
200   lea 16(%rsp), %rdi
201   mov %rdi, %rsi
202   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
203   rol $0x11, %rsi
204 #else
205 # error "Unknown platform"
206 #endif
207   // call tsan interceptor
208   call ASM_SYMBOL(__tsan_setjmp)
209   // restore env parameter
210   pop %rdi
211   CFI_ADJUST_CFA_OFFSET(-8)
212   CFI_RESTORE(%rdi)
213   // tail jump to libc setjmp
214   movl $0, %eax
215 #if defined(__NetBSD__)
216   movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
217   jmp *(%rdx)
218 #elif !defined(__APPLE__)
219   movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
220   jmp *(%rdx)
221 #else
222   jmp ASM_SYMBOL(setjmp)
223 #endif
224   CFI_ENDPROC
225 #if defined(__NetBSD__)
226 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
227 #else
228 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
229 #endif
230
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):
235   CFI_STARTPROC
236   // save env parameter
237   push %rdi
238   CFI_ADJUST_CFA_OFFSET(8)
239   CFI_REL_OFFSET(%rdi, 0)
240   // obtain %rsp
241 #if defined(__FreeBSD__) || defined(__NetBSD__)
242   lea 8(%rsp), %rdi
243   mov %rdi, %rsi
244 #elif defined(__APPLE__)
245   lea 16(%rsp), %rdi
246   mov %rdi, %rsi
247 #elif defined(__linux__)
248   lea 16(%rsp), %rdi
249   mov %rdi, %rsi
250   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
251   rol $0x11, %rsi
252 #else
253 # error "Unknown platform"
254 #endif
255   // call tsan interceptor
256   call ASM_SYMBOL(__tsan_setjmp)
257   // restore env parameter
258   pop %rdi
259   CFI_ADJUST_CFA_OFFSET(-8)
260   CFI_RESTORE(%rdi)
261   // tail jump to libc setjmp
262   movl $0, %eax
263 #if !defined(__APPLE__)
264   movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
265   jmp *(%rdx)
266 #else
267   jmp ASM_SYMBOL(_setjmp)
268 #endif
269   CFI_ENDPROC
270 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
271
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):
277 #else
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):
282 #endif
283   CFI_STARTPROC
284   // save env parameter
285   push %rdi
286   CFI_ADJUST_CFA_OFFSET(8)
287   CFI_REL_OFFSET(%rdi, 0)
288   // save savesigs parameter
289   push %rsi
290   CFI_ADJUST_CFA_OFFSET(8)
291   CFI_REL_OFFSET(%rsi, 0)
292   // align stack frame
293   sub $8, %rsp
294   CFI_ADJUST_CFA_OFFSET(8)
295   // obtain %rsp
296 #if defined(__FreeBSD__) || defined(__NetBSD__)
297   lea 24(%rsp), %rdi
298   mov %rdi, %rsi
299 #elif defined(__APPLE__)
300   lea 32(%rsp), %rdi
301   mov %rdi, %rsi
302 #elif defined(__linux__)
303   lea 32(%rsp), %rdi
304   mov %rdi, %rsi
305   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
306   rol $0x11, %rsi
307 #else
308 # error "Unknown platform"
309 #endif
310   // call tsan interceptor
311   call ASM_SYMBOL(__tsan_setjmp)
312   // unalign stack frame
313   add $8, %rsp
314   CFI_ADJUST_CFA_OFFSET(-8)
315   // restore savesigs parameter
316   pop %rsi
317   CFI_ADJUST_CFA_OFFSET(-8)
318   CFI_RESTORE(%rsi)
319   // restore env parameter
320   pop %rdi
321   CFI_ADJUST_CFA_OFFSET(-8)
322   CFI_RESTORE(%rdi)
323   // tail jump to libc sigsetjmp
324   movl $0, %eax
325 #if defined(__NetBSD__)
326   movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
327   jmp *(%rdx)
328 #elif !defined(__APPLE__)
329   movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
330   jmp *(%rdx)
331 #else
332   jmp ASM_SYMBOL(sigsetjmp)
333 #endif
334   CFI_ENDPROC
335 #if defined(__NetBSD__)
336 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
337 #else
338 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
339 #endif
340
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):
346   CFI_STARTPROC
347   // save env parameter
348   push %rdi
349   CFI_ADJUST_CFA_OFFSET(8)
350   CFI_REL_OFFSET(%rdi, 0)
351   // save savesigs parameter
352   push %rsi
353   CFI_ADJUST_CFA_OFFSET(8)
354   CFI_REL_OFFSET(%rsi, 0)
355   // align stack frame
356   sub $8, %rsp
357   CFI_ADJUST_CFA_OFFSET(8)
358   // obtain %rsp
359 #if defined(__FreeBSD__)
360   lea 24(%rsp), %rdi
361   mov %rdi, %rsi
362 #else
363   lea 32(%rsp), %rdi
364   mov %rdi, %rsi
365   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
366   rol $0x11, %rsi
367 #endif
368   // call tsan interceptor
369   call ASM_SYMBOL(__tsan_setjmp)
370   // unalign stack frame
371   add $8, %rsp
372   CFI_ADJUST_CFA_OFFSET(-8)
373   // restore savesigs parameter
374   pop %rsi
375   CFI_ADJUST_CFA_OFFSET(-8)
376   CFI_RESTORE(%rsi)
377   // restore env parameter
378   pop %rdi
379   CFI_ADJUST_CFA_OFFSET(-8)
380   CFI_RESTORE(%rdi)
381   // tail jump to libc sigsetjmp
382   movl $0, %eax
383   movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
384   jmp *(%rdx)
385   CFI_ENDPROC
386 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
387 #endif  // !defined(__APPLE__) && !defined(__NetBSD__)
388
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
393 #endif
394
395 #endif