1/* 2 * Copyright (c) 2004-2007 Apple Inc. All rights reserved. 3 */ 4/* 5 * @OSF_COPYRIGHT@ 6 */ 7#ifndef _MACH_ARM__STRUCTS_H_ 8#define _MACH_ARM__STRUCTS_H_ 9 10#if __DARWIN_UNIX03 11#define _STRUCT_ARM_EXCEPTION_STATE struct __darwin_arm_exception_state 12_STRUCT_ARM_EXCEPTION_STATE 13{ 14 __uint32_t __exception; /* number of arm exception taken */ 15 __uint32_t __fsr; /* Fault status */ 16 __uint32_t __far; /* Virtual Fault Address */ 17}; 18#else /* !__DARWIN_UNIX03 */ 19#define _STRUCT_ARM_EXCEPTION_STATE struct arm_exception_state 20_STRUCT_ARM_EXCEPTION_STATE 21{ 22 __uint32_t exception; /* number of arm exception taken */ 23 __uint32_t fsr; /* Fault status */ 24 __uint32_t far; /* Virtual Fault Address */ 25}; 26#endif /* __DARWIN_UNIX03 */ 27 28#if __DARWIN_UNIX03 29#define _STRUCT_ARM_EXCEPTION_STATE64 struct __darwin_arm_exception_state64 30_STRUCT_ARM_EXCEPTION_STATE64 31{ 32 __uint64_t __far; /* Virtual Fault Address */ 33 __uint32_t __esr; /* Exception syndrome */ 34 __uint32_t __exception; /* number of arm exception taken */ 35}; 36#else /* !__DARWIN_UNIX03 */ 37#define _STRUCT_ARM_EXCEPTION_STATE64 struct arm_exception_state64 38_STRUCT_ARM_EXCEPTION_STATE64 39{ 40 __uint64_t far; /* Virtual Fault Address */ 41 __uint32_t esr; /* Exception syndrome */ 42 __uint32_t exception; /* number of arm exception taken */ 43}; 44#endif /* __DARWIN_UNIX03 */ 45 46#if __DARWIN_UNIX03 47#define _STRUCT_ARM_THREAD_STATE struct __darwin_arm_thread_state 48_STRUCT_ARM_THREAD_STATE 49{ 50 __uint32_t __r[13]; /* General purpose register r0-r12 */ 51 __uint32_t __sp; /* Stack pointer r13 */ 52 __uint32_t __lr; /* Link register r14 */ 53 __uint32_t __pc; /* Program counter r15 */ 54 __uint32_t __cpsr; /* Current program status register */ 55}; 56#else /* !__DARWIN_UNIX03 */ 57#define _STRUCT_ARM_THREAD_STATE struct arm_thread_state 58_STRUCT_ARM_THREAD_STATE 59{ 60 __uint32_t r[13]; /* General purpose register r0-r12 */ 61 __uint32_t sp; /* Stack pointer r13 */ 62 __uint32_t lr; /* Link register r14 */ 63 __uint32_t pc; /* Program counter r15 */ 64 __uint32_t cpsr; /* Current program status register */ 65}; 66#endif /* __DARWIN_UNIX03 */ 67 68#if __DARWIN_UNIX03 69#define _STRUCT_ARM_THREAD_STATE64 struct __darwin_arm_thread_state64 70_STRUCT_ARM_THREAD_STATE64 71{ 72 __uint64_t __x[29]; /* General purpose registers x0-x28 */ 73 __uint64_t __fp; /* Frame pointer x29 */ 74 __uint64_t __lr; /* Link register x30 */ 75 __uint64_t __sp; /* Stack pointer x31 */ 76 __uint64_t __pc; /* Program counter */ 77 __uint32_t __cpsr; /* Current program status register */ 78}; 79#else /* !__DARWIN_UNIX03 */ 80#define _STRUCT_ARM_THREAD_STATE64 struct arm_thread_state64 81_STRUCT_ARM_THREAD_STATE64 82{ 83 __uint64_t x[29]; /* General purpose registers x0-x28 */ 84 __uint64_t fp; /* Frame pointer x29 */ 85 __uint64_t lr; /* Link register x30 */ 86 __uint64_t sp; /* Stack pointer x31 */ 87 __uint64_t pc; /* Program counter */ 88 __uint32_t cpsr; /* Current program status register */ 89}; 90#endif /* __DARWIN_UNIX03 */ 91 92#if __DARWIN_UNIX03 93#define _STRUCT_ARM_VFP_STATE struct __darwin_arm_vfp_state 94_STRUCT_ARM_VFP_STATE 95{ 96 __uint32_t __r[64]; 97 __uint32_t __fpscr; 98 99}; 100#else /* !__DARWIN_UNIX03 */ 101#define _STRUCT_ARM_VFP_STATE struct arm_vfp_state 102_STRUCT_ARM_VFP_STATE 103{ 104 __uint32_t r[64]; 105 __uint32_t fpscr; 106}; 107#endif /* __DARWIN_UNIX03 */ 108 109#if __DARWIN_UNIX03 110#define _STRUCT_ARM_NEON_STATE64 struct __darwin_arm_neon_state64 111#define _STRUCT_ARM_NEON_STATE struct __darwin_arm_neon_state 112 113#if defined(__arm64__) 114_STRUCT_ARM_NEON_STATE64 115{ 116 __uint128_t __v[32]; 117 __uint32_t __fpsr; 118 __uint32_t __fpcr; 119}; 120 121_STRUCT_ARM_NEON_STATE 122{ 123 __uint128_t __v[16]; 124 __uint32_t __fpsr; 125 __uint32_t __fpcr; 126}; 127 128#elif defined(__arm__) 129/* 130 * No 128-bit intrinsic for ARM; leave it opaque for now. 131 */ 132_STRUCT_ARM_NEON_STATE64 133{ 134 char opaque[(32 * 16) + (2 * sizeof(__uint32_t))]; 135} __attribute__((aligned(16))); 136 137_STRUCT_ARM_NEON_STATE 138{ 139 char opaque[(16 * 16) + (2 * sizeof(__uint32_t))]; 140} __attribute__((aligned(16))); 141 142#else 143#error Unknown architecture. 144#endif 145 146#else /* !__DARWIN_UNIX03 */ 147#define _STRUCT_ARM_NEON_STATE64 struct arm_neon_state64 148#define _STRUCT_ARM_NEON_STATE struct arm_neon_state 149 150#if defined(__arm64__) 151_STRUCT_ARM_NEON_STATE64 152{ 153 __uint128_t q[32]; 154 uint32_t fpsr; 155 uint32_t fpcr; 156 157}; 158_STRUCT_ARM_NEON_STATE 159{ 160 __uint128_t q[16]; 161 uint32_t fpsr; 162 uint32_t fpcr; 163 164}; 165#elif defined(__arm__) 166/* 167 * No 128-bit intrinsic for ARM; leave it opaque for now. 168 */ 169_STRUCT_ARM_NEON_STATE64 170{ 171 char opaque[(32 * 16) + (2 * sizeof(__uint32_t))]; 172} __attribute__((aligned(16))); 173 174_STRUCT_ARM_NEON_STATE 175{ 176 char opaque[(16 * 16) + (2 * sizeof(__uint32_t))]; 177} __attribute__((aligned(16))); 178 179#else 180#error Unknown architecture. 181#endif 182 183#endif /* __DARWIN_UNIX03 */ 184 185/* 186 * Debug State 187 */ 188#if defined(__arm__) 189/* Old-fashioned debug state is only for ARM */ 190 191#if __DARWIN_UNIX03 192#define _STRUCT_ARM_DEBUG_STATE struct __darwin_arm_debug_state 193_STRUCT_ARM_DEBUG_STATE 194{ 195 __uint32_t __bvr[16]; 196 __uint32_t __bcr[16]; 197 __uint32_t __wvr[16]; 198 __uint32_t __wcr[16]; 199}; 200#else /* !__DARWIN_UNIX03 */ 201#define _STRUCT_ARM_DEBUG_STATE struct arm_debug_state 202_STRUCT_ARM_DEBUG_STATE 203{ 204 __uint32_t bvr[16]; 205 __uint32_t bcr[16]; 206 __uint32_t wvr[16]; 207 __uint32_t wcr[16]; 208}; 209#endif /* __DARWIN_UNIX03 */ 210 211#elif defined(__arm64__) 212 213/* ARM's arm_debug_state is ARM64's arm_legacy_debug_state */ 214 215#if __DARWIN_UNIX03 216#define _STRUCT_ARM_LEGACY_DEBUG_STATE struct arm_legacy_debug_state 217_STRUCT_ARM_LEGACY_DEBUG_STATE 218{ 219 __uint32_t __bvr[16]; 220 __uint32_t __bcr[16]; 221 __uint32_t __wvr[16]; 222 __uint32_t __wcr[16]; 223}; 224#else /* __DARWIN_UNIX03 */ 225#define _STRUCT_ARM_LEGACY_DEBUG_STATE struct arm_legacy_debug_state 226_STRUCT_ARM_LEGACY_DEBUG_STATE 227{ 228 __uint32_t bvr[16]; 229 __uint32_t bcr[16]; 230 __uint32_t wvr[16]; 231 __uint32_t wcr[16]; 232}; 233#endif /* __DARWIN_UNIX03 */ 234#else 235#error unknown architecture 236#endif 237 238#if __DARWIN_UNIX03 239#define _STRUCT_ARM_DEBUG_STATE32 struct __darwin_arm_debug_state32 240_STRUCT_ARM_DEBUG_STATE32 241{ 242 __uint32_t __bvr[16]; 243 __uint32_t __bcr[16]; 244 __uint32_t __wvr[16]; 245 __uint32_t __wcr[16]; 246 __uint64_t __mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */ 247}; 248 249#define _STRUCT_ARM_DEBUG_STATE64 struct __darwin_arm_debug_state64 250_STRUCT_ARM_DEBUG_STATE64 251{ 252 __uint64_t __bvr[16]; 253 __uint64_t __bcr[16]; 254 __uint64_t __wvr[16]; 255 __uint64_t __wcr[16]; 256 __uint64_t __mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */ 257}; 258#else /* !__DARWIN_UNIX03 */ 259#define _STRUCT_ARM_DEBUG_STATE32 struct arm_debug_state32 260_STRUCT_ARM_DEBUG_STATE32 261{ 262 __uint32_t bvr[16]; 263 __uint32_t bcr[16]; 264 __uint32_t wvr[16]; 265 __uint32_t wcr[16]; 266 __uint64_t mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */ 267}; 268 269#define _STRUCT_ARM_DEBUG_STATE64 struct arm_debug_state64 270_STRUCT_ARM_DEBUG_STATE64 271{ 272 __uint64_t bvr[16]; 273 __uint64_t bcr[16]; 274 __uint64_t wvr[16]; 275 __uint64_t wcr[16]; 276 __uint64_t mdscr_el1; /* Bit 0 is SS (Hardware Single Step) */ 277}; 278#endif /* __DARWIN_UNIX03 */ 279 280#endif /* _MACH_ARM__STRUCTS_H_ */ 281