]> git.saurik.com Git - apple/xnu.git/blame - osfmk/mach/i386/thread_status.h
xnu-792.6.22.tar.gz
[apple/xnu.git] / osfmk / mach / i386 / thread_status.h
CommitLineData
1c79356b 1/*
91447636 2 * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
1c79356b
A
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
e5568f75
A
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
43866e37 11 *
e5568f75
A
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1c79356b
A
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
e5568f75
A
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
1c79356b
A
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * @OSF_COPYRIGHT@
24 */
25/*
26 * Mach Operating System
27 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
28 * All Rights Reserved.
29 *
30 * Permission to use, copy, modify and distribute this software and its
31 * documentation is hereby granted, provided that both the copyright
32 * notice and this permission notice appear in all copies of the
33 * software, derivative works or modified versions, and any portions
34 * thereof, and that both notices appear in supporting documentation.
35 *
36 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39 *
40 * Carnegie Mellon requests users of this software to return to
41 *
42 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
43 * School of Computer Science
44 * Carnegie Mellon University
45 * Pittsburgh PA 15213-3890
46 *
47 * any improvements or extensions that they make and grant Carnegie Mellon
48 * the rights to redistribute these changes.
49 */
50/*
51 */
52/*
53 * File: thread_status.h
54 * Author: Avadis Tevanian, Jr.
55 * Date: 1985
56 *
57 * This file contains the structure definitions for the thread
58 * state as applied to I386 processors.
59 */
60
61#ifndef _MACH_I386_THREAD_STATUS_H_
62#define _MACH_I386_THREAD_STATUS_H_
63
91447636 64#include <mach/message.h>
1c79356b
A
65#include <mach/i386/fp_reg.h>
66#include <mach/i386/thread_state.h>
67#include <architecture/i386/frame.h> /* FIXME */
68#include <architecture/i386/fpu.h> /* FIXME */
69/*
70 * i386_thread_state this is the structure that is exported
71 * to user threads for use in status/mutate
72 * calls. This structure should never
73 * change.
74 *
75 * i386_float_state exported to use threads for access to
76 * floating point registers. Try not to
77 * change this one, either.
78 *
79 * i386_isa_port_map_state exported to user threads to allow
80 * selective in/out operations
81 *
82 * i386_v86_assist_state
83 *
84 * thread_syscall_state
85 */
86
87/* THREAD_STATE_FLAVOR_LIST 0 */
88#define i386_NEW_THREAD_STATE 1 /* used to be i386_THREAD_STATE */
89#define i386_FLOAT_STATE 2
90#define i386_ISA_PORT_MAP_STATE 3
91#define i386_V86_ASSIST_STATE 4
92#define i386_REGS_SEGS_STATE 5
93#define THREAD_SYSCALL_STATE 6
94#define THREAD_STATE_NONE 7
95#define i386_SAVED_STATE 8
96
97
98/*
99 * VALID_THREAD_STATE_FLAVOR is a platform specific macro that when passed
100 * an exception flavor will return if that is a defined flavor for that
101 * platform. The macro must be manually updated to include all of the valid
102 * exception flavors as defined above.
103 */
104#define VALID_THREAD_STATE_FLAVOR(x) \
105 ((x == i386_NEW_THREAD_STATE) || \
106 (x == i386_FLOAT_STATE) || \
107 (x == i386_ISA_PORT_MAP_STATE) || \
108 (x == i386_V86_ASSIST_STATE) || \
109 (x == i386_REGS_SEGS_STATE) || \
110 (x == THREAD_SYSCALL_STATE) || \
111 (x == THREAD_STATE_NONE) || \
112 (x == i386_SAVED_STATE))
113
114/*
115 * This structure is used for both
116 * i386_THREAD_STATE and i386_REGS_SEGS_STATE.
117 */
118struct i386_new_thread_state {
119 unsigned int gs;
120 unsigned int fs;
121 unsigned int es;
122 unsigned int ds;
123 unsigned int edi;
124 unsigned int esi;
125 unsigned int ebp;
126 unsigned int esp;
127 unsigned int ebx;
128 unsigned int edx;
129 unsigned int ecx;
130 unsigned int eax;
131 unsigned int eip;
132 unsigned int cs;
133 unsigned int efl;
134 unsigned int uesp;
135 unsigned int ss;
136};
91447636
A
137#define i386_NEW_THREAD_STATE_COUNT ((mach_msg_type_number_t) \
138 (sizeof (struct i386_new_thread_state)/sizeof(unsigned int)))
1c79356b
A
139
140/*
141 * Subset of saved state stored by processor on kernel-to-kernel
142 * trap. (Used by ddb to examine state guaranteed to be present
143 * on all traps into debugger.)
144 */
145struct i386_saved_state_from_kernel {
146 unsigned int gs;
147 unsigned int fs;
148 unsigned int es;
149 unsigned int ds;
150 unsigned int edi;
151 unsigned int esi;
152 unsigned int ebp;
153 unsigned int esp; /* kernel esp stored by pusha -
154 we save cr2 here later */
155 unsigned int ebx;
156 unsigned int edx;
157 unsigned int ecx;
158 unsigned int eax;
159 unsigned int trapno;
160 unsigned int err;
161 unsigned int eip;
162 unsigned int cs;
163 unsigned int efl;
164};
165
166/*
167 * The format in which thread state is saved by Mach on this machine. This
168 * state flavor is most efficient for exception RPC's to kernel-loaded
169 * servers, because copying can be avoided:
170 */
171struct i386_saved_state {
172 unsigned int gs;
173 unsigned int fs;
174 unsigned int es;
175 unsigned int ds;
176 unsigned int edi;
177 unsigned int esi;
178 unsigned int ebp;
179 unsigned int esp; /* kernel esp stored by pusha -
180 we save cr2 here later */
181 unsigned int ebx;
182 unsigned int edx;
183 unsigned int ecx;
184 unsigned int eax;
185 unsigned int trapno;
186 unsigned int err;
187 unsigned int eip;
188 unsigned int cs;
189 unsigned int efl;
190 unsigned int uesp;
191 unsigned int ss;
192 struct v86_segs {
193 unsigned int v86_es; /* virtual 8086 segment registers */
194 unsigned int v86_ds;
195 unsigned int v86_fs;
196 unsigned int v86_gs;
197 } v86_segs;
198#define i386_SAVED_ARGV_COUNT 7
199 unsigned int argv_status; /* Boolean flag indicating whether or
200 * not Mach copied in the args */
201 unsigned int argv[i386_SAVED_ARGV_COUNT];
202 /* The return address, and the first several
203 * function call args from the stack, for
204 * efficient syscall exceptions */
205};
91447636
A
206#define i386_SAVED_STATE_COUNT ((mach_msg_type_number_t) \
207 (sizeof (struct i386_saved_state)/sizeof(unsigned int)))
1c79356b
A
208#define i386_REGS_SEGS_STATE_COUNT i386_SAVED_STATE_COUNT
209
210/*
211 * Machine-independent way for servers and Mach's exception mechanism to
212 * choose the most efficient state flavor for exception RPC's:
213 */
214#define MACHINE_THREAD_STATE i386_SAVED_STATE
55e303ae 215#define MACHINE_THREAD_STATE_COUNT 144
1c79356b
A
216
217/*
218 * Largest state on this machine:
219 * (be sure mach/machine/thread_state.h matches!)
220 */
55e303ae 221#define THREAD_MACHINE_STATE_MAX THREAD_STATE_MAX
1c79356b
A
222
223/*
224 * Floating point state.
225 *
226 * fpkind tells in what way floating point operations are supported.
227 * See the values for fp_kind in <mach/i386/fp_reg.h>.
228 *
229 * If the kind is FP_NO, then calls to set the state will fail, and
230 * thread_getstatus will return garbage for the rest of the state.
231 * If "initialized" is false, then the rest of the state is garbage.
232 * Clients can set "initialized" to false to force the coprocessor to
233 * be reset.
234 * "exc_status" is non-zero if the thread has noticed (but not
235 * proceeded from) a coprocessor exception. It contains the status
236 * word with the exception bits set. The status word in "fp_status"
237 * will have the exception bits turned off. If an exception bit in
238 * "fp_status" is turned on, then "exc_status" should be zero. This
239 * happens when the coprocessor exception is noticed after the system
240 * has context switched to some other thread.
241 *
242 * If kind is FP_387, then "state" is a i387_state. Other kinds might
243 * also use i387_state, but somebody will have to verify it (XXX).
244 * Note that the registers are ordered from top-of-stack down, not
245 * according to physical register number.
246 */
247
55e303ae 248#define FP_STATE_BYTES 512
1c79356b
A
249
250struct i386_float_state {
251 int fpkind; /* FP_NO..FP_387 (readonly) */
252 int initialized;
253 unsigned char hw_state[FP_STATE_BYTES]; /* actual "hardware" state */
254 int exc_status; /* exception status (readonly) */
255};
91447636
A
256#define i386_FLOAT_STATE_COUNT ((mach_msg_type_number_t) \
257 (sizeof(struct i386_float_state)/sizeof(unsigned int)))
1c79356b
A
258
259
91447636
A
260#define FP_old_STATE_BYTES ((mach_msg_type_number_t) \
261 (sizeof (struct i386_fp_save) + sizeof (struct i386_fp_regs)))
55e303ae
A
262
263struct i386_old_float_state {
264 int fpkind; /* FP_NO..FP_387 (readonly) */
265 int initialized;
266 unsigned char hw_state[FP_old_STATE_BYTES]; /* actual "hardware" state */
267 int exc_status; /* exception status (readonly) */
268};
91447636
A
269#define i386_old_FLOAT_STATE_COUNT ((mach_msg_type_number_t) \
270 (sizeof(struct i386_old_float_state)/sizeof(unsigned int)))
55e303ae
A
271
272
1c79356b
A
273#define PORT_MAP_BITS 0x400
274struct i386_isa_port_map_state {
275 unsigned char pm[PORT_MAP_BITS>>3];
276};
277
91447636
A
278#define i386_ISA_PORT_MAP_STATE_COUNT ((mach_msg_type_number_t) \
279 (sizeof(struct i386_isa_port_map_state)/sizeof(unsigned int)))
1c79356b
A
280
281/*
282 * V8086 assist supplies a pointer to an interrupt
283 * descriptor table in task space.
284 */
285struct i386_v86_assist_state {
286 unsigned int int_table; /* interrupt table address */
287 int int_count; /* interrupt table size */
288};
289
290struct v86_interrupt_table {
291 unsigned int count; /* count of pending interrupts */
292 unsigned short mask; /* ignore this interrupt if true */
293 unsigned short vec; /* vector to take */
294};
295
91447636
A
296#define i386_V86_ASSIST_STATE_COUNT ((mach_msg_type_number_t) \
297 (sizeof(struct i386_v86_assist_state)/sizeof(unsigned int)))
1c79356b
A
298
299struct thread_syscall_state {
300 unsigned eax;
301 unsigned edx;
302 unsigned efl;
303 unsigned eip;
304 unsigned esp;
305};
306
91447636
A
307#define i386_THREAD_SYSCALL_STATE_COUNT ((mach_msg_type_number_t) \
308 (sizeof(struct thread_syscall_state) / sizeof(unsigned int)))
1c79356b
A
309
310/*
311 * Main thread state consists of
312 * general registers, segment registers,
313 * eip and eflags.
314 */
315
316#define i386_THREAD_STATE -1
317
318typedef struct {
319 unsigned int eax;
320 unsigned int ebx;
321 unsigned int ecx;
322 unsigned int edx;
323 unsigned int edi;
324 unsigned int esi;
325 unsigned int ebp;
326 unsigned int esp;
327 unsigned int ss;
328 unsigned int eflags;
329 unsigned int eip;
330 unsigned int cs;
331 unsigned int ds;
332 unsigned int es;
333 unsigned int fs;
334 unsigned int gs;
335} i386_thread_state_t;
336
91447636
A
337#define i386_THREAD_STATE_COUNT ((mach_msg_type_number_t) \
338 ( sizeof (i386_thread_state_t) / sizeof (int) ))
1c79356b
A
339
340/*
341 * Default segment register values.
342 */
343
344#define USER_CODE_SELECTOR 0x0017
345#define USER_DATA_SELECTOR 0x001f
346#define KERN_CODE_SELECTOR 0x0008
347#define KERN_DATA_SELECTOR 0x0010
348
349/*
350 * Thread floating point state
351 * includes FPU environment as
352 * well as the register stack.
353 */
354
355#define i386_THREAD_FPSTATE -2
356
357typedef struct {
358 fp_env_t environ;
359 fp_stack_t stack;
360} i386_thread_fpstate_t;
361
91447636
A
362#define i386_THREAD_FPSTATE_COUNT ((mach_msg_type_number_t) \
363 ( sizeof (i386_thread_fpstate_t) / sizeof (int) ))
1c79356b
A
364
365/*
366 * Extra state that may be
367 * useful to exception handlers.
368 */
369
370#define i386_THREAD_EXCEPTSTATE -3
371
372typedef struct {
373 unsigned int trapno;
374 err_code_t err;
375} i386_thread_exceptstate_t;
376
91447636
A
377#define i386_THREAD_EXCEPTSTATE_COUNT ((mach_msg_type_number_t) \
378 ( sizeof (i386_thread_exceptstate_t) / sizeof (int) ))
1c79356b
A
379
380/*
381 * Per-thread variable used
382 * to store 'self' id for cthreads.
383 */
384
385#define i386_THREAD_CTHREADSTATE -4
386
387typedef struct {
388 unsigned int self;
389} i386_thread_cthreadstate_t;
390
91447636
A
391#define i386_THREAD_CTHREADSTATE_COUNT ((mach_msg_type_number_t) \
392 ( sizeof (i386_thread_cthreadstate_t) / sizeof (int) ))
1c79356b
A
393
394#endif /* _MACH_I386_THREAD_STATUS_H_ */