xref: /netbsd-src/external/gpl3/gcc.old/dist/libsanitizer/tsan/tsan_rtl_amd64.S (revision 33881f779a77dce6440bdc44610d94de75bebefe)
1#include "sanitizer_common/sanitizer_asm.h"
2#if !defined(__APPLE__)
3.section .text
4#else
5.section __TEXT,__text
6#endif
7
8ASM_HIDDEN(__tsan_trace_switch)
9.globl ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk)
10ASM_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#ifdef __PIC__
50  call ASM_TSAN_SYMBOL(__tsan_trace_switch@PLT)
51#else
52  call ASM_TSAN_SYMBOL(__tsan_trace_switch)
53#endif
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
92ASM_HIDDEN(__tsan_report_race)
93.globl ASM_TSAN_SYMBOL(__tsan_report_race_thunk)
94ASM_TSAN_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#ifdef __PIC__
134  call ASM_TSAN_SYMBOL(__tsan_report_race@PLT)
135#else
136  call ASM_TSAN_SYMBOL(__tsan_report_race)
137#endif
138
139  # Unalign stack frame back.
140  mov %rbx, %rsp  # restore the original rsp
141  CFI_DEF_CFA_REGISTER(%rsp)
142  pop %rbx
143  CFI_ADJUST_CFA_OFFSET(-8)
144  # Restore scratch registers.
145  pop %r11
146  CFI_ADJUST_CFA_OFFSET(-8)
147  pop %r10
148  CFI_ADJUST_CFA_OFFSET(-8)
149  pop %r9
150  CFI_ADJUST_CFA_OFFSET(-8)
151  pop %r8
152  CFI_ADJUST_CFA_OFFSET(-8)
153  pop %rdi
154  CFI_ADJUST_CFA_OFFSET(-8)
155  pop %rsi
156  CFI_ADJUST_CFA_OFFSET(-8)
157  pop %rdx
158  CFI_ADJUST_CFA_OFFSET(-8)
159  pop %rcx
160  CFI_ADJUST_CFA_OFFSET(-8)
161  pop %rax
162  CFI_ADJUST_CFA_OFFSET(-8)
163  CFI_RESTORE(%rax)
164  CFI_RESTORE(%rbx)
165  CFI_RESTORE(%rcx)
166  CFI_RESTORE(%rdx)
167  CFI_RESTORE(%rsi)
168  CFI_RESTORE(%rdi)
169  CFI_RESTORE(%r8)
170  CFI_RESTORE(%r9)
171  CFI_RESTORE(%r10)
172  CFI_RESTORE(%r11)
173  ret
174  CFI_ENDPROC
175
176ASM_HIDDEN(__tsan_setjmp)
177#if !defined(__APPLE__)
178.comm _ZN14__interception11real_setjmpE,8,8
179#endif
180.globl ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)
181ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
182ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp):
183  CFI_STARTPROC
184  // save env parameter
185  push %rdi
186  CFI_ADJUST_CFA_OFFSET(8)
187  CFI_REL_OFFSET(%rdi, 0)
188  // obtain %rsp
189#if defined(__FreeBSD__) || defined(__NetBSD__)
190  lea 8(%rsp), %rdi
191  mov %rdi, %rsi
192#elif defined(__APPLE__)
193  lea 16(%rsp), %rdi
194  mov %rdi, %rsi
195#elif defined(__linux__)
196  lea 16(%rsp), %rdi
197  mov %rdi, %rsi
198  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
199  rol $0x11, %rsi
200#else
201# error "Unknown platform"
202#endif
203  // call tsan interceptor
204  call ASM_TSAN_SYMBOL(__tsan_setjmp)
205  // restore env parameter
206  pop %rdi
207  CFI_ADJUST_CFA_OFFSET(-8)
208  CFI_RESTORE(%rdi)
209  // tail jump to libc setjmp
210  movl $0, %eax
211#if !defined(__APPLE__)
212  movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
213  jmp *(%rdx)
214#else
215  jmp ASM_TSAN_SYMBOL(setjmp)
216#endif
217  CFI_ENDPROC
218ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
219
220.comm _ZN14__interception12real__setjmpE,8,8
221.globl ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)
222ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
223ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp):
224  CFI_STARTPROC
225  // save env parameter
226  push %rdi
227  CFI_ADJUST_CFA_OFFSET(8)
228  CFI_REL_OFFSET(%rdi, 0)
229  // obtain %rsp
230#if defined(__FreeBSD__) || defined(__NetBSD__)
231  lea 8(%rsp), %rdi
232  mov %rdi, %rsi
233#elif defined(__APPLE__)
234  lea 16(%rsp), %rdi
235  mov %rdi, %rsi
236#elif defined(__linux__)
237  lea 16(%rsp), %rdi
238  mov %rdi, %rsi
239  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
240  rol $0x11, %rsi
241#else
242# error "Unknown platform"
243#endif
244  // call tsan interceptor
245  call ASM_TSAN_SYMBOL(__tsan_setjmp)
246  // restore env parameter
247  pop %rdi
248  CFI_ADJUST_CFA_OFFSET(-8)
249  CFI_RESTORE(%rdi)
250  // tail jump to libc setjmp
251  movl $0, %eax
252#if !defined(__APPLE__)
253  movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
254  jmp *(%rdx)
255#else
256  jmp ASM_TSAN_SYMBOL(_setjmp)
257#endif
258  CFI_ENDPROC
259ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
260
261.comm _ZN14__interception14real_sigsetjmpE,8,8
262.globl ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)
263ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
264ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp):
265  CFI_STARTPROC
266  // save env parameter
267  push %rdi
268  CFI_ADJUST_CFA_OFFSET(8)
269  CFI_REL_OFFSET(%rdi, 0)
270  // save savesigs parameter
271  push %rsi
272  CFI_ADJUST_CFA_OFFSET(8)
273  CFI_REL_OFFSET(%rsi, 0)
274  // align stack frame
275  sub $8, %rsp
276  CFI_ADJUST_CFA_OFFSET(8)
277  // obtain %rsp
278#if defined(__FreeBSD__) || defined(__NetBSD__)
279  lea 24(%rsp), %rdi
280  mov %rdi, %rsi
281#elif defined(__APPLE__)
282  lea 32(%rsp), %rdi
283  mov %rdi, %rsi
284#elif defined(__linux__)
285  lea 32(%rsp), %rdi
286  mov %rdi, %rsi
287  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
288  rol $0x11, %rsi
289#else
290# error "Unknown platform"
291#endif
292  // call tsan interceptor
293  call ASM_TSAN_SYMBOL(__tsan_setjmp)
294  // unalign stack frame
295  add $8, %rsp
296  CFI_ADJUST_CFA_OFFSET(-8)
297  // restore savesigs parameter
298  pop %rsi
299  CFI_ADJUST_CFA_OFFSET(-8)
300  CFI_RESTORE(%rsi)
301  // restore env parameter
302  pop %rdi
303  CFI_ADJUST_CFA_OFFSET(-8)
304  CFI_RESTORE(%rdi)
305  // tail jump to libc sigsetjmp
306  movl $0, %eax
307#if !defined(__APPLE__)
308  movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
309  jmp *(%rdx)
310#else
311  jmp ASM_TSAN_SYMBOL(sigsetjmp)
312#endif
313  CFI_ENDPROC
314ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
315
316#if !defined(__APPLE__)
317.comm _ZN14__interception16real___sigsetjmpE,8,8
318.globl ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)
319ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
320ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp):
321  CFI_STARTPROC
322  // save env parameter
323  push %rdi
324  CFI_ADJUST_CFA_OFFSET(8)
325  CFI_REL_OFFSET(%rdi, 0)
326  // save savesigs parameter
327  push %rsi
328  CFI_ADJUST_CFA_OFFSET(8)
329  CFI_REL_OFFSET(%rsi, 0)
330  // align stack frame
331  sub $8, %rsp
332  CFI_ADJUST_CFA_OFFSET(8)
333  // obtain %rsp
334#if defined(__FreeBSD__) || defined(__NetBSD__)
335  lea 24(%rsp), %rdi
336  mov %rdi, %rsi
337#else
338  lea 32(%rsp), %rdi
339  mov %rdi, %rsi
340  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
341  rol $0x11, %rsi
342#endif
343  // call tsan interceptor
344  call ASM_TSAN_SYMBOL(__tsan_setjmp)
345  // unalign stack frame
346  add $8, %rsp
347  CFI_ADJUST_CFA_OFFSET(-8)
348  // restore savesigs parameter
349  pop %rsi
350  CFI_ADJUST_CFA_OFFSET(-8)
351  CFI_RESTORE(%rsi)
352  // restore env parameter
353  pop %rdi
354  CFI_ADJUST_CFA_OFFSET(-8)
355  CFI_RESTORE(%rdi)
356  // tail jump to libc sigsetjmp
357  movl $0, %eax
358  movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
359  jmp *(%rdx)
360  CFI_ENDPROC
361ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
362#endif  // !defined(__APPLE__)
363
364#if defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__)
365/* We do not need executable stack.  */
366.section        .note.GNU-stack,"",@progbits
367#endif
368