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