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