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