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 */
14module core.sys.darwin.mach.thread_act;
15
16version (OSX)
17    version = Darwin;
18else version (iOS)
19    version = Darwin;
20else version (TVOS)
21    version = Darwin;
22else version (WatchOS)
23    version = Darwin;
24
25version (Darwin):
26extern (C):
27nothrow:
28@nogc:
29
30public import core.sys.darwin.mach.kern_return;
31public import core.sys.darwin.mach.port;
32
33version (X86)
34    version = i386;
35version (X86_64)
36    version = i386;
37version (AArch64)
38    version = AnyARM;
39version (ARM)
40    version = AnyARM;
41version (PPC)
42    version = AnyPPC;
43version (PPC64)
44    version = AnyPPC;
45
46version (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
149else 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}
242else 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