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