1// The content of this file is x86_64-only:
2#if defined(__x86_64__)
3
4#include "sanitizer_common/sanitizer_asm.h"
5
6.att_syntax
7
8#if !defined(__APPLE__)
9.section .text
10#else
11.section __TEXT,__text
12#endif
13
14ASM_HIDDEN(__tsan_setjmp)
15#if defined(__NetBSD__)
16.comm _ZN14__interception15real___setjmp14E,8,8
17#elif !defined(__APPLE__)
18.comm _ZN14__interception11real_setjmpE,8,8
19#endif
20#if defined(__NetBSD__)
21.globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)
22ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
23ASM_SYMBOL_INTERCEPTOR(__setjmp14):
24#else
25.globl ASM_SYMBOL_INTERCEPTOR(setjmp)
26ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
27ASM_SYMBOL_INTERCEPTOR(setjmp):
28#endif
29 CFI_STARTPROC
30 _CET_ENDBR
31 // save env parameter
32 push %rdi
33 CFI_ADJUST_CFA_OFFSET(8)
34 CFI_REL_OFFSET(%rdi, 0)
35 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
36#if defined(__FreeBSD__) || defined(__NetBSD__)
37 lea 8(%rsp), %rdi
38#elif defined(__linux__) || defined(__APPLE__)
39 lea 16(%rsp), %rdi
40#else
41# error "Unknown platform"
42#endif
43 // call tsan interceptor
44 call ASM_SYMBOL(__tsan_setjmp)
45 // restore env parameter
46 pop %rdi
47 CFI_ADJUST_CFA_OFFSET(-8)
48 CFI_RESTORE(%rdi)
49 // tail jump to libc setjmp
50 movl $0, %eax
51#if defined(__NetBSD__)
52 movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
53 jmp *(%rdx)
54#elif !defined(__APPLE__)
55 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
56 jmp *(%rdx)
57#else
58 jmp ASM_SYMBOL(setjmp)
59#endif
60 CFI_ENDPROC
61#if defined(__NetBSD__)
62ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
63#else
64ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
65#endif
66
67.comm _ZN14__interception12real__setjmpE,8,8
68.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
69ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
70ASM_SYMBOL_INTERCEPTOR(_setjmp):
71 CFI_STARTPROC
72 _CET_ENDBR
73 // save env parameter
74 push %rdi
75 CFI_ADJUST_CFA_OFFSET(8)
76 CFI_REL_OFFSET(%rdi, 0)
77 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
78#if defined(__FreeBSD__) || defined(__NetBSD__)
79 lea 8(%rsp), %rdi
80#elif defined(__linux__) || defined(__APPLE__)
81 lea 16(%rsp), %rdi
82#else
83# error "Unknown platform"
84#endif
85 // call tsan interceptor
86 call ASM_SYMBOL(__tsan_setjmp)
87 // restore env parameter
88 pop %rdi
89 CFI_ADJUST_CFA_OFFSET(-8)
90 CFI_RESTORE(%rdi)
91 // tail jump to libc setjmp
92 movl $0, %eax
93#if !defined(__APPLE__)
94 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
95 jmp *(%rdx)
96#else
97 jmp ASM_SYMBOL(_setjmp)
98#endif
99 CFI_ENDPROC
100ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
101
102#if defined(__NetBSD__)
103.comm _ZN14__interception18real___sigsetjmp14E,8,8
104.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)
105ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
106ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):
107#else
108.comm _ZN14__interception14real_sigsetjmpE,8,8
109.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
110ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
111ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
112#endif
113 CFI_STARTPROC
114 _CET_ENDBR
115 // save env parameter
116 push %rdi
117 CFI_ADJUST_CFA_OFFSET(8)
118 CFI_REL_OFFSET(%rdi, 0)
119 // save savesigs parameter
120 push %rsi
121 CFI_ADJUST_CFA_OFFSET(8)
122 CFI_REL_OFFSET(%rsi, 0)
123 // align stack frame
124 sub $8, %rsp
125 CFI_ADJUST_CFA_OFFSET(8)
126 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
127#if defined(__FreeBSD__) || defined(__NetBSD__)
128 lea 24(%rsp), %rdi
129#elif defined(__linux__) || defined(__APPLE__)
130 lea 32(%rsp), %rdi
131#else
132# error "Unknown platform"
133#endif
134 // call tsan interceptor
135 call ASM_SYMBOL(__tsan_setjmp)
136 // unalign stack frame
137 add $8, %rsp
138 CFI_ADJUST_CFA_OFFSET(-8)
139 // restore savesigs parameter
140 pop %rsi
141 CFI_ADJUST_CFA_OFFSET(-8)
142 CFI_RESTORE(%rsi)
143 // restore env parameter
144 pop %rdi
145 CFI_ADJUST_CFA_OFFSET(-8)
146 CFI_RESTORE(%rdi)
147 // tail jump to libc sigsetjmp
148 movl $0, %eax
149#if defined(__NetBSD__)
150 movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
151 jmp *(%rdx)
152#elif !defined(__APPLE__)
153 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
154 jmp *(%rdx)
155#else
156 jmp ASM_SYMBOL(sigsetjmp)
157#endif
158 CFI_ENDPROC
159#if defined(__NetBSD__)
160ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
161#else
162ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
163#endif
164
165#if !defined(__APPLE__) && !defined(__NetBSD__)
166.comm _ZN14__interception16real___sigsetjmpE,8,8
167.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
168ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
169ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
170 CFI_STARTPROC
171 _CET_ENDBR
172 // save env parameter
173 push %rdi
174 CFI_ADJUST_CFA_OFFSET(8)
175 CFI_REL_OFFSET(%rdi, 0)
176 // save savesigs parameter
177 push %rsi
178 CFI_ADJUST_CFA_OFFSET(8)
179 CFI_REL_OFFSET(%rsi, 0)
180 // align stack frame
181 sub $8, %rsp
182 CFI_ADJUST_CFA_OFFSET(8)
183 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
184#if defined(__FreeBSD__)
185 lea 24(%rsp), %rdi
186#else
187 lea 32(%rsp), %rdi
188#endif
189 // call tsan interceptor
190 call ASM_SYMBOL(__tsan_setjmp)
191 // unalign stack frame
192 add $8, %rsp
193 CFI_ADJUST_CFA_OFFSET(-8)
194 // restore savesigs parameter
195 pop %rsi
196 CFI_ADJUST_CFA_OFFSET(-8)
197 CFI_RESTORE(%rsi)
198 // restore env parameter
199 pop %rdi
200 CFI_ADJUST_CFA_OFFSET(-8)
201 CFI_RESTORE(%rdi)
202 // tail jump to libc sigsetjmp
203 movl $0, %eax
204 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
205 jmp *(%rdx)
206 CFI_ENDPROC
207ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
208#endif // !defined(__APPLE__) && !defined(__NetBSD__)
209
210NO_EXEC_STACK_DIRECTIVE
211
212#endif
213