blob: caa832375e52d9c1b23b00d4533b75da7ceeb43e [file] [log] [blame]
Stephen Hines2d1fdb22014-05-28 23:58:16 -07001#include "sanitizer_common/sanitizer_asm.h"
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08002#if !defined(__APPLE__)
Kostya Serebryany7ac41482012-05-10 13:48:04 +00003.section .text
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08004#else
5.section __TEXT,__text
6#endif
Kostya Serebryany7ac41482012-05-10 13:48:04 +00007
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08008ASM_HIDDEN(__tsan_trace_switch)
9.globl ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk)
10ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk):
Stephen Hines2d1fdb22014-05-28 23:58:16 -070011 CFI_STARTPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +000012 # Save scratch registers.
13 push %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070014 CFI_ADJUST_CFA_OFFSET(8)
15 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000016 push %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070017 CFI_ADJUST_CFA_OFFSET(8)
18 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000019 push %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070020 CFI_ADJUST_CFA_OFFSET(8)
21 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000022 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070023 CFI_ADJUST_CFA_OFFSET(8)
24 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000025 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070026 CFI_ADJUST_CFA_OFFSET(8)
27 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000028 push %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -070029 CFI_ADJUST_CFA_OFFSET(8)
30 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000031 push %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -070032 CFI_ADJUST_CFA_OFFSET(8)
33 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000034 push %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -070035 CFI_ADJUST_CFA_OFFSET(8)
36 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000037 push %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -070038 CFI_ADJUST_CFA_OFFSET(8)
39 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000040 # Align stack frame.
41 push %rbx # non-scratch
Stephen Hines2d1fdb22014-05-28 23:58:16 -070042 CFI_ADJUST_CFA_OFFSET(8)
43 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000044 mov %rsp, %rbx # save current rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -070045 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000046 shr $4, %rsp # clear 4 lsb, align to 16
47 shl $4, %rsp
48
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080049 call ASM_TSAN_SYMBOL(__tsan_trace_switch)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000050
51 # Unalign stack frame back.
52 mov %rbx, %rsp # restore the original rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -070053 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000054 pop %rbx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070055 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000056 # Restore scratch registers.
57 pop %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -070058 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000059 pop %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -070060 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000061 pop %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -070062 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000063 pop %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -070064 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000065 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070066 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000067 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -070068 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000069 pop %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070070 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000071 pop %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070072 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000073 pop %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070074 CFI_ADJUST_CFA_OFFSET(-8)
75 CFI_RESTORE(%rax)
76 CFI_RESTORE(%rbx)
77 CFI_RESTORE(%rcx)
78 CFI_RESTORE(%rdx)
79 CFI_RESTORE(%rsi)
80 CFI_RESTORE(%rdi)
81 CFI_RESTORE(%r8)
82 CFI_RESTORE(%r9)
83 CFI_RESTORE(%r10)
84 CFI_RESTORE(%r11)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000085 ret
Stephen Hines2d1fdb22014-05-28 23:58:16 -070086 CFI_ENDPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +000087
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080088ASM_HIDDEN(__tsan_report_race)
89.globl ASM_TSAN_SYMBOL(__tsan_report_race_thunk)
90ASM_TSAN_SYMBOL(__tsan_report_race_thunk):
Stephen Hines2d1fdb22014-05-28 23:58:16 -070091 CFI_STARTPROC
Kostya Serebryany7ac41482012-05-10 13:48:04 +000092 # Save scratch registers.
93 push %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -070094 CFI_ADJUST_CFA_OFFSET(8)
95 CFI_REL_OFFSET(%rax, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000096 push %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -070097 CFI_ADJUST_CFA_OFFSET(8)
98 CFI_REL_OFFSET(%rcx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +000099 push %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700100 CFI_ADJUST_CFA_OFFSET(8)
101 CFI_REL_OFFSET(%rdx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000102 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700103 CFI_ADJUST_CFA_OFFSET(8)
104 CFI_REL_OFFSET(%rsi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000105 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700106 CFI_ADJUST_CFA_OFFSET(8)
107 CFI_REL_OFFSET(%rdi, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000108 push %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700109 CFI_ADJUST_CFA_OFFSET(8)
110 CFI_REL_OFFSET(%r8, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000111 push %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700112 CFI_ADJUST_CFA_OFFSET(8)
113 CFI_REL_OFFSET(%r9, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000114 push %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700115 CFI_ADJUST_CFA_OFFSET(8)
116 CFI_REL_OFFSET(%r10, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000117 push %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700118 CFI_ADJUST_CFA_OFFSET(8)
119 CFI_REL_OFFSET(%r11, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000120 # Align stack frame.
121 push %rbx # non-scratch
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700122 CFI_ADJUST_CFA_OFFSET(8)
123 CFI_REL_OFFSET(%rbx, 0)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000124 mov %rsp, %rbx # save current rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700125 CFI_DEF_CFA_REGISTER(%rbx)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000126 shr $4, %rsp # clear 4 lsb, align to 16
127 shl $4, %rsp
128
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800129 call ASM_TSAN_SYMBOL(__tsan_report_race)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000130
131 # Unalign stack frame back.
132 mov %rbx, %rsp # restore the original rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700133 CFI_DEF_CFA_REGISTER(%rsp)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000134 pop %rbx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700135 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000136 # Restore scratch registers.
137 pop %r11
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700138 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000139 pop %r10
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700140 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000141 pop %r9
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700142 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000143 pop %r8
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700144 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000145 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700146 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000147 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700148 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000149 pop %rdx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700150 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000151 pop %rcx
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700152 CFI_ADJUST_CFA_OFFSET(-8)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000153 pop %rax
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700154 CFI_ADJUST_CFA_OFFSET(-8)
155 CFI_RESTORE(%rax)
156 CFI_RESTORE(%rbx)
157 CFI_RESTORE(%rcx)
158 CFI_RESTORE(%rdx)
159 CFI_RESTORE(%rsi)
160 CFI_RESTORE(%rdi)
161 CFI_RESTORE(%r8)
162 CFI_RESTORE(%r9)
163 CFI_RESTORE(%r10)
164 CFI_RESTORE(%r11)
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000165 ret
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700166 CFI_ENDPROC
Dmitry Vyukova911c6f2012-08-17 18:05:28 +0000167
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800168ASM_HIDDEN(__tsan_setjmp)
169#if !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000170.comm _ZN14__interception11real_setjmpE,8,8
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800171#endif
172.globl ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)
173ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
174ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp):
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700175 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000176 // save env parameter
177 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700178 CFI_ADJUST_CFA_OFFSET(8)
179 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000180 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800181#if defined(__FreeBSD__)
182 lea 8(%rsp), %rdi
183 mov %rdi, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800184#elif defined(__APPLE__)
185 lea 16(%rsp), %rdi
186 mov %rdi, %rsi
187#elif defined(__linux__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000188 lea 16(%rsp), %rdi
189 mov %rdi, %rsi
190 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
191 rol $0x11, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800192#else
193# error "Unknown platform"
Stephen Hines6d186232014-11-26 17:56:19 -0800194#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000195 // call tsan interceptor
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800196 call ASM_TSAN_SYMBOL(__tsan_setjmp)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000197 // restore env parameter
198 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700199 CFI_ADJUST_CFA_OFFSET(-8)
200 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000201 // tail jump to libc setjmp
202 movl $0, %eax
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800203#if !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000204 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
205 jmp *(%rdx)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800206#else
207 jmp ASM_TSAN_SYMBOL(setjmp)
208#endif
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700209 CFI_ENDPROC
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800210ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000211
212.comm _ZN14__interception12real__setjmpE,8,8
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800213.globl ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)
214ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
215ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp):
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700216 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000217 // save env parameter
218 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700219 CFI_ADJUST_CFA_OFFSET(8)
220 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000221 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800222#if defined(__FreeBSD__)
223 lea 8(%rsp), %rdi
224 mov %rdi, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800225#elif defined(__APPLE__)
226 lea 16(%rsp), %rdi
227 mov %rdi, %rsi
228#elif defined(__linux__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000229 lea 16(%rsp), %rdi
230 mov %rdi, %rsi
231 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
232 rol $0x11, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800233#else
234# error "Unknown platform"
Stephen Hines6d186232014-11-26 17:56:19 -0800235#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000236 // call tsan interceptor
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800237 call ASM_TSAN_SYMBOL(__tsan_setjmp)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000238 // restore env parameter
239 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700240 CFI_ADJUST_CFA_OFFSET(-8)
241 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000242 // tail jump to libc setjmp
243 movl $0, %eax
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800244#if !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000245 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
246 jmp *(%rdx)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800247#else
248 jmp ASM_TSAN_SYMBOL(_setjmp)
249#endif
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700250 CFI_ENDPROC
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800251ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000252
253.comm _ZN14__interception14real_sigsetjmpE,8,8
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800254.globl ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)
255ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
256ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp):
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700257 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000258 // save env parameter
259 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700260 CFI_ADJUST_CFA_OFFSET(8)
261 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000262 // save savesigs parameter
263 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700264 CFI_ADJUST_CFA_OFFSET(8)
265 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000266 // align stack frame
267 sub $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700268 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000269 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800270#if defined(__FreeBSD__)
271 lea 24(%rsp), %rdi
272 mov %rdi, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800273#elif defined(__APPLE__)
274 lea 32(%rsp), %rdi
275 mov %rdi, %rsi
276#elif defined(__linux__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000277 lea 32(%rsp), %rdi
278 mov %rdi, %rsi
279 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
280 rol $0x11, %rsi
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800281#else
282# error "Unknown platform"
Stephen Hines6d186232014-11-26 17:56:19 -0800283#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000284 // call tsan interceptor
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800285 call ASM_TSAN_SYMBOL(__tsan_setjmp)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000286 // unalign stack frame
287 add $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700288 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000289 // restore savesigs parameter
290 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700291 CFI_ADJUST_CFA_OFFSET(-8)
292 CFI_RESTORE(%rsi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000293 // restore env parameter
294 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700295 CFI_ADJUST_CFA_OFFSET(-8)
296 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000297 // tail jump to libc sigsetjmp
298 movl $0, %eax
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800299#if !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000300 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
301 jmp *(%rdx)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800302#else
303 jmp ASM_TSAN_SYMBOL(sigsetjmp)
304#endif
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700305 CFI_ENDPROC
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800306ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000307
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800308#if !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000309.comm _ZN14__interception16real___sigsetjmpE,8,8
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800310.globl ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)
311ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
312ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp):
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700313 CFI_STARTPROC
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000314 // save env parameter
315 push %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700316 CFI_ADJUST_CFA_OFFSET(8)
317 CFI_REL_OFFSET(%rdi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000318 // save savesigs parameter
319 push %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700320 CFI_ADJUST_CFA_OFFSET(8)
321 CFI_REL_OFFSET(%rsi, 0)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000322 // align stack frame
323 sub $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700324 CFI_ADJUST_CFA_OFFSET(8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000325 // obtain %rsp
Stephen Hines6d186232014-11-26 17:56:19 -0800326#if defined(__FreeBSD__)
327 lea 24(%rsp), %rdi
328 mov %rdi, %rsi
329#else
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000330 lea 32(%rsp), %rdi
331 mov %rdi, %rsi
332 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp)
333 rol $0x11, %rsi
Stephen Hines6d186232014-11-26 17:56:19 -0800334#endif
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000335 // call tsan interceptor
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800336 call ASM_TSAN_SYMBOL(__tsan_setjmp)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000337 // unalign stack frame
338 add $8, %rsp
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700339 CFI_ADJUST_CFA_OFFSET(-8)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000340 // restore savesigs parameter
341 pop %rsi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700342 CFI_ADJUST_CFA_OFFSET(-8)
343 CFI_RESTORE(%rsi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000344 // restore env parameter
345 pop %rdi
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700346 CFI_ADJUST_CFA_OFFSET(-8)
347 CFI_RESTORE(%rdi)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000348 // tail jump to libc sigsetjmp
349 movl $0, %eax
350 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
351 jmp *(%rdx)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700352 CFI_ENDPROC
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800353ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
354#endif // !defined(__APPLE__)
Dmitry Vyukov8b30c252013-03-25 10:10:44 +0000355
Stephen Hines6d186232014-11-26 17:56:19 -0800356#if defined(__FreeBSD__) || defined(__linux__)
Dmitry Vyukova911c6f2012-08-17 18:05:28 +0000357/* We do not need executable stack. */
358.section .note.GNU-stack,"",@progbits
359#endif