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