Annotation of XNU/osfmk/mach/i386/thread_status.h, revision 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.