home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
- /*
- * @OSF_COPYRIGHT@
- */
- /*
- * Mach Operating System
- * Copyright (c) 1991,1990,1989 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
- /*
- */
- /*
- * File: thread_status.h
- * Author: Avadis Tevanian, Jr.
- * Date: 1985
- *
- * This file contains the structure definitions for the thread
- * state as applied to I386 processors.
- */
-
- #ifndef _MACH_I386_THREAD_STATUS_H_
- #define _MACH_I386_THREAD_STATUS_H_
-
- #include <mach/i386/fp_reg.h>
- #include <mach/i386/thread_state.h>
- #include <architecture/i386/frame.h> /* FIXME */
- #include <architecture/i386/fpu.h> /* FIXME */
- /*
- * i386_thread_state this is the structure that is exported
- * to user threads for use in status/mutate
- * calls. This structure should never
- * change.
- *
- * i386_float_state exported to use threads for access to
- * floating point registers. Try not to
- * change this one, either.
- *
- * i386_isa_port_map_state exported to user threads to allow
- * selective in/out operations
- *
- * i386_v86_assist_state
- *
- * thread_syscall_state
- */
-
- /* THREAD_STATE_FLAVOR_LIST 0 */
- #define i386_NEW_THREAD_STATE 1 /* used to be i386_THREAD_STATE */
- #define i386_FLOAT_STATE 2
- #define i386_ISA_PORT_MAP_STATE 3
- #define i386_V86_ASSIST_STATE 4
- #define i386_REGS_SEGS_STATE 5
- #define THREAD_SYSCALL_STATE 6
- #define THREAD_STATE_NONE 7
- #define i386_SAVED_STATE 8
-
-
- /*
- * VALID_THREAD_STATE_FLAVOR is a platform specific macro that when passed
- * an exception flavor will return if that is a defined flavor for that
- * platform. The macro must be manually updated to include all of the valid
- * exception flavors as defined above.
- */
- #define VALID_THREAD_STATE_FLAVOR(x) \
- ((x == i386_NEW_THREAD_STATE) || \
- (x == i386_FLOAT_STATE) || \
- (x == i386_ISA_PORT_MAP_STATE) || \
- (x == i386_V86_ASSIST_STATE) || \
- (x == i386_REGS_SEGS_STATE) || \
- (x == THREAD_SYSCALL_STATE) || \
- (x == THREAD_STATE_NONE) || \
- (x == i386_SAVED_STATE))
-
- /*
- * This structure is used for both
- * i386_THREAD_STATE and i386_REGS_SEGS_STATE.
- */
- struct i386_new_thread_state {
- unsigned int gs;
- unsigned int fs;
- unsigned int es;
- unsigned int ds;
- unsigned int edi;
- unsigned int esi;
- unsigned int ebp;
- unsigned int esp;
- unsigned int ebx;
- unsigned int edx;
- unsigned int ecx;
- unsigned int eax;
- unsigned int eip;
- unsigned int cs;
- unsigned int efl;
- unsigned int uesp;
- unsigned int ss;
- };
- #define i386_NEW_THREAD_STATE_COUNT \
- (sizeof (struct i386_new_thread_state)/sizeof(unsigned int))
-
- /*
- * Subset of saved state stored by processor on kernel-to-kernel
- * trap. (Used by ddb to examine state guaranteed to be present
- * on all traps into debugger.)
- */
- struct i386_saved_state_from_kernel {
- unsigned int gs;
- unsigned int fs;
- unsigned int es;
- unsigned int ds;
- unsigned int edi;
- unsigned int esi;
- unsigned int ebp;
- unsigned int esp; /* kernel esp stored by pusha -
- we save cr2 here later */
- unsigned int ebx;
- unsigned int edx;
- unsigned int ecx;
- unsigned int eax;
- unsigned int trapno;
- unsigned int err;
- unsigned int eip;
- unsigned int cs;
- unsigned int efl;
- };
-
- /*
- * The format in which thread state is saved by Mach on this machine. This
- * state flavor is most efficient for exception RPC's to kernel-loaded
- * servers, because copying can be avoided:
- */
- struct i386_saved_state {
- unsigned int gs;
- unsigned int fs;
- unsigned int es;
- unsigned int ds;
- unsigned int edi;
- unsigned int esi;
- unsigned int ebp;
- unsigned int esp; /* kernel esp stored by pusha -
- we save cr2 here later */
- unsigned int ebx;
- unsigned int edx;
- unsigned int ecx;
- unsigned int eax;
- unsigned int trapno;
- unsigned int err;
- unsigned int eip;
- unsigned int cs;
- unsigned int efl;
- unsigned int uesp;
- unsigned int ss;
- struct v86_segs {
- unsigned int v86_es; /* virtual 8086 segment registers */
- unsigned int v86_ds;
- unsigned int v86_fs;
- unsigned int v86_gs;
- } v86_segs;
- #define i386_SAVED_ARGV_COUNT 7
- unsigned int argv_status; /* Boolean flag indicating whether or
- * not Mach copied in the args */
- unsigned int argv[i386_SAVED_ARGV_COUNT];
- /* The return address, and the first several
- * function call args from the stack, for
- * efficient syscall exceptions */
- };
- #define i386_SAVED_STATE_COUNT (sizeof (struct i386_saved_state)/sizeof(unsigned int))
- #define i386_REGS_SEGS_STATE_COUNT i386_SAVED_STATE_COUNT
-
- /*
- * Machine-independent way for servers and Mach's exception mechanism to
- * choose the most efficient state flavor for exception RPC's:
- */
- #define MACHINE_THREAD_STATE i386_SAVED_STATE
- #define MACHINE_THREAD_STATE_COUNT i386_SAVED_STATE_COUNT
-
- /*
- * Largest state on this machine:
- * (be sure mach/machine/thread_state.h matches!)
- */
- #define THREAD_MACHINE_STATE_MAX i386_SAVED_STATE_COUNT
-
- /*
- * Floating point state.
- *
- * fpkind tells in what way floating point operations are supported.
- * See the values for fp_kind in <mach/i386/fp_reg.h>.
- *
- * If the kind is FP_NO, then calls to set the state will fail, and
- * thread_getstatus will return garbage for the rest of the state.
- * If "initialized" is false, then the rest of the state is garbage.
- * Clients can set "initialized" to false to force the coprocessor to
- * be reset.
- * "exc_status" is non-zero if the thread has noticed (but not
- * proceeded from) a coprocessor exception. It contains the status
- * word with the exception bits set. The status word in "fp_status"
- * will have the exception bits turned off. If an exception bit in
- * "fp_status" is turned on, then "exc_status" should be zero. This
- * happens when the coprocessor exception is noticed after the system
- * has context switched to some other thread.
- *
- * If kind is FP_387, then "state" is a i387_state. Other kinds might
- * also use i387_state, but somebody will have to verify it (XXX).
- * Note that the registers are ordered from top-of-stack down, not
- * according to physical register number.
- */
-
- #define FP_STATE_BYTES \
- (sizeof (struct i386_fp_save) + sizeof (struct i386_fp_regs))
-
- struct i386_float_state {
- int fpkind; /* FP_NO..FP_387 (readonly) */
- int initialized;
- unsigned char hw_state[FP_STATE_BYTES]; /* actual "hardware" state */
- int exc_status; /* exception status (readonly) */
- };
- #define i386_FLOAT_STATE_COUNT \
- (sizeof(struct i386_float_state)/sizeof(unsigned int))
-
-
- #define PORT_MAP_BITS 0x400
- struct i386_isa_port_map_state {
- unsigned char pm[PORT_MAP_BITS>>3];
- };
-
- #define i386_ISA_PORT_MAP_STATE_COUNT \
- (sizeof(struct i386_isa_port_map_state)/sizeof(unsigned int))
-
- /*
- * V8086 assist supplies a pointer to an interrupt
- * descriptor table in task space.
- */
- struct i386_v86_assist_state {
- unsigned int int_table; /* interrupt table address */
- int int_count; /* interrupt table size */
- };
-
- struct v86_interrupt_table {
- unsigned int count; /* count of pending interrupts */
- unsigned short mask; /* ignore this interrupt if true */
- unsigned short vec; /* vector to take */
- };
-
- #define i386_V86_ASSIST_STATE_COUNT \
- (sizeof(struct i386_v86_assist_state)/sizeof(unsigned int))
-
- struct thread_syscall_state {
- unsigned eax;
- unsigned edx;
- unsigned efl;
- unsigned eip;
- unsigned esp;
- };
-
- #define i386_THREAD_SYSCALL_STATE_COUNT \
- (sizeof(struct thread_syscall_state) / sizeof(unsigned int))
-
- /*
- * Main thread state consists of
- * general registers, segment registers,
- * eip and eflags.
- */
-
- #define i386_THREAD_STATE -1
-
- typedef struct {
- unsigned int eax;
- unsigned int ebx;
- unsigned int ecx;
- unsigned int edx;
- unsigned int edi;
- unsigned int esi;
- unsigned int ebp;
- unsigned int esp;
- unsigned int ss;
- unsigned int eflags;
- unsigned int eip;
- unsigned int cs;
- unsigned int ds;
- unsigned int es;
- unsigned int fs;
- unsigned int gs;
- } i386_thread_state_t;
-
- #define i386_THREAD_STATE_COUNT \
- ( sizeof (i386_thread_state_t) / sizeof (int) )
-
- /*
- * Default segment register values.
- */
-
- #define USER_CODE_SELECTOR 0x0017
- #define USER_DATA_SELECTOR 0x001f
- #define KERN_CODE_SELECTOR 0x0008
- #define KERN_DATA_SELECTOR 0x0010
-
- /*
- * Thread floating point state
- * includes FPU environment as
- * well as the register stack.
- */
-
- #define i386_THREAD_FPSTATE -2
-
- typedef struct {
- fp_env_t environ;
- fp_stack_t stack;
- } i386_thread_fpstate_t;
-
- #define i386_THREAD_FPSTATE_COUNT \
- ( sizeof (i386_thread_fpstate_t) / sizeof (int) )
-
- /*
- * Extra state that may be
- * useful to exception handlers.
- */
-
- #define i386_THREAD_EXCEPTSTATE -3
-
- typedef struct {
- unsigned int trapno;
- err_code_t err;
- } i386_thread_exceptstate_t;
-
- #define i386_THREAD_EXCEPTSTATE_COUNT \
- ( sizeof (i386_thread_exceptstate_t) / sizeof (int) )
-
- /*
- * Per-thread variable used
- * to store 'self' id for cthreads.
- */
-
- #define i386_THREAD_CTHREADSTATE -4
-
- typedef struct {
- unsigned int self;
- } i386_thread_cthreadstate_t;
-
- #define i386_THREAD_CTHREADSTATE_COUNT \
- ( sizeof (i386_thread_cthreadstate_t) / sizeof (int) )
-
- #endif /* _MACH_I386_THREAD_STATUS_H_ */
-