master
1/*
2 * Copyright (c) 2004-2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * @OSF_COPYRIGHT@
30 */
31#ifndef _MACH_ARM__STRUCTS_H_
32#define _MACH_ARM__STRUCTS_H_
33
34#if defined (__arm__) || defined (__arm64__)
35
36#include <sys/cdefs.h> /* __DARWIN_UNIX03 */
37#include <machine/types.h> /* __uint32_t */
38
39#if __DARWIN_UNIX03
40#define _STRUCT_ARM_EXCEPTION_STATE struct __darwin_arm_exception_state
41_STRUCT_ARM_EXCEPTION_STATE
42{
43 __uint32_t __exception; /* number of arm exception taken */
44 __uint32_t __fsr; /* Fault status */
45 __uint32_t __far; /* Virtual Fault Address */
46};
47#else /* !__DARWIN_UNIX03 */
48#define _STRUCT_ARM_EXCEPTION_STATE struct arm_exception_state
49_STRUCT_ARM_EXCEPTION_STATE
50{
51 __uint32_t exception; /* number of arm exception taken */
52 __uint32_t fsr; /* Fault status */
53 __uint32_t far; /* Virtual Fault Address */
54};
55#endif /* __DARWIN_UNIX03 */
56
57#if __DARWIN_UNIX03
58#define _STRUCT_ARM_EXCEPTION_STATE64 struct __darwin_arm_exception_state64
59_STRUCT_ARM_EXCEPTION_STATE64
60{
61 __uint64_t __far; /* Virtual Fault Address */
62 __uint32_t __esr; /* Exception syndrome */
63 __uint32_t __exception; /* number of arm exception taken */
64};
65#define _STRUCT_ARM_EXCEPTION_STATE64_V2 struct __darwin_arm_exception_state64_v2
66_STRUCT_ARM_EXCEPTION_STATE64_V2
67{
68 __uint64_t __far; /* Virtual Fault Address */
69 __uint64_t __esr; /* Exception syndrome */
70};
71#else /* !__DARWIN_UNIX03 */
72#define _STRUCT_ARM_EXCEPTION_STATE64 struct arm_exception_state64
73_STRUCT_ARM_EXCEPTION_STATE64
74{
75 __uint64_t far; /* Virtual Fault Address */
76 __uint32_t esr; /* Exception syndrome */
77 __uint32_t exception; /* number of arm exception taken */
78};
79#define _STRUCT_ARM_EXCEPTION_STATE64_V2 struct arm_exception_state64_v2
80_STRUCT_ARM_EXCEPTION_STATE64_V2
81{
82 __uint64_t far; /* Virtual Fault Address */
83 __uint64_t esr; /* Exception syndrome */
84};
85#endif /* __DARWIN_UNIX03 */
86
87#if __DARWIN_UNIX03
88#define _STRUCT_ARM_THREAD_STATE struct __darwin_arm_thread_state
89_STRUCT_ARM_THREAD_STATE
90{
91 __uint32_t __r[13]; /* General purpose register r0-r12 */
92 __uint32_t __sp; /* Stack pointer r13 */
93 __uint32_t __lr; /* Link register r14 */
94 __uint32_t __pc; /* Program counter r15 */
95 __uint32_t __cpsr; /* Current program status register */
96};
97#else /* !__DARWIN_UNIX03 */
98#define _STRUCT_ARM_THREAD_STATE struct arm_thread_state
99_STRUCT_ARM_THREAD_STATE
100{
101 __uint32_t r[13]; /* General purpose register r0-r12 */
102 __uint32_t sp; /* Stack pointer r13 */
103 __uint32_t lr; /* Link register r14 */
104 __uint32_t pc; /* Program counter r15 */
105 __uint32_t cpsr; /* Current program status register */
106};
107#endif /* __DARWIN_UNIX03 */
108
109
110/*
111 * By default, the pointer fields in the arm_thread_state64_t structure are
112 * opaque on the arm64e architecture and require the use of accessor macros.
113 * This mode can also be enabled on the arm64 architecture by building with
114 * -D__DARWIN_OPAQUE_ARM_THREAD_STATE64=1.
115 */
116#if defined(__arm64__) && defined(__LP64__)
117
118#if __has_feature(ptrauth_calls)
119#define __DARWIN_OPAQUE_ARM_THREAD_STATE64 1
120#define __DARWIN_PTRAUTH_ARM_THREAD_STATE64 1
121#endif /* __has_feature(ptrauth_calls) */
122
123#ifndef __DARWIN_OPAQUE_ARM_THREAD_STATE64
124#define __DARWIN_OPAQUE_ARM_THREAD_STATE64 0
125#endif
126
127#else /* defined(__arm64__) && defined(__LP64__) */
128
129#undef __DARWIN_OPAQUE_ARM_THREAD_STATE64
130#define __DARWIN_OPAQUE_ARM_THREAD_STATE64 0
131
132#endif /* defined(__arm64__) && defined(__LP64__) */
133
134#if __DARWIN_UNIX03
135#define _STRUCT_ARM_THREAD_STATE64 struct __darwin_arm_thread_state64
136#if __DARWIN_OPAQUE_ARM_THREAD_STATE64
137_STRUCT_ARM_THREAD_STATE64
138{
139 __uint64_t __x[29]; /* General purpose registers x0-x28 */
140 void* __opaque_fp; /* Frame pointer x29 */
141 void* __opaque_lr; /* Link register x30 */
142 void* __opaque_sp; /* Stack pointer x31 */
143 void* __opaque_pc; /* Program counter */
144 __uint32_t __cpsr; /* Current program status register */
145 __uint32_t __opaque_flags; /* Flags describing structure format */
146};
147#else /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
148_STRUCT_ARM_THREAD_STATE64
149{
150 __uint64_t __x[29]; /* General purpose registers x0-x28 */
151 __uint64_t __fp; /* Frame pointer x29 */
152 __uint64_t __lr; /* Link register x30 */
153 __uint64_t __sp; /* Stack pointer x31 */
154 __uint64_t __pc; /* Program counter */
155 __uint32_t __cpsr; /* Current program status register */
156 __uint32_t __pad; /* Same size for 32-bit or 64-bit clients */
157};
158#endif /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
159#else /* !__DARWIN_UNIX03 */
160#define _STRUCT_ARM_THREAD_STATE64 struct arm_thread_state64
161#if __DARWIN_OPAQUE_ARM_THREAD_STATE64
162_STRUCT_ARM_THREAD_STATE64
163{
164 __uint64_t x[29]; /* General purpose registers x0-x28 */
165 void* __opaque_fp; /* Frame pointer x29 */
166 void* __opaque_lr; /* Link register x30 */
167 void* __opaque_sp; /* Stack pointer x31 */
168 void* __opaque_pc; /* Program counter */
169 __uint32_t cpsr; /* Current program status register */
170 __uint32_t __opaque_flags; /* Flags describing structure format */
171};
172#else /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
173_STRUCT_ARM_THREAD_STATE64
174{
175 __uint64_t x[29]; /* General purpose registers x0-x28 */
176 __uint64_t fp; /* Frame pointer x29 */
177 __uint64_t lr; /* Link register x30 */
178 __uint64_t sp; /* Stack pointer x31 */
179 __uint64_t pc; /* Program counter */
180 __uint32_t cpsr; /* Current program status register */
181 __uint32_t __pad; /* Same size for 32-bit or 64-bit clients */
182};
183#endif /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
184#endif /* __DARWIN_UNIX03 */
185
186#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL && defined(__arm64__)
187
188/* Accessor macros for arm_thread_state64_t pointer fields */
189
190#if __has_feature(ptrauth_calls) && defined(__LP64__)
191#include <ptrauth.h>
192
193#if !__DARWIN_OPAQUE_ARM_THREAD_STATE64 || !__DARWIN_PTRAUTH_ARM_THREAD_STATE64
194#error "Invalid configuration"
195#endif
196
197#define __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH 0x1
198#define __DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR 0x2
199#define __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC 0x4
200#define __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR 0x8
201
202#define __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK 0xff000000
203
204/* Return pc field of arm_thread_state64_t as a data pointer value */
205#define __darwin_arm_thread_state64_get_pc(ts) \
206 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
207 (uintptr_t)(__tsp->__opaque_pc && !(__tsp->__opaque_flags & \
208 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
209 ptrauth_auth_data(__tsp->__opaque_pc, \
210 ptrauth_key_process_independent_code, \
211 ((__tsp->__opaque_flags & \
212 __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC) == 0 && \
213 (__tsp->__opaque_flags & \
214 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK)) ? \
215 ptrauth_blend_discriminator((void *)(unsigned long) \
216 (__tsp->__opaque_flags & \
217 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
218 ptrauth_string_discriminator("pc")) : \
219 ptrauth_string_discriminator("pc")) : __tsp->__opaque_pc); })
220/* Return pc field of arm_thread_state64_t as a function pointer. May return
221 * NULL if a valid function pointer cannot be constructed, the caller should
222 * fall back to the __darwin_arm_thread_state64_get_pc() macro in that case. */
223#define __darwin_arm_thread_state64_get_pc_fptr(ts) \
224 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
225 (__tsp->__opaque_pc && !(__tsp->__opaque_flags & \
226 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
227 ptrauth_auth_function(__tsp->__opaque_pc, \
228 ptrauth_key_process_independent_code, \
229 ((__tsp->__opaque_flags & \
230 __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC) == 0 && \
231 (__tsp->__opaque_flags & \
232 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK)) ? \
233 ptrauth_blend_discriminator((void *)(unsigned long) \
234 (__tsp->__opaque_flags & \
235 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
236 ptrauth_string_discriminator("pc")) : \
237 ptrauth_string_discriminator("pc")) : NULL); })
238/* Set pc field of arm_thread_state64_t to a function pointer */
239#define __darwin_arm_thread_state64_set_pc_fptr(ts, fptr) \
240 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
241 __typeof__(fptr) __f = (fptr); __tsp->__opaque_pc = \
242 (__f ? (!(__tsp->__opaque_flags & \
243 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
244 ptrauth_auth_and_resign(__f, ptrauth_key_function_pointer, 0, \
245 ptrauth_key_process_independent_code, \
246 (__tsp->__opaque_flags & \
247 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK) ? \
248 ptrauth_blend_discriminator((void *)(unsigned long) \
249 (__tsp->__opaque_flags & \
250 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
251 ptrauth_string_discriminator("pc")) : \
252 ptrauth_string_discriminator("pc")) : ptrauth_auth_data(__f, \
253 ptrauth_key_function_pointer, 0)) : __f); \
254 __tsp->__opaque_flags &= \
255 ~__DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC; })
256/* Set pc field of arm_thread_state64_t to an already signed function pointer */
257#define __darwin_arm_thread_state64_set_pc_presigned_fptr(ts, presigned_fptr) \
258 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
259 __typeof__(presigned_fptr) __f = (presigned_fptr); __tsp->__opaque_pc = __f; \
260 __tsp->__opaque_flags &= \
261 ~__DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC; })
262/* Return lr field of arm_thread_state64_t as a data pointer value */
263#define __darwin_arm_thread_state64_get_lr(ts) \
264 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
265 (uintptr_t)(__tsp->__opaque_lr && !(__tsp->__opaque_flags & ( \
266 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH | \
267 __DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR)) ? \
268 ptrauth_auth_data(__tsp->__opaque_lr, \
269 ptrauth_key_process_independent_code, \
270 ((__tsp->__opaque_flags & \
271 __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR) == 0 && \
272 (__tsp->__opaque_flags & \
273 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK)) ? \
274 ptrauth_blend_discriminator((void *)(unsigned long) \
275 (__tsp->__opaque_flags & \
276 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
277 ptrauth_string_discriminator("lr")) : \
278 ptrauth_string_discriminator("lr")) : __tsp->__opaque_lr); })
279/* Return lr field of arm_thread_state64_t as a function pointer. May return
280 * NULL if a valid function pointer cannot be constructed, the caller should
281 * fall back to the __darwin_arm_thread_state64_get_lr() macro in that case. */
282#define __darwin_arm_thread_state64_get_lr_fptr(ts) \
283 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
284 (__tsp->__opaque_lr && !(__tsp->__opaque_flags & ( \
285 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH | \
286 __DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR)) ? \
287 ptrauth_auth_function(__tsp->__opaque_lr, \
288 ptrauth_key_process_independent_code, \
289 ((__tsp->__opaque_flags & \
290 __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR) == 0 && \
291 (__tsp->__opaque_flags & \
292 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK)) ? \
293 ptrauth_blend_discriminator((void *)(unsigned long) \
294 (__tsp->__opaque_flags & \
295 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
296 ptrauth_string_discriminator("lr")) : \
297 ptrauth_string_discriminator("lr")) : NULL); })
298/* Set lr field of arm_thread_state64_t to a function pointer */
299#define __darwin_arm_thread_state64_set_lr_fptr(ts, fptr) \
300 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
301 __typeof__(fptr) __f = (fptr); __tsp->__opaque_lr = \
302 (__f ? (!(__tsp->__opaque_flags & \
303 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? (__tsp->__opaque_flags \
304 &= ~__DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR , \
305 ptrauth_auth_and_resign(__f, ptrauth_key_function_pointer, 0, \
306 ptrauth_key_process_independent_code, \
307 (__tsp->__opaque_flags & \
308 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK) ? \
309 ptrauth_blend_discriminator((void *)(unsigned long) \
310 (__tsp->__opaque_flags & \
311 __DARWIN_ARM_THREAD_STATE64_USER_DIVERSIFIER_MASK), \
312 ptrauth_string_discriminator("lr")) : \
313 ptrauth_string_discriminator("lr"))) : ptrauth_auth_data(__f, \
314 ptrauth_key_function_pointer, 0)) : __f); __tsp->__opaque_flags &= \
315 ~__DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR; })
316/* Set lr field of arm_thread_state64_t to an already signed function pointer */
317#define __darwin_arm_thread_state64_set_lr_presigned_fptr(ts, presigned_fptr) \
318 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
319 __typeof__(presigned_fptr) __f = (presigned_fptr); __tsp->__opaque_lr = __f; \
320 __tsp->__opaque_flags &= \
321 ~__DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR & ~__DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR; })
322/* Return sp field of arm_thread_state64_t as a data pointer value */
323#define __darwin_arm_thread_state64_get_sp(ts) \
324 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
325 (uintptr_t)(__tsp->__opaque_sp && !(__tsp->__opaque_flags & \
326 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
327 ptrauth_auth_data(__tsp->__opaque_sp, \
328 ptrauth_key_process_independent_data, \
329 ptrauth_string_discriminator("sp")) : __tsp->__opaque_sp); })
330/* Set sp field of arm_thread_state64_t to a data pointer value */
331#define __darwin_arm_thread_state64_set_sp(ts, ptr) \
332 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
333 void *__p = (void*)(uintptr_t)(ptr); __tsp->__opaque_sp = \
334 (__p && !(__tsp->__opaque_flags & \
335 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
336 ptrauth_sign_unauthenticated(__p, \
337 ptrauth_key_process_independent_data, \
338 ptrauth_string_discriminator("sp")) : __p); })
339/* Return fp field of arm_thread_state64_t as a data pointer value */
340#define __darwin_arm_thread_state64_get_fp(ts) \
341 __extension__ ({ const _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
342 (uintptr_t)(__tsp->__opaque_fp && !(__tsp->__opaque_flags & \
343 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
344 ptrauth_auth_data(__tsp->__opaque_fp, \
345 ptrauth_key_process_independent_data, \
346 ptrauth_string_discriminator("fp")) : __tsp->__opaque_fp); })
347/* Set fp field of arm_thread_state64_t to a data pointer value */
348#define __darwin_arm_thread_state64_set_fp(ts, ptr) \
349 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
350 void *__p = (void*)(uintptr_t)(ptr); __tsp->__opaque_fp = \
351 (__p && !(__tsp->__opaque_flags & \
352 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? \
353 ptrauth_sign_unauthenticated(__p, \
354 ptrauth_key_process_independent_data, \
355 ptrauth_string_discriminator("fp")) : __p); })
356
357/* Strip ptr auth bits from pc, lr, sp and fp field of arm_thread_state64_t */
358#define __darwin_arm_thread_state64_ptrauth_strip(ts) \
359 __extension__ ({ _STRUCT_ARM_THREAD_STATE64 *__tsp = &(ts); \
360 __tsp->__opaque_pc = ((__tsp->__opaque_flags & \
361 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? __tsp->__opaque_pc : \
362 ptrauth_strip(__tsp->__opaque_pc, ptrauth_key_process_independent_code)); \
363 __tsp->__opaque_lr = ((__tsp->__opaque_flags & \
364 (__DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH | \
365 __DARWIN_ARM_THREAD_STATE64_FLAGS_IB_SIGNED_LR)) ? __tsp->__opaque_lr : \
366 ptrauth_strip(__tsp->__opaque_lr, ptrauth_key_process_independent_code)); \
367 __tsp->__opaque_sp = ((__tsp->__opaque_flags & \
368 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? __tsp->__opaque_sp : \
369 ptrauth_strip(__tsp->__opaque_sp, ptrauth_key_process_independent_data)); \
370 __tsp->__opaque_fp = ((__tsp->__opaque_flags & \
371 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH) ? __tsp->__opaque_fp : \
372 ptrauth_strip(__tsp->__opaque_fp, ptrauth_key_process_independent_data)); \
373 __tsp->__opaque_flags |= \
374 __DARWIN_ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH; __tsp->__opaque_flags &= \
375 ~(__DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_PC | \
376 __DARWIN_ARM_THREAD_STATE64_FLAGS_KERNEL_SIGNED_LR); })
377
378#else /* __has_feature(ptrauth_calls) && defined(__LP64__) */
379
380#if __DARWIN_OPAQUE_ARM_THREAD_STATE64
381
382#ifndef __LP64__
383#error "Invalid configuration"
384#endif
385
386/* Return pc field of arm_thread_state64_t as a data pointer value */
387#define __darwin_arm_thread_state64_get_pc(ts) \
388 ((uintptr_t)((ts).__opaque_pc))
389/* Return pc field of arm_thread_state64_t as a function pointer */
390#define __darwin_arm_thread_state64_get_pc_fptr(ts) \
391 ((ts).__opaque_pc)
392/* Set pc field of arm_thread_state64_t to a function pointer */
393#define __darwin_arm_thread_state64_set_pc_fptr(ts, fptr) \
394 ((ts).__opaque_pc = (fptr))
395/* Set pc field of arm_thread_state64_t to an already signed function pointer */
396#define __darwin_arm_thread_state64_set_pc_presigned_fptr(ts, presigned_fptr) \
397 ((ts).__opaque_pc = (presigned_fptr))
398/* Return lr field of arm_thread_state64_t as a data pointer value */
399#define __darwin_arm_thread_state64_get_lr(ts) \
400 ((uintptr_t)((ts).__opaque_lr))
401/* Return lr field of arm_thread_state64_t as a function pointer */
402#define __darwin_arm_thread_state64_get_lr_fptr(ts) \
403 ((ts).__opaque_lr)
404/* Set lr field of arm_thread_state64_t to a function pointer */
405#define __darwin_arm_thread_state64_set_lr_fptr(ts, fptr) \
406 ((ts).__opaque_lr = (fptr))
407/* Set lr field of arm_thread_state64_t to a presigned function pointer */
408#define __darwin_arm_thread_state64_set_lr_presigned_fptr(ts, presigned_fptr) \
409 ((ts).__opaque_lr = (presigned_fptr))
410/* Return sp field of arm_thread_state64_t as a data pointer value */
411#define __darwin_arm_thread_state64_get_sp(ts) \
412 ((uintptr_t)((ts).__opaque_sp))
413/* Set sp field of arm_thread_state64_t to a data pointer value */
414#define __darwin_arm_thread_state64_set_sp(ts, ptr) \
415 ((ts).__opaque_sp = (void*)(uintptr_t)(ptr))
416/* Return fp field of arm_thread_state64_t as a data pointer value */
417#define __darwin_arm_thread_state64_get_fp(ts) \
418 ((uintptr_t)((ts).__opaque_fp))
419/* Set fp field of arm_thread_state64_t to a data pointer value */
420#define __darwin_arm_thread_state64_set_fp(ts, ptr) \
421 ((ts).__opaque_fp = (void*)(uintptr_t)(ptr))
422/* Strip ptr auth bits from pc, lr, sp and fp field of arm_thread_state64_t */
423#define __darwin_arm_thread_state64_ptrauth_strip(ts) \
424 (void)(ts)
425
426#else /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
427#if __DARWIN_UNIX03
428
429/* Return pc field of arm_thread_state64_t as a data pointer value */
430#define __darwin_arm_thread_state64_get_pc(ts) \
431 ((ts).__pc)
432/* Return pc field of arm_thread_state64_t as a function pointer */
433#define __darwin_arm_thread_state64_get_pc_fptr(ts) \
434 ((void*)(uintptr_t)((ts).__pc))
435/* Set pc field of arm_thread_state64_t to a function pointer */
436#define __darwin_arm_thread_state64_set_pc_fptr(ts, fptr) \
437 ((ts).__pc = (uintptr_t)(fptr))
438/* Set pc field of arm_thread_state64_t to an already signed function pointer */
439#define __darwin_arm_thread_state64_set_pc_presigned_fptr(ts, presigned_fptr) \
440 ((ts).__pc = (uintptr_t)(presigned_fptr))
441/* Return lr field of arm_thread_state64_t as a data pointer value */
442#define __darwin_arm_thread_state64_get_lr(ts) \
443 ((ts).__lr)
444/* Return lr field of arm_thread_state64_t as a function pointer */
445#define __darwin_arm_thread_state64_get_lr_fptr(ts) \
446 ((void*)(uintptr_t)((ts).__lr))
447/* Set lr field of arm_thread_state64_t to a function pointer */
448#define __darwin_arm_thread_state64_set_lr_fptr(ts, fptr) \
449 ((ts).__lr = (uintptr_t)(fptr))
450/* Set lr field of arm_thread_state64_t to a presigned function pointer */
451#define __darwin_arm_thread_state64_set_lr_presigned_fptr(ts, presigned_fptr) \
452 ((ts).__lr = ((uintptr_t)presigned_fptr))
453/* Return sp field of arm_thread_state64_t as a data pointer value */
454#define __darwin_arm_thread_state64_get_sp(ts) \
455 ((ts).__sp)
456/* Set sp field of arm_thread_state64_t to a data pointer value */
457#define __darwin_arm_thread_state64_set_sp(ts, ptr) \
458 ((ts).__sp = (uintptr_t)(ptr))
459/* Return fp field of arm_thread_state64_t as a data pointer value */
460#define __darwin_arm_thread_state64_get_fp(ts) \
461 ((ts).__fp)
462/* Set fp field of arm_thread_state64_t to a data pointer value */
463#define __darwin_arm_thread_state64_set_fp(ts, ptr) \
464 ((ts).__fp = (uintptr_t)(ptr))
465/* Strip ptr auth bits from pc, lr, sp and fp field of arm_thread_state64_t */
466#define __darwin_arm_thread_state64_ptrauth_strip(ts) \
467 (void)(ts)
468
469#else /* __DARWIN_UNIX03 */
470
471/* Return pc field of arm_thread_state64_t as a data pointer value */
472#define __darwin_arm_thread_state64_get_pc(ts) \
473 ((ts).pc)
474/* Return pc field of arm_thread_state64_t as a function pointer */
475#define __darwin_arm_thread_state64_get_pc_fptr(ts) \
476 ((void*)(uintptr_t)((ts).pc))
477/* Set pc field of arm_thread_state64_t to a function pointer */
478#define __darwin_arm_thread_state64_set_pc_fptr(ts, fptr) \
479 ((ts).pc = (uintptr_t)(fptr))
480/* Set pc field of arm_thread_state64_t to an already signed function pointer */
481#define __darwin_arm_thread_state64_set_pc_presigned_fptr(ts, presigned_fptr) \
482 ((ts).pc = (uintptr_t)(presigned_fptr))
483/* Return lr field of arm_thread_state64_t as a data pointer value */
484#define __darwin_arm_thread_state64_get_lr(ts) \
485 ((ts).lr)
486/* Return lr field of arm_thread_state64_t as a function pointer */
487#define __darwin_arm_thread_state64_get_lr_fptr(ts) \
488 ((void*)(uintptr_t)((ts).lr))
489/* Set lr field of arm_thread_state64_t to a function pointer */
490#define __darwin_arm_thread_state64_set_lr_fptr(ts, fptr) \
491 ((ts).lr = (uintptr_t)(fptr))
492/* Set lr field of arm_thread_state64_t to a presigned function pointer */
493#define __darwin_arm_thread_state64_set_lr_presigned_fptr(ts, presigned_fptr) \
494 ((ts).lr = ((uintptr_t)presigned_fptr))
495/* Return sp field of arm_thread_state64_t as a data pointer value */
496#define __darwin_arm_thread_state64_get_sp(ts) \
497 ((ts).sp)
498/* Set sp field of arm_thread_state64_t to a data pointer value */
499#define __darwin_arm_thread_state64_set_sp(ts, ptr) \
500 ((ts).sp = (uintptr_t)(ptr))
501/* Return fp field of arm_thread_state64_t as a data pointer value */
502#define __darwin_arm_thread_state64_get_fp(ts) \
503 ((ts).fp)
504/* Set fp field of arm_thread_state64_t to a data pointer value */
505#define __darwin_arm_thread_state64_set_fp(ts, ptr) \
506 ((ts).fp = (uintptr_t)(ptr))
507/* Strip ptr auth bits from pc, lr, sp and fp field of arm_thread_state64_t */
508#define __darwin_arm_thread_state64_ptrauth_strip(ts) \
509 (void)(ts)
510
511#endif /* __DARWIN_UNIX03 */
512#endif /* __DARWIN_OPAQUE_ARM_THREAD_STATE64 */
513
514#endif /* __has_feature(ptrauth_calls) && defined(__LP64__) */
515#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL && defined(__arm64__) */
516
517#if __DARWIN_UNIX03
518#define _STRUCT_ARM_VFP_STATE struct __darwin_arm_vfp_state
519_STRUCT_ARM_VFP_STATE
520{
521 __uint32_t __r[64];
522 __uint32_t __fpscr;
523};
524#else /* !__DARWIN_UNIX03 */
525#define _STRUCT_ARM_VFP_STATE struct arm_vfp_state
526_STRUCT_ARM_VFP_STATE
527{
528 __uint32_t r[64];
529 __uint32_t fpscr;
530};
531#endif /* __DARWIN_UNIX03 */
532
533#if __DARWIN_UNIX03
534#define _STRUCT_ARM_NEON_STATE64 struct __darwin_arm_neon_state64
535#define _STRUCT_ARM_NEON_STATE struct __darwin_arm_neon_state
536
537#if defined(__arm64__)
538_STRUCT_ARM_NEON_STATE64
539{
540 __uint128_t __v[32];
541 __uint32_t __fpsr;
542 __uint32_t __fpcr;
543};
544
545_STRUCT_ARM_NEON_STATE
546{
547 __uint128_t __v[16];
548 __uint32_t __fpsr;
549 __uint32_t __fpcr;
550};
551#elif defined(__arm__)
552/*
553 * No 128-bit intrinsic for ARM; leave it opaque for now.
554 */
555_STRUCT_ARM_NEON_STATE64
556{
557 char opaque[(32 * 16) + (2 * sizeof(__uint32_t))];
558} __attribute__((aligned(16)));
559
560_STRUCT_ARM_NEON_STATE
561{
562 char opaque[(16 * 16) + (2 * sizeof(__uint32_t))];
563} __attribute__((aligned(16)));
564
565#else
566#error Unknown architecture.
567#endif
568
569#else /* !__DARWIN_UNIX03 */
570#define _STRUCT_ARM_NEON_STATE64 struct arm_neon_state64
571#define _STRUCT_ARM_NEON_STATE struct arm_neon_state
572
573#if defined(__arm64__)
574_STRUCT_ARM_NEON_STATE64
575{
576 __uint128_t q[32];
577 uint32_t fpsr;
578 uint32_t fpcr;
579};
580
581_STRUCT_ARM_NEON_STATE
582{
583 __uint128_t q[16];
584 uint32_t fpsr;
585 uint32_t fpcr;
586};
587#elif defined(__arm__)
588/*
589 * No 128-bit intrinsic for ARM; leave it opaque for now.
590 */
591_STRUCT_ARM_NEON_STATE64
592{
593 char opaque[(32 * 16) + (2 * sizeof(__uint32_t))];
594} __attribute__((aligned(16)));
595
596_STRUCT_ARM_NEON_STATE
597{
598 char opaque[(16 * 16) + (2 * sizeof(__uint32_t))];
599} __attribute__((aligned(16)));
600
601#else
602#error Unknown architecture.
603#endif
604
605#endif /* __DARWIN_UNIX03 */
606
607
608#define _STRUCT_ARM_PAGEIN_STATE struct __arm_pagein_state
609_STRUCT_ARM_PAGEIN_STATE
610{
611 int __pagein_error;
612};
613
614#if __DARWIN_UNIX03
615#define _STRUCT_ARM_SME_STATE struct __darwin_arm_sme_state
616_STRUCT_ARM_SME_STATE
617{
618 __uint64_t __svcr;
619 __uint64_t __tpidr2_el0;
620 __uint16_t __svl_b;
621};
622
623#define _STRUCT_ARM_SVE_Z_STATE struct __darwin_arm_sve_z_state
624_STRUCT_ARM_SVE_Z_STATE
625{
626 char __z[16][256];
627} __attribute__((aligned(4)));
628
629#define _STRUCT_ARM_SVE_P_STATE struct __darwin_arm_sve_p_state
630_STRUCT_ARM_SVE_P_STATE
631{
632 char __p[16][256 / 8];
633} __attribute__((aligned(4)));
634
635#define _STRUCT_ARM_SME_ZA_STATE struct __darwin_arm_sme_za_state
636_STRUCT_ARM_SME_ZA_STATE
637{
638 char __za[4096];
639} __attribute__((aligned(4)));
640
641#define _STRUCT_ARM_SME2_STATE struct __darwin_arm_sme2_state
642_STRUCT_ARM_SME2_STATE
643{
644 char __zt0[64];
645} __attribute__((aligned(4)));
646#else /* !__DARWIN_UNIX03 */
647#define _STRUCT_ARM_SME_STATE struct arm_sme_state
648_STRUCT_ARM_SME_STATE
649{
650 __uint64_t svcr;
651 __uint64_t tpidr2_el0;
652 __uint16_t svl_b;
653};
654
655#define _STRUCT_ARM_SVE_Z_STATE struct arm_sve_z_state
656_STRUCT_ARM_SVE_Z_STATE
657{
658 char z[16][256];
659} __attribute__((aligned(4)));
660
661#define _STRUCT_ARM_SVE_P_STATE struct arm_sve_p_state
662_STRUCT_ARM_SVE_P_STATE
663{
664 char p[16][256 / 8];
665} __attribute__((aligned(4)));
666
667#define _STRUCT_ARM_SME_ZA_STATE struct arm_sme_za_state
668_STRUCT_ARM_SME_ZA_STATE
669{
670 char za[4096];
671} __attribute__((aligned(4)));
672
673#define _STRUCT_ARM_SME2_STATE struct arm_sme2_state
674_STRUCT_ARM_SME2_STATE
675{
676 char zt0[64];
677} __attribute__((aligned(4)));
678#endif /* __DARWIN_UNIX03 */
679
680/*
681 * Debug State
682 */
683#if defined(__arm__)
684/* Old-fashioned debug state is only for ARM */
685
686#if __DARWIN_UNIX03
687#define _STRUCT_ARM_DEBUG_STATE struct __darwin_arm_debug_state
688_STRUCT_ARM_DEBUG_STATE
689{
690 __uint32_t __bvr[16];
691 __uint32_t __bcr[16];
692 __uint32_t __wvr[16];
693 __uint32_t __wcr[16];
694};
695#else /* !__DARWIN_UNIX03 */
696#define _STRUCT_ARM_DEBUG_STATE struct arm_debug_state
697_STRUCT_ARM_DEBUG_STATE
698{
699 __uint32_t bvr[16];
700 __uint32_t bcr[16];
701 __uint32_t wvr[16];
702 __uint32_t wcr[16];
703};
704#endif /* __DARWIN_UNIX03 */
705
706#elif defined(__arm64__)
707
708/* ARM's arm_debug_state is ARM64's arm_legacy_debug_state */
709
710#if __DARWIN_UNIX03
711#define _STRUCT_ARM_LEGACY_DEBUG_STATE struct __arm_legacy_debug_state
712_STRUCT_ARM_LEGACY_DEBUG_STATE
713{
714 __uint32_t __bvr[16];
715 __uint32_t __bcr[16];
716 __uint32_t __wvr[16];
717 __uint32_t __wcr[16];
718};
719#else /* __DARWIN_UNIX03 */
720#define _STRUCT_ARM_LEGACY_DEBUG_STATE struct arm_legacy_debug_state
721_STRUCT_ARM_LEGACY_DEBUG_STATE
722{
723 __uint32_t bvr[16];
724 __uint32_t bcr[16];
725 __uint32_t wvr[16];
726 __uint32_t wcr[16];
727};
728#endif /* __DARWIN_UNIX03 */
729#else
730#error unknown architecture
731#endif
732
733#if __DARWIN_UNIX03
734#define _STRUCT_ARM_DEBUG_STATE32 struct __darwin_arm_debug_state32
735_STRUCT_ARM_DEBUG_STATE32
736{
737 __uint32_t __bvr[16];
738 __uint32_t __bcr[16];
739 __uint32_t __wvr[16];
740 __uint32_t __wcr[16];
741 __uint64_t __mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */
742};
743
744#define _STRUCT_ARM_DEBUG_STATE64 struct __darwin_arm_debug_state64
745_STRUCT_ARM_DEBUG_STATE64
746{
747 __uint64_t __bvr[16];
748 __uint64_t __bcr[16];
749 __uint64_t __wvr[16];
750 __uint64_t __wcr[16];
751 __uint64_t __mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */
752};
753#else /* !__DARWIN_UNIX03 */
754#define _STRUCT_ARM_DEBUG_STATE32 struct arm_debug_state32
755_STRUCT_ARM_DEBUG_STATE32
756{
757 __uint32_t bvr[16];
758 __uint32_t bcr[16];
759 __uint32_t wvr[16];
760 __uint32_t wcr[16];
761 __uint64_t mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */
762};
763
764#define _STRUCT_ARM_DEBUG_STATE64 struct arm_debug_state64
765_STRUCT_ARM_DEBUG_STATE64
766{
767 __uint64_t bvr[16];
768 __uint64_t bcr[16];
769 __uint64_t wvr[16];
770 __uint64_t wcr[16];
771 __uint64_t mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */
772};
773#endif /* __DARWIN_UNIX03 */
774
775#if __DARWIN_UNIX03
776#define _STRUCT_ARM_CPMU_STATE64 struct __darwin_arm_cpmu_state64
777_STRUCT_ARM_CPMU_STATE64
778{
779 __uint64_t __ctrs[16];
780};
781#else /* __DARWIN_UNIX03 */
782#define _STRUCT_ARM_CPMU_STATE64 struct arm_cpmu_state64
783_STRUCT_ARM_CPMU_STATE64
784{
785 __uint64_t ctrs[16];
786};
787#endif /* !__DARWIN_UNIX03 */
788
789#endif /* defined (__arm__) || defined (__arm64__) */
790
791#endif /* _MACH_ARM__STRUCTS_H_ */