blob: 11c19a79f22407b84f5155d775472bc4fb37ece3 [file] [log] [blame]
Alexey Samsonov58e44a32013-12-05 10:40:11 +00001#include "sanitizer_common/sanitizer_asm.h"
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00002.section .text
3
Dmitry Vyukov20678e22012-11-26 14:20:26 +00004.hidden __tsan_trace_switch
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00005.globl __tsan_trace_switch_thunk
6__tsan_trace_switch_thunk:
Kostya Serebryany14e92c22013-12-05 07:44:35 +00007 CFI_STARTPROC
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00008 # Save scratch registers.
9 push %rax
Kostya Serebryany14e92c22013-12-05 07:44:35 +000010 CFI_ADJUST_CFA_OFFSET(8)
11 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000012 push %rcx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000013 CFI_ADJUST_CFA_OFFSET(8)
14 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000015 push %rdx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000016 CFI_ADJUST_CFA_OFFSET(8)
17 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000018 push %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +000019 CFI_ADJUST_CFA_OFFSET(8)
20 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000021 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +000022 CFI_ADJUST_CFA_OFFSET(8)
23 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000024 push %r8
Kostya Serebryany14e92c22013-12-05 07:44:35 +000025 CFI_ADJUST_CFA_OFFSET(8)
26 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000027 push %r9
Kostya Serebryany14e92c22013-12-05 07:44:35 +000028 CFI_ADJUST_CFA_OFFSET(8)
29 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000030 push %r10
Kostya Serebryany14e92c22013-12-05 07:44:35 +000031 CFI_ADJUST_CFA_OFFSET(8)
32 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000033 push %r11
Kostya Serebryany14e92c22013-12-05 07:44:35 +000034 CFI_ADJUST_CFA_OFFSET(8)
35 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000036 # Align stack frame.
37 push %rbx # non-scratch
Kostya Serebryany14e92c22013-12-05 07:44:35 +000038 CFI_ADJUST_CFA_OFFSET(8)
39 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000040 mov %rsp, %rbx # save current rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +000041 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000042 shr $4, %rsp # clear 4 lsb, align to 16
43 shl $4, %rsp
44
45 call __tsan_trace_switch
46
47 # Unalign stack frame back.
48 mov %rbx, %rsp # restore the original rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +000049 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000050 pop %rbx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000051 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000052 # Restore scratch registers.
53 pop %r11
Kostya Serebryany14e92c22013-12-05 07:44:35 +000054 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000055 pop %r10
Kostya Serebryany14e92c22013-12-05 07:44:35 +000056 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000057 pop %r9
Kostya Serebryany14e92c22013-12-05 07:44:35 +000058 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000059 pop %r8
Kostya Serebryany14e92c22013-12-05 07:44:35 +000060 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000061 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +000062 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000063 pop %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +000064 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000065 pop %rdx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000066 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000067 pop %rcx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000068 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000069 pop %rax
Kostya Serebryany14e92c22013-12-05 07:44:35 +000070 CFI_ADJUST_CFA_OFFSET(-8)
71 CFI_RESTORE(%rax)
72 CFI_RESTORE(%rbx)
73 CFI_RESTORE(%rcx)
74 CFI_RESTORE(%rdx)
75 CFI_RESTORE(%rsi)
76 CFI_RESTORE(%rdi)
77 CFI_RESTORE(%r8)
78 CFI_RESTORE(%r9)
79 CFI_RESTORE(%r10)
80 CFI_RESTORE(%r11)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000081 ret
Kostya Serebryany14e92c22013-12-05 07:44:35 +000082 CFI_ENDPROC
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000083
Dmitry Vyukov20678e22012-11-26 14:20:26 +000084.hidden __tsan_report_race
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000085.globl __tsan_report_race_thunk
86__tsan_report_race_thunk:
Kostya Serebryany14e92c22013-12-05 07:44:35 +000087 CFI_STARTPROC
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000088 # Save scratch registers.
89 push %rax
Kostya Serebryany14e92c22013-12-05 07:44:35 +000090 CFI_ADJUST_CFA_OFFSET(8)
91 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000092 push %rcx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000093 CFI_ADJUST_CFA_OFFSET(8)
94 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000095 push %rdx
Kostya Serebryany14e92c22013-12-05 07:44:35 +000096 CFI_ADJUST_CFA_OFFSET(8)
97 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000098 push %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +000099 CFI_ADJUST_CFA_OFFSET(8)
100 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000101 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000102 CFI_ADJUST_CFA_OFFSET(8)
103 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000104 push %r8
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000105 CFI_ADJUST_CFA_OFFSET(8)
106 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000107 push %r9
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000108 CFI_ADJUST_CFA_OFFSET(8)
109 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000110 push %r10
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000111 CFI_ADJUST_CFA_OFFSET(8)
112 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000113 push %r11
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000114 CFI_ADJUST_CFA_OFFSET(8)
115 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000116 # Align stack frame.
117 push %rbx # non-scratch
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000118 CFI_ADJUST_CFA_OFFSET(8)
119 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000120 mov %rsp, %rbx # save current rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000121 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000122 shr $4, %rsp # clear 4 lsb, align to 16
123 shl $4, %rsp
124
125 call __tsan_report_race
126
127 # Unalign stack frame back.
128 mov %rbx, %rsp # restore the original rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000129 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000130 pop %rbx
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000131 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000132 # Restore scratch registers.
133 pop %r11
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000134 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000135 pop %r10
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000136 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000137 pop %r9
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000138 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000139 pop %r8
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000140 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000141 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000142 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000143 pop %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000144 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000145 pop %rdx
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000146 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000147 pop %rcx
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000148 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000149 pop %rax
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000150 CFI_ADJUST_CFA_OFFSET(-8)
151 CFI_RESTORE(%rax)
152 CFI_RESTORE(%rbx)
153 CFI_RESTORE(%rcx)
154 CFI_RESTORE(%rdx)
155 CFI_RESTORE(%rsi)
156 CFI_RESTORE(%rdi)
157 CFI_RESTORE(%r8)
158 CFI_RESTORE(%r9)
159 CFI_RESTORE(%r10)
160 CFI_RESTORE(%r11)
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000161 ret
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000162 CFI_ENDPROC
Dmitry Vyukove2b5b5c2012-08-17 18:05:28 +0000163
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000164.hidden __tsan_setjmp
165.comm _ZN14__interception11real_setjmpE,8,8
166.globl setjmp
167.type setjmp, @function
168setjmp:
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000169 CFI_STARTPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000170 // save env parameter
171 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000172 CFI_ADJUST_CFA_OFFSET(8)
173 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000174 // obtain %rsp
175 lea 16(%rsp), %rdi
176 mov %rdi, %rsi
177 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
178 rol $0x11, %rsi
179 // call tsan interceptor
180 call __tsan_setjmp
181 // restore env parameter
182 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000183 CFI_ADJUST_CFA_OFFSET(-8)
184 CFI_RESTORE(%rdi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000185 // tail jump to libc setjmp
186 movl $0, %eax
187 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
188 jmp *(%rdx)
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000189 CFI_ENDPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000190.size setjmp, .-setjmp
191
192.comm _ZN14__interception12real__setjmpE,8,8
193.globl _setjmp
194.type _setjmp, @function
195_setjmp:
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000196 CFI_STARTPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000197 // save env parameter
198 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000199 CFI_ADJUST_CFA_OFFSET(8)
200 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000201 // obtain %rsp
202 lea 16(%rsp), %rdi
203 mov %rdi, %rsi
204 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
205 rol $0x11, %rsi
206 // call tsan interceptor
207 call __tsan_setjmp
208 // restore env parameter
209 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000210 CFI_ADJUST_CFA_OFFSET(-8)
211 CFI_RESTORE(%rdi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000212 // tail jump to libc setjmp
213 movl $0, %eax
214 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
215 jmp *(%rdx)
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000216 CFI_ENDPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000217.size _setjmp, .-_setjmp
218
219.comm _ZN14__interception14real_sigsetjmpE,8,8
220.globl sigsetjmp
221.type sigsetjmp, @function
222sigsetjmp:
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000223 CFI_STARTPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000224 // save env parameter
225 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000226 CFI_ADJUST_CFA_OFFSET(8)
227 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000228 // save savesigs parameter
229 push %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000230 CFI_ADJUST_CFA_OFFSET(8)
231 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000232 // align stack frame
233 sub $8, %rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000234 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000235 // obtain %rsp
236 lea 32(%rsp), %rdi
237 mov %rdi, %rsi
238 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
239 rol $0x11, %rsi
240 // call tsan interceptor
241 call __tsan_setjmp
242 // unalign stack frame
243 add $8, %rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000244 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000245 // restore savesigs parameter
246 pop %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000247 CFI_ADJUST_CFA_OFFSET(-8)
248 CFI_RESTORE(%rsi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000249 // restore env parameter
250 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000251 CFI_ADJUST_CFA_OFFSET(-8)
252 CFI_RESTORE(%rdi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000253 // tail jump to libc sigsetjmp
254 movl $0, %eax
255 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
256 jmp *(%rdx)
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000257 CFI_ENDPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000258.size sigsetjmp, .-sigsetjmp
259
260.comm _ZN14__interception16real___sigsetjmpE,8,8
261.globl __sigsetjmp
262.type __sigsetjmp, @function
263__sigsetjmp:
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000264 CFI_STARTPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000265 // save env parameter
266 push %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000267 CFI_ADJUST_CFA_OFFSET(8)
268 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000269 // save savesigs parameter
270 push %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000271 CFI_ADJUST_CFA_OFFSET(8)
272 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000273 // align stack frame
274 sub $8, %rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000275 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000276 // obtain %rsp
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 // call tsan interceptor
282 call __tsan_setjmp
283 // unalign stack frame
284 add $8, %rsp
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000285 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000286 // restore savesigs parameter
287 pop %rsi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000288 CFI_ADJUST_CFA_OFFSET(-8)
289 CFI_RESTORE(%rsi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000290 // restore env parameter
291 pop %rdi
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000292 CFI_ADJUST_CFA_OFFSET(-8)
293 CFI_RESTORE(%rdi)
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000294 // tail jump to libc sigsetjmp
295 movl $0, %eax
296 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
297 jmp *(%rdx)
Kostya Serebryany14e92c22013-12-05 07:44:35 +0000298 CFI_ENDPROC
Dmitry Vyukov4adf49d2013-03-25 10:10:44 +0000299.size __sigsetjmp, .-__sigsetjmp
300
Dmitry Vyukove2b5b5c2012-08-17 18:05:28 +0000301#ifdef __linux__
302/* We do not need executable stack. */
303.section .note.GNU-stack,"",@progbits
304#endif