blob: 11c75c72dbe5be98d02f05a55cde70311178e036 [file] [log] [blame]
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00001.section .text
2
Dmitry Vyukov20678e22012-11-26 14:20:26 +00003.hidden __tsan_trace_switch
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00004.globl __tsan_trace_switch_thunk
5__tsan_trace_switch_thunk:
Dmitry Vyukovb7f18522012-09-02 11:24:07 +00006 .cfi_startproc
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00007 # Save scratch registers.
8 push %rax
Dmitry Vyukovb7f18522012-09-02 11:24:07 +00009 .cfi_adjust_cfa_offset 8
10 .cfi_rel_offset %rax, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000011 push %rcx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000012 .cfi_adjust_cfa_offset 8
13 .cfi_rel_offset %rcx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000014 push %rdx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000015 .cfi_adjust_cfa_offset 8
16 .cfi_rel_offset %rdx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000017 push %rsi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000018 .cfi_adjust_cfa_offset 8
19 .cfi_rel_offset %rsi, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000020 push %rdi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000021 .cfi_adjust_cfa_offset 8
22 .cfi_rel_offset %rdi, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000023 push %r8
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000024 .cfi_adjust_cfa_offset 8
25 .cfi_rel_offset %r8, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000026 push %r9
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000027 .cfi_adjust_cfa_offset 8
28 .cfi_rel_offset %r9, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000029 push %r10
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000030 .cfi_adjust_cfa_offset 8
31 .cfi_rel_offset %r10, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000032 push %r11
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000033 .cfi_adjust_cfa_offset 8
34 .cfi_rel_offset %r11, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000035 # Align stack frame.
36 push %rbx # non-scratch
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000037 .cfi_adjust_cfa_offset 8
38 .cfi_rel_offset %rbx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000039 mov %rsp, %rbx # save current rsp
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000040 .cfi_def_cfa_register %rbx
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000041 shr $4, %rsp # clear 4 lsb, align to 16
42 shl $4, %rsp
43
44 call __tsan_trace_switch
45
46 # Unalign stack frame back.
47 mov %rbx, %rsp # restore the original rsp
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000048 .cfi_def_cfa_register %rsp
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000049 pop %rbx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000050 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000051 # Restore scratch registers.
52 pop %r11
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000053 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000054 pop %r10
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000055 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000056 pop %r9
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000057 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000058 pop %r8
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000059 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000060 pop %rdi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000061 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000062 pop %rsi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000063 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000064 pop %rdx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000065 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000066 pop %rcx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000067 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000068 pop %rax
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000069 .cfi_adjust_cfa_offset -8
70 .cfi_restore %rax
71 .cfi_restore %rbx
72 .cfi_restore %rcx
73 .cfi_restore %rdx
74 .cfi_restore %rsi
75 .cfi_restore %rdi
76 .cfi_restore %r8
77 .cfi_restore %r9
78 .cfi_restore %r10
79 .cfi_restore %r11
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000080 ret
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000081 .cfi_endproc
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000082
Dmitry Vyukov20678e22012-11-26 14:20:26 +000083.hidden __tsan_report_race
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000084.globl __tsan_report_race_thunk
85__tsan_report_race_thunk:
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000086 .cfi_startproc
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000087 # Save scratch registers.
88 push %rax
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000089 .cfi_adjust_cfa_offset 8
90 .cfi_rel_offset %rax, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000091 push %rcx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000092 .cfi_adjust_cfa_offset 8
93 .cfi_rel_offset %rcx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000094 push %rdx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000095 .cfi_adjust_cfa_offset 8
96 .cfi_rel_offset %rdx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000097 push %rsi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +000098 .cfi_adjust_cfa_offset 8
99 .cfi_rel_offset %rsi, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000100 push %rdi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000101 .cfi_adjust_cfa_offset 8
102 .cfi_rel_offset %rdi, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000103 push %r8
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000104 .cfi_adjust_cfa_offset 8
105 .cfi_rel_offset %r8, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000106 push %r9
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000107 .cfi_adjust_cfa_offset 8
108 .cfi_rel_offset %r9, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000109 push %r10
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000110 .cfi_adjust_cfa_offset 8
111 .cfi_rel_offset %r10, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000112 push %r11
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000113 .cfi_adjust_cfa_offset 8
114 .cfi_rel_offset %r11, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000115 # Align stack frame.
116 push %rbx # non-scratch
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000117 .cfi_adjust_cfa_offset 8
118 .cfi_rel_offset %rbx, 0
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000119 mov %rsp, %rbx # save current rsp
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000120 .cfi_def_cfa_register %rbx
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000121 shr $4, %rsp # clear 4 lsb, align to 16
122 shl $4, %rsp
123
124 call __tsan_report_race
125
126 # Unalign stack frame back.
127 mov %rbx, %rsp # restore the original rsp
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000128 .cfi_def_cfa_register %rsp
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000129 pop %rbx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000130 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000131 # Restore scratch registers.
132 pop %r11
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000133 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000134 pop %r10
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000135 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000136 pop %r9
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000137 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000138 pop %r8
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000139 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000140 pop %rdi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000141 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000142 pop %rsi
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000143 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000144 pop %rdx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000145 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000146 pop %rcx
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000147 .cfi_adjust_cfa_offset -8
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000148 pop %rax
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000149 .cfi_adjust_cfa_offset -8
150 .cfi_restore %rax
151 .cfi_restore %rbx
152 .cfi_restore %rcx
153 .cfi_restore %rdx
154 .cfi_restore %rsi
155 .cfi_restore %rdi
156 .cfi_restore %r8
157 .cfi_restore %r9
158 .cfi_restore %r10
159 .cfi_restore %r11
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000160 ret
Dmitry Vyukovb7f18522012-09-02 11:24:07 +0000161 .cfi_endproc
Dmitry Vyukove2b5b5c2012-08-17 18:05:28 +0000162
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000163.hidden __tsan_setjmp
164.comm _ZN14__interception11real_setjmpE,8,8
165.globl setjmp
166.type setjmp, @function
167setjmp:
168 .cfi_startproc
169 // save env parameter
170 push %rdi
171 .cfi_adjust_cfa_offset 8
172 .cfi_rel_offset %rdi, 0
173 // obtain %rsp
174 lea 16(%rsp), %rdi
175 mov %rdi, %rsi
176 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
177 rol $0x11, %rsi
178 // call tsan interceptor
179 call __tsan_setjmp
180 // restore env parameter
181 pop %rdi
182 .cfi_adjust_cfa_offset -8
183 .cfi_restore %rdi
184 // tail jump to libc setjmp
185 movl $0, %eax
186 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
187 jmp *(%rdx)
188 .cfi_endproc
189.size setjmp, .-setjmp
190
191.comm _ZN14__interception12real__setjmpE,8,8
192.globl _setjmp
193.type _setjmp, @function
194_setjmp:
195 .cfi_startproc
196 // save env parameter
197 push %rdi
198 .cfi_adjust_cfa_offset 8
199 .cfi_rel_offset %rdi, 0
200 // obtain %rsp
201 lea 16(%rsp), %rdi
202 mov %rdi, %rsi
203 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
204 rol $0x11, %rsi
205 // call tsan interceptor
206 call __tsan_setjmp
207 // restore env parameter
208 pop %rdi
209 .cfi_adjust_cfa_offset -8
210 .cfi_restore %rdi
211 // tail jump to libc setjmp
212 movl $0, %eax
213 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
214 jmp *(%rdx)
215 .cfi_endproc
216.size _setjmp, .-_setjmp
217
218.comm _ZN14__interception14real_sigsetjmpE,8,8
219.globl sigsetjmp
220.type sigsetjmp, @function
221sigsetjmp:
222 .cfi_startproc
223 // save env parameter
224 push %rdi
225 .cfi_adjust_cfa_offset 8
226 .cfi_rel_offset %rdi, 0
227 // save savesigs parameter
228 push %rsi
229 .cfi_adjust_cfa_offset 8
230 .cfi_rel_offset %rsi, 0
231 // align stack frame
232 sub $8, %rsp
233 .cfi_adjust_cfa_offset 8
234 // obtain %rsp
235 lea 32(%rsp), %rdi
236 mov %rdi, %rsi
237 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
238 rol $0x11, %rsi
239 // call tsan interceptor
240 call __tsan_setjmp
241 // unalign stack frame
242 add $8, %rsp
243 .cfi_adjust_cfa_offset -8
244 // restore savesigs parameter
245 pop %rsi
246 .cfi_adjust_cfa_offset -8
247 .cfi_restore %rsi
248 // restore env parameter
249 pop %rdi
250 .cfi_adjust_cfa_offset -8
251 .cfi_restore %rdi
252 // tail jump to libc sigsetjmp
253 movl $0, %eax
254 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
255 jmp *(%rdx)
256 .cfi_endproc
257.size sigsetjmp, .-sigsetjmp
258
259.comm _ZN14__interception16real___sigsetjmpE,8,8
260.globl __sigsetjmp
261.type __sigsetjmp, @function
262__sigsetjmp:
263 .cfi_startproc
264 // save env parameter
265 push %rdi
266 .cfi_adjust_cfa_offset 8
267 .cfi_rel_offset %rdi, 0
268 // save savesigs parameter
269 push %rsi
270 .cfi_adjust_cfa_offset 8
271 .cfi_rel_offset %rsi, 0
272 // align stack frame
273 sub $8, %rsp
274 .cfi_adjust_cfa_offset 8
275 // obtain %rsp
276 lea 32(%rsp), %rdi
277 mov %rdi, %rsi
278 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
279 rol $0x11, %rsi
280 // call tsan interceptor
281 call __tsan_setjmp
282 // unalign stack frame
283 add $8, %rsp
284 .cfi_adjust_cfa_offset -8
285 // restore savesigs parameter
286 pop %rsi
287 .cfi_adjust_cfa_offset -8
288 .cfi_restore %rsi
289 // restore env parameter
290 pop %rdi
291 .cfi_adjust_cfa_offset -8
292 .cfi_restore %rdi
293 // tail jump to libc sigsetjmp
294 movl $0, %eax
295 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
296 jmp *(%rdx)
297 .cfi_endproc
298.size __sigsetjmp, .-__sigsetjmp
299
Dmitry Vyukove2b5b5c2012-08-17 18:05:28 +0000300#ifdef __linux__
301/* We do not need executable stack. */
302.section .note.GNU-stack,"",@progbits
303#endif