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