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