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(i386)42 version (i386)
43 {
44 alias mach_port_t thread_act_t;
45 alias void thread_state_t;
46 alias int thread_state_flavor_t;
47 alias natural_t mach_msg_type_number_t;
48
49 enum
50 {
51 x86_THREAD_STATE32 = 1,
52 x86_FLOAT_STATE32 = 2,
53 x86_EXCEPTION_STATE32 = 3,
54 x86_THREAD_STATE64 = 4,
55 x86_FLOAT_STATE64 = 5,
56 x86_EXCEPTION_STATE64 = 6,
57 x86_THREAD_STATE = 7,
58 x86_FLOAT_STATE = 8,
59 x86_EXCEPTION_STATE = 9,
60 x86_DEBUG_STATE32 = 10,
61 x86_DEBUG_STATE64 = 11,
62 x86_DEBUG_STATE = 12,
63 THREAD_STATE_NONE = 13,
64 }
65
66 struct x86_thread_state32_t
67 {
68 uint eax;
69 uint ebx;
70 uint ecx;
71 uint edx;
72 uint edi;
73 uint esi;
74 uint ebp;
75 uint esp;
76 uint ss;
77 uint eflags;
78 uint eip;
79 uint cs;
80 uint ds;
81 uint es;
82 uint fs;
83 uint gs;
84 }
85
86 struct x86_thread_state64_t
87 {
88 ulong rax;
89 ulong rbx;
90 ulong rcx;
91 ulong rdx;
92 ulong rdi;
93 ulong rsi;
94 ulong rbp;
95 ulong rsp;
96 ulong r8;
97 ulong r9;
98 ulong r10;
99 ulong r11;
100 ulong r12;
101 ulong r13;
102 ulong r14;
103 ulong r15;
104 ulong rip;
105 ulong rflags;
106 ulong cs;
107 ulong fs;
108 ulong gs;
109 }
110
111 struct x86_state_hdr_t
112 {
113 int flavor;
114 int count;
115 }
116
117 struct x86_thread_state_t
118 {
119 x86_state_hdr_t tsh;
120 union _uts
121 {
122 x86_thread_state32_t ts32;
123 x86_thread_state64_t ts64;
124 }
125 _uts uts;
126 }
127
128 enum : mach_msg_type_number_t
129 {
130 x86_THREAD_STATE32_COUNT = cast(mach_msg_type_number_t)( x86_thread_state32_t.sizeof / int.sizeof ),
131 x86_THREAD_STATE64_COUNT = cast(mach_msg_type_number_t)( x86_thread_state64_t.sizeof / int.sizeof ),
132 x86_THREAD_STATE_COUNT = cast(mach_msg_type_number_t)( x86_thread_state_t.sizeof / int.sizeof ),
133 }
134
135 alias x86_THREAD_STATE MACHINE_THREAD_STATE;
136 alias x86_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT;
137
138 mach_port_t mach_thread_self();
139 kern_return_t thread_suspend(thread_act_t);
140 kern_return_t thread_resume(thread_act_t);
141 kern_return_t thread_get_state(thread_act_t, thread_state_flavor_t, thread_state_t*, mach_msg_type_number_t*);
142 }
143 // https://github.com/apple/darwin-xnu/blob/master/osfmk/mach/arm/_structs.h
144 // https://github.com/apple/darwin-xnu/blob/master/osfmk/mach/arm/thread_status.h
version(AnyARM)145 else version (AnyARM)
146 {
147 alias thread_act_t = mach_port_t;
148 alias thread_state_t = void;
149 alias thread_state_flavor_t = int;
150 alias mach_msg_type_number_t = natural_t;
151
152 enum
153 {
154 ARM_THREAD_STATE = 1,
155 ARM_UNIFIED_THREAD_STATE = ARM_THREAD_STATE,
156 ARM_VFP_STATE = 2,
157 ARM_EXCEPTION_STATE = 3,
158 ARM_DEBUG_STATE = 4, /* pre-armv8 */
159 THREAD_STATE_NONE = 5,
160 ARM_THREAD_STATE64 = 6,
161 ARM_EXCEPTION_STATE64 = 7,
162 // ARM_THREAD_STATE_LAST = 8, /* legacy */
163 ARM_THREAD_STATE32 = 9
164 }
165
166 enum
167 {
168 ARM_DEBUG_STATE32 = 14,
169 ARM_DEBUG_STATE64 = 15,
170 ARM_NEON_STATE = 16,
171 ARM_NEON_STATE64 = 17,
172 ARM_CPMU_STATE64 = 18
173 }
174
175 enum
176 {
177 ARM_AMX_STATE = 24,
178 ARM_AMX_STATE_V1 = 25
179 }
180
181 struct arm_thread_state_t
182 {
183 uint[13] r; /// General purpose register r0-r12
184 uint sp; /// Stack pointer r13
185 uint lr; /// Link register r14
186 uint pc; /// Program counter r15
187 uint cpsr; /// Current program status register
188 }
189
190 alias arm_thread_state32_t = arm_thread_state_t;
191
192 struct arm_thread_state64_t
193 {
194 ulong[29] x; /// General purpose registers x0-x28
195 ulong fp; /// Frame pointer x29
196 ulong lr; /// Link register x30
197 ulong sp; /// Stack pointer x31
198 ulong pc; /// Program counter
199 ulong cpsr; /// Current program status register
200 ulong pad; /// Same size for 32-bit or 64-bit clients
201 }
202
203 struct arm_state_hdr_t
204 {
205 uint flavor;
206 uint count;
207 }
208
209 struct arm_unified_thread_state_t
210 {
211 arm_state_hdr_t ash;
212
213 union _uts
214 {
215 arm_thread_state32_t ts_32;
216 arm_thread_state64_t ts_64;
217 }
218
219 _uts uts;
220 }
221
222 enum : mach_msg_type_number_t
223 {
224 ARM_THREAD_STATE_COUNT = cast(mach_msg_type_number_t) (arm_thread_state_t.sizeof / uint.sizeof),
225 ARM_THREAD_STATE32_COUNT = cast(mach_msg_type_number_t) (arm_thread_state32_t.sizeof / uint.sizeof),
226 ARM_THREAD_STATE64_COUNT = cast(mach_msg_type_number_t) (arm_thread_state64_t.sizeof / uint.sizeof),
227 ARM_UNIFIED_THREAD_STATE_COUNT = cast(mach_msg_type_number_t) (arm_unified_thread_state_t.sizeof / uint.sizeof)
228 }
229
230 alias MACHINE_THREAD_STATE = ARM_THREAD_STATE;
231 alias MACHINE_THREAD_STATE_COUNT = ARM_UNIFIED_THREAD_STATE_COUNT;
232
233 mach_port_t mach_thread_self();
234 kern_return_t thread_suspend(thread_act_t);
235 kern_return_t thread_resume(thread_act_t);
236 kern_return_t thread_get_state(thread_act_t, thread_state_flavor_t, thread_state_t*, mach_msg_type_number_t*);
237 }
238