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
7TEXT_SECTION
8#if defined(__APPLE__)
9.align 3
10#endif
11
12ASM_HIDDEN(__tsan_setjmp)
13.comm _ZN14__interception11real_setjmpE,8,8
14.globl ASM_SYMBOL_INTERCEPTOR(setjmp)
15ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
16ASM_SYMBOL_INTERCEPTOR(setjmp):
17 CFI_STARTPROC
18 BTI_C
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
62ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
63
64.comm _ZN14__interception12real__setjmpE,8,8
65.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
66ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
67ASM_SYMBOL_INTERCEPTOR(_setjmp):
68 CFI_STARTPROC
69 BTI_C
70
71 // Save frame/link register
72 stp x29, x30, [sp, -32]!
73 CFI_DEF_CFA_OFFSET (32)
74 CFI_OFFSET (29, -32)
75 CFI_OFFSET (30, -24)
76
77 // Adjust the SP for previous frame
78 add x29, sp, 0
79 CFI_DEF_CFA_REGISTER (29)
80
81 // Save env parameter
82 str x0, [sp, 16]
83 CFI_OFFSET (0, -16)
84
85 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
86 add x0, x29, 32
87
88 // call tsan interceptor
89 bl ASM_SYMBOL(__tsan_setjmp)
90
91 // Restore env parameter
92 ldr x0, [sp, 16]
93 CFI_RESTORE (0)
94
95 // Restore frame/link register
96 ldp x29, x30, [sp], 32
97 CFI_RESTORE (29)
98 CFI_RESTORE (30)
99 CFI_DEF_CFA (31, 0)
100
101 // tail jump to libc setjmp
102#if !defined(__APPLE__)
103 adrp x1, :got:_ZN14__interception12real__setjmpE
104 ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE]
105 ldr x1, [x1]
106#else
107 adrp x1, __setjmp@GOTPAGE
108 ldr x1, [x1, __setjmp@GOTPAGEOFF]
109#endif
110 br x1
111
112 CFI_ENDPROC
113ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
114
115.comm _ZN14__interception14real_sigsetjmpE,8,8
116.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
117ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
118ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
119 CFI_STARTPROC
120 BTI_C
121
122 // Save frame/link register
123 stp x29, x30, [sp, -32]!
124 CFI_DEF_CFA_OFFSET (32)
125 CFI_OFFSET (29, -32)
126 CFI_OFFSET (30, -24)
127
128 // Adjust the SP for previous frame
129 add x29, sp, 0
130 CFI_DEF_CFA_REGISTER (29)
131
132 // Save env and savesigs parameter
133 stp x0, x1, [sp, 16]
134 CFI_OFFSET (0, -16)
135 CFI_OFFSET (1, -8)
136
137 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
138 add x0, x29, 32
139
140 // call tsan interceptor
141 bl ASM_SYMBOL(__tsan_setjmp)
142
143 // Restore env and savesigs parameter
144 ldp x0, x1, [sp, 16]
145 CFI_RESTORE (0)
146 CFI_RESTORE (1)
147
148 // Restore frame/link register
149 ldp x29, x30, [sp], 32
150 CFI_RESTORE (29)
151 CFI_RESTORE (30)
152 CFI_DEF_CFA (31, 0)
153
154 // tail jump to libc sigsetjmp
155#if !defined(__APPLE__)
156 adrp x2, :got:_ZN14__interception14real_sigsetjmpE
157 ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE]
158 ldr x2, [x2]
159#else
160 adrp x2, _sigsetjmp@GOTPAGE
161 ldr x2, [x2, _sigsetjmp@GOTPAGEOFF]
162#endif
163 br x2
164 CFI_ENDPROC
165ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
166
167#if !defined(__APPLE__)
168.comm _ZN14__interception16real___sigsetjmpE,8,8
169.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
170ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
171ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
172 CFI_STARTPROC
173 BTI_C
174
175 // Save frame/link register
176 stp x29, x30, [sp, -32]!
177 CFI_DEF_CFA_OFFSET (32)
178 CFI_OFFSET (29, -32)
179 CFI_OFFSET (30, -24)
180
181 // Adjust the SP for previous frame
182 add x29, sp, 0
183 CFI_DEF_CFA_REGISTER (29)
184
185 // Save env and savesigs parameter
186 stp x0, x1, [sp, 16]
187 CFI_OFFSET (0, -16)
188 CFI_OFFSET (1, -8)
189
190 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
191 add x0, x29, 32
192
193 // call tsan interceptor
194 bl ASM_SYMBOL(__tsan_setjmp)
195
196 // Restore env and savesigs parameter
197 ldp x0, x1, [sp, 16]
198 CFI_RESTORE (0)
199 CFI_RESTORE (1)
200
201 // Restore frame/link register
202 ldp x29, x30, [sp], 32
203 CFI_RESTORE (29)
204 CFI_RESTORE (30)
205 CFI_DEF_CFA (31, 0)
206
207 // tail jump to libc __sigsetjmp
208#if !defined(__APPLE__)
209 adrp x2, :got:_ZN14__interception16real___sigsetjmpE
210 ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE]
211 ldr x2, [x2]
212#else
213 adrp x2, ASM_SYMBOL(__sigsetjmp)@page
214 add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff
215#endif
216 br x2
217 CFI_ENDPROC
218ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
219#endif
220
221NO_EXEC_STACK_DIRECTIVE
222
223GNU_PROPERTY_BTI_PAC_GCS
224
225#endif