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