]>
Commit | Line | Data |
---|---|---|
1c79356b A |
1 | /* |
2 | * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
de355530 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. | |
11 | * | |
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, | |
de355530 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 | ||
64 | #include <mach/i386/fp_reg.h> | |
65 | #include <mach/i386/thread_state.h> | |
66 | #include <architecture/i386/frame.h> /* FIXME */ | |
67 | #include <architecture/i386/fpu.h> /* FIXME */ | |
68 | /* | |
69 | * i386_thread_state this is the structure that is exported | |
70 | * to user threads for use in status/mutate | |
71 | * calls. This structure should never | |
72 | * change. | |
73 | * | |
74 | * i386_float_state exported to use threads for access to | |
75 | * floating point registers. Try not to | |
76 | * change this one, either. | |
77 | * | |
78 | * i386_isa_port_map_state exported to user threads to allow | |
79 | * selective in/out operations | |
80 | * | |
81 | * i386_v86_assist_state | |
82 | * | |
83 | * thread_syscall_state | |
84 | */ | |
85 | ||
86 | /* THREAD_STATE_FLAVOR_LIST 0 */ | |
87 | #define i386_NEW_THREAD_STATE 1 /* used to be i386_THREAD_STATE */ | |
88 | #define i386_FLOAT_STATE 2 | |
89 | #define i386_ISA_PORT_MAP_STATE 3 | |
90 | #define i386_V86_ASSIST_STATE 4 | |
91 | #define i386_REGS_SEGS_STATE 5 | |
92 | #define THREAD_SYSCALL_STATE 6 | |
93 | #define THREAD_STATE_NONE 7 | |
94 | #define i386_SAVED_STATE 8 | |
95 | ||
96 | ||
97 | /* | |
98 | * VALID_THREAD_STATE_FLAVOR is a platform specific macro that when passed | |
99 | * an exception flavor will return if that is a defined flavor for that | |
100 | * platform. The macro must be manually updated to include all of the valid | |
101 | * exception flavors as defined above. | |
102 | */ | |
103 | #define VALID_THREAD_STATE_FLAVOR(x) \ | |
104 | ((x == i386_NEW_THREAD_STATE) || \ | |
105 | (x == i386_FLOAT_STATE) || \ | |
106 | (x == i386_ISA_PORT_MAP_STATE) || \ | |
107 | (x == i386_V86_ASSIST_STATE) || \ | |
108 | (x == i386_REGS_SEGS_STATE) || \ | |
109 | (x == THREAD_SYSCALL_STATE) || \ | |
110 | (x == THREAD_STATE_NONE) || \ | |
111 | (x == i386_SAVED_STATE)) | |
112 | ||
113 | /* | |
114 | * This structure is used for both | |
115 | * i386_THREAD_STATE and i386_REGS_SEGS_STATE. | |
116 | */ | |
117 | struct i386_new_thread_state { | |
118 | unsigned int gs; | |
119 | unsigned int fs; | |
120 | unsigned int es; | |
121 | unsigned int ds; | |
122 | unsigned int edi; | |
123 | unsigned int esi; | |
124 | unsigned int ebp; | |
125 | unsigned int esp; | |
126 | unsigned int ebx; | |
127 | unsigned int edx; | |
128 | unsigned int ecx; | |
129 | unsigned int eax; | |
130 | unsigned int eip; | |
131 | unsigned int cs; | |
132 | unsigned int efl; | |
133 | unsigned int uesp; | |
134 | unsigned int ss; | |
135 | }; | |
136 | #define i386_NEW_THREAD_STATE_COUNT \ | |
137 | (sizeof (struct i386_new_thread_state)/sizeof(unsigned int)) | |
138 | ||
139 | /* | |
140 | * Subset of saved state stored by processor on kernel-to-kernel | |
141 | * trap. (Used by ddb to examine state guaranteed to be present | |
142 | * on all traps into debugger.) | |
143 | */ | |
144 | struct i386_saved_state_from_kernel { | |
145 | unsigned int gs; | |
146 | unsigned int fs; | |
147 | unsigned int es; | |
148 | unsigned int ds; | |
149 | unsigned int edi; | |
150 | unsigned int esi; | |
151 | unsigned int ebp; | |
152 | unsigned int esp; /* kernel esp stored by pusha - | |
153 | we save cr2 here later */ | |
154 | unsigned int ebx; | |
155 | unsigned int edx; | |
156 | unsigned int ecx; | |
157 | unsigned int eax; | |
158 | unsigned int trapno; | |
159 | unsigned int err; | |
160 | unsigned int eip; | |
161 | unsigned int cs; | |
162 | unsigned int efl; | |
163 | }; | |
164 | ||
165 | /* | |
166 | * The format in which thread state is saved by Mach on this machine. This | |
167 | * state flavor is most efficient for exception RPC's to kernel-loaded | |
168 | * servers, because copying can be avoided: | |
169 | */ | |
170 | struct i386_saved_state { | |
171 | unsigned int gs; | |
172 | unsigned int fs; | |
173 | unsigned int es; | |
174 | unsigned int ds; | |
175 | unsigned int edi; | |
176 | unsigned int esi; | |
177 | unsigned int ebp; | |
178 | unsigned int esp; /* kernel esp stored by pusha - | |
179 | we save cr2 here later */ | |
180 | unsigned int ebx; | |
181 | unsigned int edx; | |
182 | unsigned int ecx; | |
183 | unsigned int eax; | |
184 | unsigned int trapno; | |
185 | unsigned int err; | |
186 | unsigned int eip; | |
187 | unsigned int cs; | |
188 | unsigned int efl; | |
189 | unsigned int uesp; | |
190 | unsigned int ss; | |
191 | struct v86_segs { | |
192 | unsigned int v86_es; /* virtual 8086 segment registers */ | |
193 | unsigned int v86_ds; | |
194 | unsigned int v86_fs; | |
195 | unsigned int v86_gs; | |
196 | } v86_segs; | |
197 | #define i386_SAVED_ARGV_COUNT 7 | |
198 | unsigned int argv_status; /* Boolean flag indicating whether or | |
199 | * not Mach copied in the args */ | |
200 | unsigned int argv[i386_SAVED_ARGV_COUNT]; | |
201 | /* The return address, and the first several | |
202 | * function call args from the stack, for | |
203 | * efficient syscall exceptions */ | |
204 | }; | |
205 | #define i386_SAVED_STATE_COUNT (sizeof (struct i386_saved_state)/sizeof(unsigned int)) | |
206 | #define i386_REGS_SEGS_STATE_COUNT i386_SAVED_STATE_COUNT | |
207 | ||
208 | /* | |
209 | * Machine-independent way for servers and Mach's exception mechanism to | |
210 | * choose the most efficient state flavor for exception RPC's: | |
211 | */ | |
212 | #define MACHINE_THREAD_STATE i386_SAVED_STATE | |
213 | #define MACHINE_THREAD_STATE_COUNT i386_SAVED_STATE_COUNT | |
214 | ||
215 | /* | |
216 | * Largest state on this machine: | |
217 | * (be sure mach/machine/thread_state.h matches!) | |
218 | */ | |
219 | #define THREAD_MACHINE_STATE_MAX i386_SAVED_STATE_COUNT | |
220 | ||
221 | /* | |
222 | * Floating point state. | |
223 | * | |
224 | * fpkind tells in what way floating point operations are supported. | |
225 | * See the values for fp_kind in <mach/i386/fp_reg.h>. | |
226 | * | |
227 | * If the kind is FP_NO, then calls to set the state will fail, and | |
228 | * thread_getstatus will return garbage for the rest of the state. | |
229 | * If "initialized" is false, then the rest of the state is garbage. | |
230 | * Clients can set "initialized" to false to force the coprocessor to | |
231 | * be reset. | |
232 | * "exc_status" is non-zero if the thread has noticed (but not | |
233 | * proceeded from) a coprocessor exception. It contains the status | |
234 | * word with the exception bits set. The status word in "fp_status" | |
235 | * will have the exception bits turned off. If an exception bit in | |
236 | * "fp_status" is turned on, then "exc_status" should be zero. This | |
237 | * happens when the coprocessor exception is noticed after the system | |
238 | * has context switched to some other thread. | |
239 | * | |
240 | * If kind is FP_387, then "state" is a i387_state. Other kinds might | |
241 | * also use i387_state, but somebody will have to verify it (XXX). | |
242 | * Note that the registers are ordered from top-of-stack down, not | |
243 | * according to physical register number. | |
244 | */ | |
245 | ||
246 | #define FP_STATE_BYTES \ | |
247 | (sizeof (struct i386_fp_save) + sizeof (struct i386_fp_regs)) | |
248 | ||
249 | struct i386_float_state { | |
250 | int fpkind; /* FP_NO..FP_387 (readonly) */ | |
251 | int initialized; | |
252 | unsigned char hw_state[FP_STATE_BYTES]; /* actual "hardware" state */ | |
253 | int exc_status; /* exception status (readonly) */ | |
254 | }; | |
255 | #define i386_FLOAT_STATE_COUNT \ | |
256 | (sizeof(struct i386_float_state)/sizeof(unsigned int)) | |
257 | ||
258 | ||
259 | #define PORT_MAP_BITS 0x400 | |
260 | struct i386_isa_port_map_state { | |
261 | unsigned char pm[PORT_MAP_BITS>>3]; | |
262 | }; | |
263 | ||
264 | #define i386_ISA_PORT_MAP_STATE_COUNT \ | |
265 | (sizeof(struct i386_isa_port_map_state)/sizeof(unsigned int)) | |
266 | ||
267 | /* | |
268 | * V8086 assist supplies a pointer to an interrupt | |
269 | * descriptor table in task space. | |
270 | */ | |
271 | struct i386_v86_assist_state { | |
272 | unsigned int int_table; /* interrupt table address */ | |
273 | int int_count; /* interrupt table size */ | |
274 | }; | |
275 | ||
276 | struct v86_interrupt_table { | |
277 | unsigned int count; /* count of pending interrupts */ | |
278 | unsigned short mask; /* ignore this interrupt if true */ | |
279 | unsigned short vec; /* vector to take */ | |
280 | }; | |
281 | ||
282 | #define i386_V86_ASSIST_STATE_COUNT \ | |
283 | (sizeof(struct i386_v86_assist_state)/sizeof(unsigned int)) | |
284 | ||
285 | struct thread_syscall_state { | |
286 | unsigned eax; | |
287 | unsigned edx; | |
288 | unsigned efl; | |
289 | unsigned eip; | |
290 | unsigned esp; | |
291 | }; | |
292 | ||
293 | #define i386_THREAD_SYSCALL_STATE_COUNT \ | |
294 | (sizeof(struct thread_syscall_state) / sizeof(unsigned int)) | |
295 | ||
296 | /* | |
297 | * Main thread state consists of | |
298 | * general registers, segment registers, | |
299 | * eip and eflags. | |
300 | */ | |
301 | ||
302 | #define i386_THREAD_STATE -1 | |
303 | ||
304 | typedef struct { | |
305 | unsigned int eax; | |
306 | unsigned int ebx; | |
307 | unsigned int ecx; | |
308 | unsigned int edx; | |
309 | unsigned int edi; | |
310 | unsigned int esi; | |
311 | unsigned int ebp; | |
312 | unsigned int esp; | |
313 | unsigned int ss; | |
314 | unsigned int eflags; | |
315 | unsigned int eip; | |
316 | unsigned int cs; | |
317 | unsigned int ds; | |
318 | unsigned int es; | |
319 | unsigned int fs; | |
320 | unsigned int gs; | |
321 | } i386_thread_state_t; | |
322 | ||
323 | #define i386_THREAD_STATE_COUNT \ | |
324 | ( sizeof (i386_thread_state_t) / sizeof (int) ) | |
325 | ||
326 | /* | |
327 | * Default segment register values. | |
328 | */ | |
329 | ||
330 | #define USER_CODE_SELECTOR 0x0017 | |
331 | #define USER_DATA_SELECTOR 0x001f | |
332 | #define KERN_CODE_SELECTOR 0x0008 | |
333 | #define KERN_DATA_SELECTOR 0x0010 | |
334 | ||
335 | /* | |
336 | * Thread floating point state | |
337 | * includes FPU environment as | |
338 | * well as the register stack. | |
339 | */ | |
340 | ||
341 | #define i386_THREAD_FPSTATE -2 | |
342 | ||
343 | typedef struct { | |
344 | fp_env_t environ; | |
345 | fp_stack_t stack; | |
346 | } i386_thread_fpstate_t; | |
347 | ||
348 | #define i386_THREAD_FPSTATE_COUNT \ | |
349 | ( sizeof (i386_thread_fpstate_t) / sizeof (int) ) | |
350 | ||
351 | /* | |
352 | * Extra state that may be | |
353 | * useful to exception handlers. | |
354 | */ | |
355 | ||
356 | #define i386_THREAD_EXCEPTSTATE -3 | |
357 | ||
358 | typedef struct { | |
359 | unsigned int trapno; | |
360 | err_code_t err; | |
361 | } i386_thread_exceptstate_t; | |
362 | ||
363 | #define i386_THREAD_EXCEPTSTATE_COUNT \ | |
364 | ( sizeof (i386_thread_exceptstate_t) / sizeof (int) ) | |
365 | ||
366 | /* | |
367 | * Per-thread variable used | |
368 | * to store 'self' id for cthreads. | |
369 | */ | |
370 | ||
371 | #define i386_THREAD_CTHREADSTATE -4 | |
372 | ||
373 | typedef struct { | |
374 | unsigned int self; | |
375 | } i386_thread_cthreadstate_t; | |
376 | ||
377 | #define i386_THREAD_CTHREADSTATE_COUNT \ | |
378 | ( sizeof (i386_thread_cthreadstate_t) / sizeof (int) ) | |
379 | ||
380 | #endif /* _MACH_I386_THREAD_STATUS_H_ */ |