Annotation of XNU/osfmk/mach/i386/thread_status.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      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
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     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.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: /*
                     26:  * HISTORY
                     27:  * 
                     28:  * Revision 1.2  1998/09/30 21:21:01  wsanchez
                     29:  * Merged in IntelMerge1 (mburg: Intel support)
                     30:  *
                     31:  * Revision 1.1.1.1.6.1  1998/09/30 18:13:59  mburg
                     32:  * Changes for Intel port
                     33:  *
                     34:  * Revision 1.1.1.1  1998/09/22 21:05:31  wsanchez
                     35:  * Import of Mac OS X kernel (~semeria)
                     36:  *
                     37:  * Revision 1.1.1.1  1998/03/07 02:25:47  wsanchez
                     38:  * Import of OSF Mach kernel (~mburg)
                     39:  *
                     40:  * Revision 1.2.8.3  1995/01/06  19:50:41  devrcs
                     41:  *     Fix ri-osc CR880:  Make kdb_trap() check exception frame type before
                     42:  *     trying to copy its contents.
                     43:  *     [1994/12/22  20:39:01  bolinger]
                     44:  *
                     45:  *     mk6 CR668 - 1.3b26 merge
                     46:  *     Add MD file to define size of arrays
                     47:  *     [1994/10/14  03:42:39  dwm]
                     48:  *
                     49:  * Revision 1.2.8.2  1994/09/23  02:37:48  ezf
                     50:  *     change marker to not FREE
                     51:  *     [1994/09/22  21:40:21  ezf]
                     52:  * 
                     53:  * Revision 1.2.8.1  1994/08/07  20:48:59  bolinger
                     54:  *     Merge up to colo_b7.
                     55:  *     [1994/08/01  21:01:28  bolinger]
                     56:  * 
                     57:  * Revision 1.2.6.3  1994/06/25  03:47:11  dwm
                     58:  *     mk6 CR98 - include mach/machine/thread_state.h to
                     59:  *     get new MD THREAD_STATE_MAX
                     60:  *     [1994/06/24  21:54:50  dwm]
                     61:  * 
                     62:  * Revision 1.2.6.2  1994/03/01  01:51:57  condict
                     63:  *     Add fields to i386_saved_state for copying in the user's syscall args.
                     64:  *     This is part of a performance improvement (see exception()).
                     65:  *     [1994/02/28  04:07:12  condict]
                     66:  * 
                     67:  * Revision 1.2.6.1  1994/02/09  22:37:25  condict
                     68:  *     Exported i386_saved_state as a new flavor of state; this is the same
                     69:  *     struct used by kernel to save user state.  Allows avoidance of state
                     70:  *     copying when doing short-circuited RPC to kernel-loaded servers.
                     71:  *     [1994/02/09  22:36:46  condict]
                     72:  * 
                     73:  * Revision 1.2.2.2  1993/06/09  02:40:51  gm
                     74:  *     Added to OSF/1 R1.3 from NMK15.0.
                     75:  *     [1993/06/02  21:16:28  jeffc]
                     76:  * 
                     77:  * Revision 1.2  1993/04/19  16:34:21  devrcs
                     78:  *     ansi C conformance changes
                     79:  *     [1993/02/02  18:56:17  david]
                     80:  * 
                     81:  *     Add syscall exception state.                            [[email protected]]
                     82:  *     [1992/12/23  13:06:03  david]
                     83:  * 
                     84:  * Revision 1.1  1992/09/30  02:30:52  robert
                     85:  *     Initial revision
                     86:  * 
                     87:  * $EndLog$
                     88:  */
                     89: /* CMU_HIST */
                     90: /*
                     91:  * Revision 2.6.3.1  92/03/03  16:21:46  jeffreyh
                     92:  *     Changes from TRUNK
                     93:  *     [92/02/26  11:59:48  jeffreyh]
                     94:  * 
                     95:  * Revision 2.7  92/01/03  20:20:19  dbg
                     96:  *     Add REGS_SEGS flavor to get and set the segment registers.
                     97:  *     Move fp_reg.h to mach/i386.
                     98:  *     [91/10/18            dbg]
                     99:  * 
                    100:  * Revision 2.6  91/07/31  17:52:29  dbg
                    101:  *     Add V86 mode interrupt assist.
                    102:  *     [91/07/30  17:09:37  dbg]
                    103:  * 
                    104:  * Revision 2.5  91/05/14  16:52:33  mrt
                    105:  *     Correcting copyright
                    106:  * 
                    107:  * Revision 2.4  91/02/05  17:32:23  mrt
                    108:  *     Changed to new Mach copyright
                    109:  *     [91/02/01  17:10:12  mrt]
                    110:  * 
                    111:  * Revision 2.3  91/01/08  17:33:44  rpd
                    112:  *     Two new flavors (from 2.5):
                    113:  *       #define i386_FLOAT_STATE      2
                    114:  *             Hacked in not presently used, but someday...
                    115:  *      #define i386_ISA_PORT_MAP_STATE        3
                    116:  *             Used 
                    117:  *     [90/12/20  10:23:34  rvb]
                    118:  * 
                    119:  * Revision 2.2  90/05/03  15:48:05  dbg
                    120:  *     Remove kernel-only definitions.
                    121:  *     [90/02/05            dbg]
                    122:  * 
                    123:  * Revision 1.3  89/03/09  20:19:59  rpd
                    124:  *     More cleanup.
                    125:  * 
                    126:  * Revision 1.2  89/02/26  13:01:07  gm0w
                    127:  *     Changes for cleanup.
                    128:  * 
                    129:  * 24-Feb-89  Robert Baron (rvb) at Carnegie-Mellon University
                    130:  *     May need some work.
                    131:  */
                    132: /* CMU_ENDHIST */
                    133: /* 
                    134:  * Mach Operating System
                    135:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                    136:  * All Rights Reserved.
                    137:  * 
                    138:  * Permission to use, copy, modify and distribute this software and its
                    139:  * documentation is hereby granted, provided that both the copyright
                    140:  * notice and this permission notice appear in all copies of the
                    141:  * software, derivative works or modified versions, and any portions
                    142:  * thereof, and that both notices appear in supporting documentation.
                    143:  * 
                    144:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                    145:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                    146:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                    147:  * 
                    148:  * Carnegie Mellon requests users of this software to return to
                    149:  * 
                    150:  *  Software Distribution Coordinator  or  [email protected]
                    151:  *  School of Computer Science
                    152:  *  Carnegie Mellon University
                    153:  *  Pittsburgh PA 15213-3890
                    154:  * 
                    155:  * any improvements or extensions that they make and grant Carnegie Mellon
                    156:  * the rights to redistribute these changes.
                    157:  */
                    158: /*
                    159:  */
                    160: /*
                    161:  *     File:   thread_status.h
                    162:  *     Author: Avadis Tevanian, Jr.
                    163:  *     Date:   1985
                    164:  *
                    165:  *     This file contains the structure definitions for the thread
                    166:  *     state as applied to I386 processors.
                    167:  */
                    168: 
                    169: #ifndef        _MACH_I386_THREAD_STATUS_H_
                    170: #define _MACH_I386_THREAD_STATUS_H_
                    171: 
                    172: #include <mach/i386/fp_reg.h>
                    173: #include <mach/i386/thread_state.h>
                    174: #include <architecture/i386/frame.h>   /* FIXME */
                    175: #include <architecture/i386/fpu.h>     /* FIXME */
                    176: /*
                    177:  *     i386_thread_state       this is the structure that is exported
                    178:  *                             to user threads for use in status/mutate
                    179:  *                             calls.  This structure should never
                    180:  *                             change.
                    181:  *
                    182:  *     i386_float_state        exported to use threads for access to 
                    183:  *                             floating point registers. Try not to 
                    184:  *                             change this one, either.
                    185:  *
                    186:  *     i386_isa_port_map_state exported to user threads to allow
                    187:  *                             selective in/out operations
                    188:  *
                    189:  *     i386_v86_assist_state 
                    190:  *
                    191:  *     thread_syscall_state 
                    192:  */
                    193: 
                    194: /*     THREAD_STATE_FLAVOR_LIST 0 */
                    195: #define i386_NEW_THREAD_STATE  1       /* used to be i386_THREAD_STATE */
                    196: #define i386_FLOAT_STATE       2
                    197: #define i386_ISA_PORT_MAP_STATE        3
                    198: #define i386_V86_ASSIST_STATE  4
                    199: #define i386_REGS_SEGS_STATE   5
                    200: #define THREAD_SYSCALL_STATE   6
                    201: #define THREAD_STATE_NONE      7
                    202: #define i386_SAVED_STATE       8
                    203: 
                    204: /*
                    205:  * This structure is used for both
                    206:  * i386_THREAD_STATE and i386_REGS_SEGS_STATE.
                    207:  */
                    208: struct i386_new_thread_state {
                    209:        unsigned int    gs;
                    210:        unsigned int    fs;
                    211:        unsigned int    es;
                    212:        unsigned int    ds;
                    213:        unsigned int    edi;
                    214:        unsigned int    esi;
                    215:        unsigned int    ebp;
                    216:        unsigned int    esp;
                    217:        unsigned int    ebx;
                    218:        unsigned int    edx;
                    219:        unsigned int    ecx;
                    220:        unsigned int    eax;
                    221:        unsigned int    eip;
                    222:        unsigned int    cs;
                    223:        unsigned int    efl;
                    224:        unsigned int    uesp;
                    225:        unsigned int    ss;
                    226: };
                    227: #define i386_NEW_THREAD_STATE_COUNT    \
                    228:                (sizeof (struct i386_new_thread_state)/sizeof(unsigned int))
                    229: 
                    230: /*
                    231:  * Subset of saved state stored by processor on kernel-to-kernel
                    232:  * trap.  (Used by ddb to examine state guaranteed to be present
                    233:  * on all traps into debugger.)
                    234:  */
                    235: struct i386_saved_state_from_kernel {
                    236:        unsigned int    gs;
                    237:        unsigned int    fs;
                    238:        unsigned int    es;
                    239:        unsigned int    ds;
                    240:        unsigned int    edi;
                    241:        unsigned int    esi;
                    242:        unsigned int    ebp;
                    243:        unsigned int    esp;            /* kernel esp stored by pusha -
                    244:                                           we save cr2 here later */
                    245:        unsigned int    ebx;
                    246:        unsigned int    edx;
                    247:        unsigned int    ecx;
                    248:        unsigned int    eax;
                    249:        unsigned int    trapno;
                    250:        unsigned int    err;
                    251:        unsigned int    eip;
                    252:        unsigned int    cs;
                    253:        unsigned int    efl;
                    254: };
                    255: 
                    256: /*
                    257:  * The format in which thread state is saved by Mach on this machine.  This
                    258:  * state flavor is most efficient for exception RPC's to kernel-loaded
                    259:  * servers, because copying can be avoided:
                    260:  */
                    261: struct i386_saved_state {
                    262:        unsigned int    gs;
                    263:        unsigned int    fs;
                    264:        unsigned int    es;
                    265:        unsigned int    ds;
                    266:        unsigned int    edi;
                    267:        unsigned int    esi;
                    268:        unsigned int    ebp;
                    269:        unsigned int    esp;            /* kernel esp stored by pusha -
                    270:                                           we save cr2 here later */
                    271:        unsigned int    ebx;
                    272:        unsigned int    edx;
                    273:        unsigned int    ecx;
                    274:        unsigned int    eax;
                    275:        unsigned int    trapno;
                    276:        unsigned int    err;
                    277:        unsigned int    eip;
                    278:        unsigned int    cs;
                    279:        unsigned int    efl;
                    280:        unsigned int    uesp;
                    281:        unsigned int    ss;
                    282:        struct v86_segs {
                    283:            unsigned int v86_es;        /* virtual 8086 segment registers */
                    284:            unsigned int v86_ds;
                    285:            unsigned int v86_fs;
                    286:            unsigned int v86_gs;
                    287:        } v86_segs;
                    288: #define i386_SAVED_ARGV_COUNT  7
                    289:        unsigned int    argv_status;    /* Boolean flag indicating whether or
                    290:                                         * not Mach copied in the args */
                    291:        unsigned int    argv[i386_SAVED_ARGV_COUNT];
                    292:                                        /* The return address, and the first several
                    293:                                         * function call args from the stack, for
                    294:                                         * efficient syscall exceptions */
                    295: };
                    296: #define i386_SAVED_STATE_COUNT (sizeof (struct i386_saved_state)/sizeof(unsigned int))
                    297: #define i386_REGS_SEGS_STATE_COUNT     i386_SAVED_STATE_COUNT
                    298: 
                    299: /*
                    300:  * Machine-independent way for servers and Mach's exception mechanism to
                    301:  * choose the most efficient state flavor for exception RPC's:
                    302:  */
                    303: #define MACHINE_THREAD_STATE           i386_SAVED_STATE
                    304: #define MACHINE_THREAD_STATE_COUNT     i386_SAVED_STATE_COUNT
                    305: 
                    306: /*
                    307:  * Largest state on this machine:
                    308:  * (be sure mach/machine/thread_state.h matches!)
                    309:  */
                    310: #define THREAD_MACHINE_STATE_MAX       i386_SAVED_STATE_COUNT
                    311: 
                    312: /* 
                    313:  * Floating point state.
                    314:  *
                    315:  * fpkind tells in what way floating point operations are supported.  
                    316:  * See the values for fp_kind in <mach/i386/fp_reg.h>.
                    317:  * 
                    318:  * If the kind is FP_NO, then calls to set the state will fail, and 
                    319:  * thread_getstatus will return garbage for the rest of the state.
                    320:  * If "initialized" is false, then the rest of the state is garbage.  
                    321:  * Clients can set "initialized" to false to force the coprocessor to 
                    322:  * be reset.
                    323:  * "exc_status" is non-zero if the thread has noticed (but not 
                    324:  * proceeded from) a coprocessor exception.  It contains the status 
                    325:  * word with the exception bits set.  The status word in "fp_status" 
                    326:  * will have the exception bits turned off.  If an exception bit in 
                    327:  * "fp_status" is turned on, then "exc_status" should be zero.  This 
                    328:  * happens when the coprocessor exception is noticed after the system 
                    329:  * has context switched to some other thread.
                    330:  * 
                    331:  * If kind is FP_387, then "state" is a i387_state.  Other kinds might
                    332:  * also use i387_state, but somebody will have to verify it (XXX).
                    333:  * Note that the registers are ordered from top-of-stack down, not
                    334:  * according to physical register number.
                    335:  */
                    336: 
                    337: #define FP_STATE_BYTES \
                    338:        (sizeof (struct i386_fp_save) + sizeof (struct i386_fp_regs))
                    339: 
                    340: struct i386_float_state {
                    341:        int             fpkind;                 /* FP_NO..FP_387 (readonly) */
                    342:        int             initialized;
                    343:        unsigned char   hw_state[FP_STATE_BYTES]; /* actual "hardware" state */
                    344:        int             exc_status;             /* exception status (readonly) */
                    345: };
                    346: #define i386_FLOAT_STATE_COUNT \
                    347:                (sizeof(struct i386_float_state)/sizeof(unsigned int))
                    348: 
                    349: 
                    350: #define PORT_MAP_BITS 0x400
                    351: struct i386_isa_port_map_state {
                    352:        unsigned char   pm[PORT_MAP_BITS>>3];
                    353: };
                    354: 
                    355: #define i386_ISA_PORT_MAP_STATE_COUNT \
                    356:                (sizeof(struct i386_isa_port_map_state)/sizeof(unsigned int))
                    357: 
                    358: /*
                    359:  * V8086 assist supplies a pointer to an interrupt
                    360:  * descriptor table in task space.
                    361:  */
                    362: struct i386_v86_assist_state {
                    363:        unsigned int    int_table;      /* interrupt table address */
                    364:        int             int_count;      /* interrupt table size */
                    365: };
                    366: 
                    367: struct v86_interrupt_table {
                    368:        unsigned int    count;  /* count of pending interrupts */
                    369:        unsigned short  mask;   /* ignore this interrupt if true */
                    370:        unsigned short  vec;    /* vector to take */
                    371: };
                    372: 
                    373: #define        i386_V86_ASSIST_STATE_COUNT \
                    374:            (sizeof(struct i386_v86_assist_state)/sizeof(unsigned int))
                    375: 
                    376: struct thread_syscall_state {
                    377:        unsigned eax;
                    378:        unsigned edx;
                    379:        unsigned efl;
                    380:        unsigned eip;
                    381:        unsigned esp;
                    382: };
                    383: 
                    384: #define i386_THREAD_SYSCALL_STATE_COUNT \
                    385:                (sizeof(struct thread_syscall_state) / sizeof(unsigned int))
                    386: 
                    387: /*
                    388:  * Main thread state consists of
                    389:  * general registers, segment registers,
                    390:  * eip and eflags.
                    391:  */
                    392: 
                    393: #define i386_THREAD_STATE      -1
                    394: 
                    395: typedef struct {
                    396:     unsigned int       eax;
                    397:     unsigned int       ebx;
                    398:     unsigned int       ecx;
                    399:     unsigned int       edx;
                    400:     unsigned int       edi;
                    401:     unsigned int       esi;
                    402:     unsigned int       ebp;
                    403:     unsigned int       esp;
                    404:     unsigned int       ss;
                    405:     unsigned int       eflags;
                    406:     unsigned int       eip;
                    407:     unsigned int       cs;
                    408:     unsigned int       ds;
                    409:     unsigned int       es;
                    410:     unsigned int       fs;
                    411:     unsigned int       gs;
                    412: } i386_thread_state_t;
                    413: 
                    414: #define i386_THREAD_STATE_COUNT                \
                    415:     ( sizeof (i386_thread_state_t) / sizeof (int) )
                    416: 
                    417: /*
                    418:  * Default segment register values.
                    419:  */
                    420:     
                    421: #define USER_CODE_SELECTOR     0x0017
                    422: #define USER_DATA_SELECTOR     0x001f
                    423: #define KERN_CODE_SELECTOR     0x0008
                    424: #define KERN_DATA_SELECTOR     0x0010
                    425: 
                    426: /*
                    427:  * Thread floating point state
                    428:  * includes FPU environment as
                    429:  * well as the register stack.
                    430:  */
                    431:  
                    432: #define i386_THREAD_FPSTATE    -2
                    433: 
                    434: typedef struct {
                    435:     fp_env_t           environ;
                    436:     fp_stack_t         stack;
                    437: } i386_thread_fpstate_t;
                    438: 
                    439: #define i386_THREAD_FPSTATE_COUNT      \
                    440:     ( sizeof (i386_thread_fpstate_t) / sizeof (int) )
                    441: 
                    442: /*
                    443:  * Extra state that may be
                    444:  * useful to exception handlers.
                    445:  */
                    446: 
                    447: #define i386_THREAD_EXCEPTSTATE        -3
                    448: 
                    449: typedef struct {
                    450:     unsigned int       trapno;
                    451:     err_code_t         err;
                    452: } i386_thread_exceptstate_t;
                    453: 
                    454: #define i386_THREAD_EXCEPTSTATE_COUNT  \
                    455:     ( sizeof (i386_thread_exceptstate_t) / sizeof (int) )
                    456: 
                    457: /*
                    458:  * Per-thread variable used
                    459:  * to store 'self' id for cthreads.
                    460:  */
                    461:  
                    462: #define i386_THREAD_CTHREADSTATE       -4
                    463:  
                    464: typedef struct {
                    465:     unsigned int       self;
                    466: } i386_thread_cthreadstate_t;
                    467: 
                    468: #define i386_THREAD_CTHREADSTATE_COUNT \
                    469:     ( sizeof (i386_thread_cthreadstate_t) / sizeof (int) )
                    470: 
                    471: #endif /* _MACH_I386_THREAD_STATUS_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.