1 | // The content of this file is AArch64-only: |
2 | #if defined(__aarch64__) |
3 | |
4 | #include "sanitizer_common/sanitizer_asm.h" |
5 | #include "builtins/assembly.h" |
6 | |
7 | #if !defined(__APPLE__) |
8 | .section .text |
9 | #else |
10 | .section __TEXT,__text |
11 | .align 3 |
12 | #endif |
13 | |
14 | ASM_HIDDEN(__tsan_setjmp) |
15 | .comm _ZN14__interception11real_setjmpE,8,8 |
16 | .globl ASM_SYMBOL_INTERCEPTOR(setjmp) |
17 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
18 | ASM_SYMBOL_INTERCEPTOR(setjmp): |
19 | CFI_STARTPROC |
20 | BTI_C |
21 | |
22 | // Save frame/link register |
23 | stp x29, x30, [sp, -32]! |
24 | CFI_DEF_CFA_OFFSET (32) |
25 | CFI_OFFSET (29, -32) |
26 | CFI_OFFSET (30, -24) |
27 | |
28 | // Adjust the SP for previous frame |
29 | add x29, sp, 0 |
30 | CFI_DEF_CFA_REGISTER (29) |
31 | |
32 | // Save env parameter |
33 | str x0, [sp, 16] |
34 | CFI_OFFSET (0, -16) |
35 | |
36 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
37 | add x0, x29, 32 |
38 | |
39 | // call tsan interceptor |
40 | bl ASM_SYMBOL(__tsan_setjmp) |
41 | |
42 | // Restore env parameter |
43 | ldr x0, [sp, 16] |
44 | CFI_RESTORE (0) |
45 | |
46 | // Restore frame/link register |
47 | ldp x29, x30, [sp], 32 |
48 | CFI_RESTORE (29) |
49 | CFI_RESTORE (30) |
50 | CFI_DEF_CFA (31, 0) |
51 | |
52 | // tail jump to libc setjmp |
53 | #if !defined(__APPLE__) |
54 | adrp x1, :got:_ZN14__interception11real_setjmpE |
55 | ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE] |
56 | ldr x1, [x1] |
57 | #else |
58 | adrp x1, _setjmp@GOTPAGE |
59 | ldr x1, [x1, _setjmp@GOTPAGEOFF] |
60 | #endif |
61 | br x1 |
62 | |
63 | CFI_ENDPROC |
64 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
65 | |
66 | .comm _ZN14__interception12real__setjmpE,8,8 |
67 | .globl ASM_SYMBOL_INTERCEPTOR(_setjmp) |
68 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
69 | ASM_SYMBOL_INTERCEPTOR(_setjmp): |
70 | CFI_STARTPROC |
71 | BTI_C |
72 | |
73 | // Save frame/link register |
74 | stp x29, x30, [sp, -32]! |
75 | CFI_DEF_CFA_OFFSET (32) |
76 | CFI_OFFSET (29, -32) |
77 | CFI_OFFSET (30, -24) |
78 | |
79 | // Adjust the SP for previous frame |
80 | add x29, sp, 0 |
81 | CFI_DEF_CFA_REGISTER (29) |
82 | |
83 | // Save env parameter |
84 | str x0, [sp, 16] |
85 | CFI_OFFSET (0, -16) |
86 | |
87 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
88 | add x0, x29, 32 |
89 | |
90 | // call tsan interceptor |
91 | bl ASM_SYMBOL(__tsan_setjmp) |
92 | |
93 | // Restore env parameter |
94 | ldr x0, [sp, 16] |
95 | CFI_RESTORE (0) |
96 | |
97 | // Restore frame/link register |
98 | ldp x29, x30, [sp], 32 |
99 | CFI_RESTORE (29) |
100 | CFI_RESTORE (30) |
101 | CFI_DEF_CFA (31, 0) |
102 | |
103 | // tail jump to libc setjmp |
104 | #if !defined(__APPLE__) |
105 | adrp x1, :got:_ZN14__interception12real__setjmpE |
106 | ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] |
107 | ldr x1, [x1] |
108 | #else |
109 | adrp x1, __setjmp@GOTPAGE |
110 | ldr x1, [x1, __setjmp@GOTPAGEOFF] |
111 | #endif |
112 | br x1 |
113 | |
114 | CFI_ENDPROC |
115 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
116 | |
117 | .comm _ZN14__interception14real_sigsetjmpE,8,8 |
118 | .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) |
119 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
120 | ASM_SYMBOL_INTERCEPTOR(sigsetjmp): |
121 | CFI_STARTPROC |
122 | BTI_C |
123 | |
124 | // Save frame/link register |
125 | stp x29, x30, [sp, -32]! |
126 | CFI_DEF_CFA_OFFSET (32) |
127 | CFI_OFFSET (29, -32) |
128 | CFI_OFFSET (30, -24) |
129 | |
130 | // Adjust the SP for previous frame |
131 | add x29, sp, 0 |
132 | CFI_DEF_CFA_REGISTER (29) |
133 | |
134 | // Save env and savesigs parameter |
135 | stp x0, x1, [sp, 16] |
136 | CFI_OFFSET (0, -16) |
137 | CFI_OFFSET (1, -8) |
138 | |
139 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
140 | add x0, x29, 32 |
141 | |
142 | // call tsan interceptor |
143 | bl ASM_SYMBOL(__tsan_setjmp) |
144 | |
145 | // Restore env and savesigs parameter |
146 | ldp x0, x1, [sp, 16] |
147 | CFI_RESTORE (0) |
148 | CFI_RESTORE (1) |
149 | |
150 | // Restore frame/link register |
151 | ldp x29, x30, [sp], 32 |
152 | CFI_RESTORE (29) |
153 | CFI_RESTORE (30) |
154 | CFI_DEF_CFA (31, 0) |
155 | |
156 | // tail jump to libc sigsetjmp |
157 | #if !defined(__APPLE__) |
158 | adrp x2, :got:_ZN14__interception14real_sigsetjmpE |
159 | ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE] |
160 | ldr x2, [x2] |
161 | #else |
162 | adrp x2, _sigsetjmp@GOTPAGE |
163 | ldr x2, [x2, _sigsetjmp@GOTPAGEOFF] |
164 | #endif |
165 | br x2 |
166 | CFI_ENDPROC |
167 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
168 | |
169 | #if !defined(__APPLE__) |
170 | .comm _ZN14__interception16real___sigsetjmpE,8,8 |
171 | .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) |
172 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
173 | ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): |
174 | CFI_STARTPROC |
175 | BTI_C |
176 | |
177 | // Save frame/link register |
178 | stp x29, x30, [sp, -32]! |
179 | CFI_DEF_CFA_OFFSET (32) |
180 | CFI_OFFSET (29, -32) |
181 | CFI_OFFSET (30, -24) |
182 | |
183 | // Adjust the SP for previous frame |
184 | add x29, sp, 0 |
185 | CFI_DEF_CFA_REGISTER (29) |
186 | |
187 | // Save env and savesigs parameter |
188 | stp x0, x1, [sp, 16] |
189 | CFI_OFFSET (0, -16) |
190 | CFI_OFFSET (1, -8) |
191 | |
192 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
193 | add x0, x29, 32 |
194 | |
195 | // call tsan interceptor |
196 | bl ASM_SYMBOL(__tsan_setjmp) |
197 | |
198 | // Restore env and savesigs parameter |
199 | ldp x0, x1, [sp, 16] |
200 | CFI_RESTORE (0) |
201 | CFI_RESTORE (1) |
202 | |
203 | // Restore frame/link register |
204 | ldp x29, x30, [sp], 32 |
205 | CFI_RESTORE (29) |
206 | CFI_RESTORE (30) |
207 | CFI_DEF_CFA (31, 0) |
208 | |
209 | // tail jump to libc __sigsetjmp |
210 | #if !defined(__APPLE__) |
211 | adrp x2, :got:_ZN14__interception16real___sigsetjmpE |
212 | ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE] |
213 | ldr x2, [x2] |
214 | #else |
215 | adrp x2, ASM_SYMBOL(__sigsetjmp)@page |
216 | add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff |
217 | #endif |
218 | br x2 |
219 | CFI_ENDPROC |
220 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
221 | #endif |
222 | |
223 | NO_EXEC_STACK_DIRECTIVE |
224 | |
225 | GNU_PROPERTY_BTI_PAC |
226 | |
227 | #endif |
228 | |