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