blob: 8db62f9013a3d7ff39e8cfc86ea5d82c42892eda [file] [log] [blame]
Stephen Hines2d1fdb22014-05-28 23:58:16 -07001#include "sanitizer_common/sanitizer_asm.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +00002.section .text
3
Dmitry Vyukovf5d526f2012-11-26 14:20:26 +00004.hidden __tsan_trace_switch
Kostya Serebryany7ac41482012-05-10 13:48:04 +00005.globl __tsan_trace_switch_thunk
6__tsan_trace_switch_thunk:
Stephen Hines2d1fdb22014-05-28 23:58:16 -07007 CFI_STARTPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +00008 # Save scratch registers.
9 push %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070010 CFI_ADJUST_CFA_OFFSET(8)
11 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000012 push %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070013 CFI_ADJUST_CFA_OFFSET(8)
14 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000015 push %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070016 CFI_ADJUST_CFA_OFFSET(8)
17 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000018 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070019 CFI_ADJUST_CFA_OFFSET(8)
20 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000021 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070022 CFI_ADJUST_CFA_OFFSET(8)
23 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000024 push %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -070025 CFI_ADJUST_CFA_OFFSET(8)
26 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000027 push %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -070028 CFI_ADJUST_CFA_OFFSET(8)
29 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000030 push %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -070031 CFI_ADJUST_CFA_OFFSET(8)
32 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000033 push %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -070034 CFI_ADJUST_CFA_OFFSET(8)
35 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000036 # Align stack frame.
37 push %rbx # non-scratch
Stephen Hines2d1fdb22014-05-28 23:58:16 -070038 CFI_ADJUST_CFA_OFFSET(8)
39 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000040 mov %rsp, %rbx # save current rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -070041 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany7ac41482012-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
Stephen Hines2d1fdb22014-05-28 23:58:16 -070049 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000050 pop %rbx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070051 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000052 # Restore scratch registers.
53 pop %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -070054 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000055 pop %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -070056 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000057 pop %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -070058 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000059 pop %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -070060 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000061 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070062 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000063 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070064 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000065 pop %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070066 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000067 pop %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070068 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000069 pop %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070070 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 Serebryany7ac41482012-05-10 13:48:04 +000081 ret
Stephen Hines2d1fdb22014-05-28 23:58:16 -070082 CFI_ENDPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +000083
Dmitry Vyukovf5d526f2012-11-26 14:20:26 +000084.hidden __tsan_report_race
Kostya Serebryany7ac41482012-05-10 13:48:04 +000085.globl __tsan_report_race_thunk
86__tsan_report_race_thunk:
Stephen Hines2d1fdb22014-05-28 23:58:16 -070087 CFI_STARTPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +000088 # Save scratch registers.
89 push %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070090 CFI_ADJUST_CFA_OFFSET(8)
91 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000092 push %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070093 CFI_ADJUST_CFA_OFFSET(8)
94 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000095 push %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070096 CFI_ADJUST_CFA_OFFSET(8)
97 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000098 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070099 CFI_ADJUST_CFA_OFFSET(8)
100 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000101 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700102 CFI_ADJUST_CFA_OFFSET(8)
103 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000104 push %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700105 CFI_ADJUST_CFA_OFFSET(8)
106 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000107 push %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700108 CFI_ADJUST_CFA_OFFSET(8)
109 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000110 push %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700111 CFI_ADJUST_CFA_OFFSET(8)
112 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000113 push %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700114 CFI_ADJUST_CFA_OFFSET(8)
115 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000116 # Align stack frame.
117 push %rbx # non-scratch
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700118 CFI_ADJUST_CFA_OFFSET(8)
119 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000120 mov %rsp, %rbx # save current rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700121 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany7ac41482012-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
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700129 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000130 pop %rbx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700131 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000132 # Restore scratch registers.
133 pop %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700134 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000135 pop %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700136 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000137 pop %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700138 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000139 pop %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700140 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000141 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700142 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000143 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700144 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000145 pop %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700146 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000147 pop %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700148 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000149 pop %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700150 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 Serebryany7ac41482012-05-10 13:48:04 +0000161 ret
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700162 CFI_ENDPROC
Dmitry Vyukova911c6f2012-08-17 18:05:28 +0000163
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000164.hidden __tsan_setjmp
165.comm _ZN14__interception11real_setjmpE,8,8
166.globl setjmp
167.type setjmp, @function
168setjmp:
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700169 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000170 // save env parameter
171 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700172 CFI_ADJUST_CFA_OFFSET(8)
173 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000174 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800175#if defined(__FreeBSD__)
176 lea 8(%rsp), %rdi
177 mov %rdi, %rsi
178#else
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000179 lea 16(%rsp), %rdi
180 mov %rdi, %rsi
181 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
182 rol $0x11, %rsi
Stephen Hines6d186232014-11-26 17:56:19 -0800183#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000184 // call tsan interceptor
185 call __tsan_setjmp
186 // restore env parameter
187 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700188 CFI_ADJUST_CFA_OFFSET(-8)
189 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000190 // tail jump to libc setjmp
191 movl $0, %eax
192 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
193 jmp *(%rdx)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700194 CFI_ENDPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000195.size setjmp, .-setjmp
196
197.comm _ZN14__interception12real__setjmpE,8,8
198.globl _setjmp
199.type _setjmp, @function
200_setjmp:
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700201 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000202 // save env parameter
203 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700204 CFI_ADJUST_CFA_OFFSET(8)
205 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000206 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800207#if defined(__FreeBSD__)
208 lea 8(%rsp), %rdi
209 mov %rdi, %rsi
210#else
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000211 lea 16(%rsp), %rdi
212 mov %rdi, %rsi
213 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
214 rol $0x11, %rsi
Stephen Hines6d186232014-11-26 17:56:19 -0800215#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000216 // call tsan interceptor
217 call __tsan_setjmp
218 // restore env parameter
219 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700220 CFI_ADJUST_CFA_OFFSET(-8)
221 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000222 // tail jump to libc setjmp
223 movl $0, %eax
224 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
225 jmp *(%rdx)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700226 CFI_ENDPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000227.size _setjmp, .-_setjmp
228
229.comm _ZN14__interception14real_sigsetjmpE,8,8
230.globl sigsetjmp
231.type sigsetjmp, @function
232sigsetjmp:
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700233 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000234 // save env parameter
235 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700236 CFI_ADJUST_CFA_OFFSET(8)
237 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000238 // save savesigs parameter
239 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700240 CFI_ADJUST_CFA_OFFSET(8)
241 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000242 // align stack frame
243 sub $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700244 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000245 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800246#if defined(__FreeBSD__)
247 lea 24(%rsp), %rdi
248 mov %rdi, %rsi
249#else
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000250 lea 32(%rsp), %rdi
251 mov %rdi, %rsi
252 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
253 rol $0x11, %rsi
Stephen Hines6d186232014-11-26 17:56:19 -0800254#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000255 // call tsan interceptor
256 call __tsan_setjmp
257 // unalign stack frame
258 add $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700259 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000260 // restore savesigs parameter
261 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700262 CFI_ADJUST_CFA_OFFSET(-8)
263 CFI_RESTORE(%rsi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000264 // restore env parameter
265 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700266 CFI_ADJUST_CFA_OFFSET(-8)
267 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000268 // tail jump to libc sigsetjmp
269 movl $0, %eax
270 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
271 jmp *(%rdx)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700272 CFI_ENDPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000273.size sigsetjmp, .-sigsetjmp
274
275.comm _ZN14__interception16real___sigsetjmpE,8,8
276.globl __sigsetjmp
277.type __sigsetjmp, @function
278__sigsetjmp:
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700279 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000280 // save env parameter
281 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700282 CFI_ADJUST_CFA_OFFSET(8)
283 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000284 // save savesigs parameter
285 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700286 CFI_ADJUST_CFA_OFFSET(8)
287 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000288 // align stack frame
289 sub $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700290 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000291 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800292#if defined(__FreeBSD__)
293 lea 24(%rsp), %rdi
294 mov %rdi, %rsi
295#else
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000296 lea 32(%rsp), %rdi
297 mov %rdi, %rsi
298 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
299 rol $0x11, %rsi
Stephen Hines6d186232014-11-26 17:56:19 -0800300#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000301 // call tsan interceptor
302 call __tsan_setjmp
303 // unalign stack frame
304 add $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700305 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000306 // restore savesigs parameter
307 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700308 CFI_ADJUST_CFA_OFFSET(-8)
309 CFI_RESTORE(%rsi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000310 // restore env parameter
311 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700312 CFI_ADJUST_CFA_OFFSET(-8)
313 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000314 // tail jump to libc sigsetjmp
315 movl $0, %eax
316 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
317 jmp *(%rdx)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700318 CFI_ENDPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000319.size __sigsetjmp, .-__sigsetjmp
320
Stephen Hines6d186232014-11-26 17:56:19 -0800321#if defined(__FreeBSD__) || defined(__linux__)
Dmitry Vyukova911c6f2012-08-17 18:05:28 +0000322/* We do not need executable stack. */
323.section .note.GNU-stack,"",@progbits
324#endif