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