1 /**
2 * D header file for Darwin.
3 *
4 * Copyright: Copyright Sean Kelly 2008 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly
7 */
8
9 /* Copyright Sean Kelly 2008 - 2009.
10 * Distributed under the Boost Software License, Version 1.0.
11 * (See accompanying file LICENSE or copy at
12 * http://www.boost.org/LICENSE_1_0.txt)
13 */
14 module core.sys.darwin.mach.thread_act;
15
16 version (OSX)
17 version = Darwin;
18 else version (iOS)
19 version = Darwin;
20 else version (TVOS)
21 version = Darwin;
22 else version (WatchOS)
23 version = Darwin;
24
25 version (Darwin):
26 extern (C):
27 nothrow:
28 @nogc:
29
30 public import core.sys.darwin.mach.kern_return;
31 public import core.sys.darwin.mach.port;
32
33 version (X86)
34 version = i386;
35 version (X86_64)
36 version = i386;
37 version (AArch64)
38 version = AnyARM;
39 version (ARM)
40 version = AnyARM;
41 version (PPC)
42 version = AnyPPC;
43 version (PPC64)
44 version = AnyPPC;
45
version(i386)46 version (i386)
47 {
48 alias mach_port_t thread_act_t;
49 alias void thread_state_t;
50 alias int thread_state_flavor_t;
51 alias natural_t mach_msg_type_number_t;
52
53 enum
54 {
55 x86_THREAD_STATE32 = 1,
56 x86_FLOAT_STATE32 = 2,
57 x86_EXCEPTION_STATE32 = 3,
58 x86_THREAD_STATE64 = 4,
59 x86_FLOAT_STATE64 = 5,
60 x86_EXCEPTION_STATE64 = 6,
61 x86_THREAD_STATE = 7,
62 x86_FLOAT_STATE = 8,
63 x86_EXCEPTION_STATE = 9,
64 x86_DEBUG_STATE32 = 10,
65 x86_DEBUG_STATE64 = 11,
66 x86_DEBUG_STATE = 12,
67 THREAD_STATE_NONE = 13,
68 }
69
70 struct x86_thread_state32_t
71 {
72 uint eax;
73 uint ebx;
74 uint ecx;
75 uint edx;
76 uint edi;
77 uint esi;
78 uint ebp;
79 uint esp;
80 uint ss;
81 uint eflags;
82 uint eip;
83 uint cs;
84 uint ds;
85 uint es;
86 uint fs;
87 uint gs;
88 }
89
90 struct x86_thread_state64_t
91 {
92 ulong rax;
93 ulong rbx;
94 ulong rcx;
95 ulong rdx;
96 ulong rdi;
97 ulong rsi;
98 ulong rbp;
99 ulong rsp;
100 ulong r8;
101 ulong r9;
102 ulong r10;
103 ulong r11;
104 ulong r12;
105 ulong r13;
106 ulong r14;
107 ulong r15;
108 ulong rip;
109 ulong rflags;
110 ulong cs;
111 ulong fs;
112 ulong gs;
113 }
114
115 struct x86_state_hdr_t
116 {
117 int flavor;
118 int count;
119 }
120
121 struct x86_thread_state_t
122 {
123 x86_state_hdr_t tsh;
124 union _uts
125 {
126 x86_thread_state32_t ts32;
127 x86_thread_state64_t ts64;
128 }
129 _uts uts;
130 }
131
132 enum : mach_msg_type_number_t
133 {
134 x86_THREAD_STATE32_COUNT = cast(mach_msg_type_number_t)( x86_thread_state32_t.sizeof / int.sizeof ),
135 x86_THREAD_STATE64_COUNT = cast(mach_msg_type_number_t)( x86_thread_state64_t.sizeof / int.sizeof ),
136 x86_THREAD_STATE_COUNT = cast(mach_msg_type_number_t)( x86_thread_state_t.sizeof / int.sizeof ),
137 }
138
139 alias x86_THREAD_STATE MACHINE_THREAD_STATE;
140 alias x86_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT;
141
142 mach_port_t mach_thread_self();
143 kern_return_t thread_suspend(thread_act_t);
144 kern_return_t thread_resume(thread_act_t);
145 kern_return_t thread_get_state(thread_act_t, thread_state_flavor_t, thread_state_t*, mach_msg_type_number_t*);
146 }
147 // https://github.com/apple/darwin-xnu/blob/master/osfmk/mach/arm/_structs.h
148 // https://github.com/apple/darwin-xnu/blob/master/osfmk/mach/arm/thread_status.h
version(AnyARM)149 else version (AnyARM)
150 {
151 alias thread_act_t = mach_port_t;
152 alias thread_state_t = void;
153 alias thread_state_flavor_t = int;
154 alias mach_msg_type_number_t = natural_t;
155
156 enum
157 {
158 ARM_THREAD_STATE = 1,
159 ARM_UNIFIED_THREAD_STATE = ARM_THREAD_STATE,
160 ARM_VFP_STATE = 2,
161 ARM_EXCEPTION_STATE = 3,
162 ARM_DEBUG_STATE = 4, /* pre-armv8 */
163 THREAD_STATE_NONE = 5,
164 ARM_THREAD_STATE64 = 6,
165 ARM_EXCEPTION_STATE64 = 7,
166 // ARM_THREAD_STATE_LAST = 8, /* legacy */
167 ARM_THREAD_STATE32 = 9
168 }
169
170 enum
171 {
172 ARM_DEBUG_STATE32 = 14,
173 ARM_DEBUG_STATE64 = 15,
174 ARM_NEON_STATE = 16,
175 ARM_NEON_STATE64 = 17,
176 ARM_CPMU_STATE64 = 18
177 }
178
179 enum
180 {
181 ARM_AMX_STATE = 24,
182 ARM_AMX_STATE_V1 = 25
183 }
184
185 struct arm_thread_state_t
186 {
187 uint[13] r; /// General purpose register r0-r12
188 uint sp; /// Stack pointer r13
189 uint lr; /// Link register r14
190 uint pc; /// Program counter r15
191 uint cpsr; /// Current program status register
192 }
193
194 alias arm_thread_state32_t = arm_thread_state_t;
195
196 struct arm_thread_state64_t
197 {
198 ulong[29] x; /// General purpose registers x0-x28
199 ulong fp; /// Frame pointer x29
200 ulong lr; /// Link register x30
201 ulong sp; /// Stack pointer x31
202 ulong pc; /// Program counter
203 ulong cpsr; /// Current program status register
204 ulong pad; /// Same size for 32-bit or 64-bit clients
205 }
206
207 struct arm_state_hdr_t
208 {
209 uint flavor;
210 uint count;
211 }
212
213 struct arm_unified_thread_state_t
214 {
215 arm_state_hdr_t ash;
216
217 union _uts
218 {
219 arm_thread_state32_t ts_32;
220 arm_thread_state64_t ts_64;
221 }
222
223 _uts uts;
224 }
225
226 enum : mach_msg_type_number_t
227 {
228 ARM_THREAD_STATE_COUNT = cast(mach_msg_type_number_t) (arm_thread_state_t.sizeof / uint.sizeof),
229 ARM_THREAD_STATE32_COUNT = cast(mach_msg_type_number_t) (arm_thread_state32_t.sizeof / uint.sizeof),
230 ARM_THREAD_STATE64_COUNT = cast(mach_msg_type_number_t) (arm_thread_state64_t.sizeof / uint.sizeof),
231 ARM_UNIFIED_THREAD_STATE_COUNT = cast(mach_msg_type_number_t) (arm_unified_thread_state_t.sizeof / uint.sizeof)
232 }
233
234 alias MACHINE_THREAD_STATE = ARM_THREAD_STATE;
235 alias MACHINE_THREAD_STATE_COUNT = ARM_UNIFIED_THREAD_STATE_COUNT;
236
237 mach_port_t mach_thread_self();
238 kern_return_t thread_suspend(thread_act_t);
239 kern_return_t thread_resume(thread_act_t);
240 kern_return_t thread_get_state(thread_act_t, thread_state_flavor_t, thread_state_t*, mach_msg_type_number_t*);
241 }
version(AnyPPC)242 else version (AnyPPC)
243 {
244 alias thread_act_t = mach_port_t;
245 alias thread_state_t = void;
246 alias thread_state_flavor_t = int;
247 alias mach_msg_type_number_t = natural_t;
248
249 enum
250 {
251 PPC_THREAD_STATE = 1,
252 PPC_FLOAT_STATE = 2,
253 PPC_EXCEPTION_STATE = 3,
254 PPC_VECTOR_STATE = 4,
255 PPC_THREAD_STATE64 = 5,
256 PPC_EXCEPTION_STATE64 = 6,
257 THREAD_STATE_NONE = 7
258 }
259
260 struct ppc_thread_state_t
261 {
262 uint srr0; /// Instruction address register (PC)
263 uint srr1; /// Machine state register (supervisor)
264 uint[32] r; /// General purpose register r0-r31
265 uint cr; /// Condition register
266 uint xer; /// User's integer exception register
267 uint lr; /// Link register
268 uint ctr; /// Count register
269 uint mq; /// MQ register (601 only)
270 uint vrsave; /// Vector save register
271 }
272
273 alias ppc_thread_state32_t = ppc_thread_state_t;
274
275 struct ppc_thread_state64_t
276 {
277 ulong srr0; /// Instruction address register (PC)
278 ulong srr1; /// Machine state register (supervisor)
279 ulong[32] r; /// General purpose register r0-r31
280 uint cr; /// Condition register
281 uint pad0;
282 ulong xer; /// User's integer exception register
283 ulong lr; /// Link register
284 ulong ctr; /// Count register
285 uint vrsave; /// Vector save register
286 uint pad1;
287 }
288
289 enum : mach_msg_type_number_t
290 {
291 PPC_THREAD_STATE_COUNT = cast(mach_msg_type_number_t) (ppc_thread_state_t.sizeof / uint.sizeof),
292 PPC_THREAD_STATE32_COUNT = cast(mach_msg_type_number_t) (ppc_thread_state32_t.sizeof / uint.sizeof),
293 PPC_THREAD_STATE64_COUNT = cast(mach_msg_type_number_t) (ppc_thread_state64_t.sizeof / uint.sizeof),
294 }
295
296 alias MACHINE_THREAD_STATE = PPC_THREAD_STATE;
297 alias MACHINE_THREAD_STATE_COUNT = PPC_THREAD_STATE_COUNT;
298
299 mach_port_t mach_thread_self();
300 kern_return_t thread_suspend(thread_act_t);
301 kern_return_t thread_resume(thread_act_t);
302 kern_return_t thread_get_state(thread_act_t, thread_state_flavor_t, thread_state_t*, mach_msg_type_number_t*);
303 }
304