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
13ASM_HIDDEN(__tsan_setjmp)
14.comm _ZN14__interception11real_setjmpE,8,8
15.globl ASM_SYMBOL_INTERCEPTOR(setjmp)
16ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
17ASM_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
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
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
112ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
113
114.comm _ZN14__interception14real_sigsetjmpE,8,8
115.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
116ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
117ASM_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
163ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
164
165#if !defined(__APPLE__)
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
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
215ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
216#endif
217
218NO_EXEC_STACK_DIRECTIVE
219
220#endif
221