[BACK]Return to segments.h CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / include

Annotation of sys/arch/i386/include/segments.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: segments.h,v 1.14 2006/01/12 22:39:21 weingart Exp $  */
        !             2: /*     $NetBSD: segments.h,v 1.23 1996/02/01 22:31:03 mycroft Exp $    */
        !             3:
        !             4: /*-
        !             5:  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
        !             6:  * Copyright (c) 1989, 1990 William F. Jolitz
        !             7:  * Copyright (c) 1990 The Regents of the University of California.
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * This code is derived from software contributed to Berkeley by
        !            11:  * William Jolitz.
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that the following conditions
        !            15:  * are met:
        !            16:  * 1. Redistributions of source code must retain the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer.
        !            18:  * 2. Redistributions in binary form must reproduce the above copyright
        !            19:  *    notice, this list of conditions and the following disclaimer in the
        !            20:  *    documentation and/or other materials provided with the distribution.
        !            21:  * 3. Neither the name of the University nor the names of its contributors
        !            22:  *    may be used to endorse or promote products derived from this software
        !            23:  *    without specific prior written permission.
        !            24:  *
        !            25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            35:  * SUCH DAMAGE.
        !            36:  *
        !            37:  *     @(#)segments.h  7.1 (Berkeley) 5/9/91
        !            38:  */
        !            39:
        !            40: /*
        !            41:  * 386 Segmentation Data Structures and definitions
        !            42:  *     William F. Jolitz (william@ernie.berkeley.edu) 6/20/1989
        !            43:  */
        !            44:
        !            45: #ifndef _I386_SEGMENTS_H_
        !            46: #define _I386_SEGMENTS_H_
        !            47:
        !            48: /*
        !            49:  * Selectors
        !            50:  */
        !            51:
        !            52: #define        ISPL(s)         ((s) & SEL_RPL) /* what is the priority level of a selector */
        !            53: #define        SEL_KPL         0               /* kernel privilege level */
        !            54: #define        SEL_UPL         3               /* user privilege level */
        !            55: #define        SEL_RPL         3               /* requester's privilege level mask */
        !            56: #define        ISLDT(s)        ((s) & SEL_LDT) /* is it local or global */
        !            57: #define        SEL_LDT         4               /* local descriptor table */
        !            58: #define        IDXSEL(s)       (((s) >> 3) & 0x1fff)           /* index of selector */
        !            59: #define        GSEL(s,r)       (((s) << 3) | r)                /* a global selector */
        !            60: #define        LSEL(s,r)       (((s) << 3) | r | SEL_LDT)      /* a local selector */
        !            61:
        !            62: #ifdef VM86
        !            63: #define        USERMODE(c, f)          (ISPL(c) == SEL_UPL || ((f) & PSL_VM) != 0)
        !            64: #define        KERNELMODE(c, f)        (ISPL(c) == SEL_KPL && ((f) & PSL_VM) == 0)
        !            65: #else
        !            66: #define        USERMODE(c, f)          (ISPL(c) == SEL_UPL)
        !            67: #define        KERNELMODE(c, f)        (ISPL(c) == SEL_KPL)
        !            68: #endif
        !            69:
        !            70: #ifndef _LOCORE
        !            71:
        !            72: #if __GNUC__ == 2 && __GNUC_MINOR__ < 7
        !            73: #pragma pack(1)
        !            74: #endif
        !            75:
        !            76: /*
        !            77:  * Memory and System segment descriptors
        !            78:  */
        !            79: struct segment_descriptor {
        !            80:        unsigned sd_lolimit:16;         /* segment extent (lsb) */
        !            81:        unsigned sd_lobase:24;          /* segment base address (lsb) */
        !            82:        unsigned sd_type:5;             /* segment type */
        !            83:        unsigned sd_dpl:2;              /* segment descriptor priority level */
        !            84:        unsigned sd_p:1;                /* segment descriptor present */
        !            85:        unsigned sd_hilimit:4;          /* segment extent (msb) */
        !            86:        unsigned sd_xx:2;               /* unused */
        !            87:        unsigned sd_def32:1;            /* default 32 vs 16 bit size */
        !            88:        unsigned sd_gran:1;             /* limit granularity (byte/page) */
        !            89:        unsigned sd_hibase:8;           /* segment base address (msb) */
        !            90: } __packed;
        !            91:
        !            92: /*
        !            93:  * Gate descriptors (e.g. indirect descriptors)
        !            94:  */
        !            95: struct gate_descriptor {
        !            96:        unsigned gd_looffset:16;        /* gate offset (lsb) */
        !            97:        unsigned gd_selector:16;        /* gate segment selector */
        !            98:        unsigned gd_stkcpy:5;           /* number of stack wds to cpy */
        !            99:        unsigned gd_xx:3;               /* unused */
        !           100:        unsigned gd_type:5;             /* segment type */
        !           101:        unsigned gd_dpl:2;              /* segment descriptor priority level */
        !           102:        unsigned gd_p:1;                /* segment descriptor present */
        !           103:        unsigned gd_hioffset:16;        /* gate offset (msb) */
        !           104: } __packed;
        !           105:
        !           106: /*
        !           107:  * Generic descriptor
        !           108:  */
        !           109: union descriptor {
        !           110:        struct segment_descriptor sd;
        !           111:        struct gate_descriptor gd;
        !           112: } __packed;
        !           113:
        !           114: /*
        !           115:  * region descriptors, used to load gdt/idt tables before segments yet exist.
        !           116:  */
        !           117: struct region_descriptor {
        !           118:        unsigned rd_limit:16;           /* segment extent */
        !           119:        unsigned rd_base:32;            /* base address  */
        !           120: } __packed;
        !           121:
        !           122: #if __GNUC__ == 2 && __GNUC_MINOR__ < 7
        !           123: #pragma pack(4)
        !           124: #endif
        !           125:
        !           126: #ifdef _KERNEL
        !           127: extern union descriptor *gdt, ldt[];
        !           128: extern struct gate_descriptor idt_region[];
        !           129: extern struct gate_descriptor *idt;
        !           130:
        !           131: void setgate(struct gate_descriptor *, void *, int, int, int, int);
        !           132: void setregion(struct region_descriptor *, void *, size_t);
        !           133: void setsegment(struct segment_descriptor *, void *, size_t, int, int,
        !           134:     int, int);
        !           135: void unsetgate(struct gate_descriptor *);
        !           136: void cpu_init_idt(void);
        !           137: void cpu_default_ldt(struct cpu_info *);
        !           138: void cpu_alloc_ldt(struct cpu_info *);
        !           139: void cpu_init_ldt(struct cpu_info *);
        !           140:
        !           141: int idt_vec_alloc(int, int);
        !           142: void idt_vec_set(int, void (*)(void));
        !           143: void idt_vec_free(int);
        !           144:
        !           145: #endif /* _KERNEL */
        !           146:
        !           147: #endif /* !_LOCORE */
        !           148:
        !           149: /* system segments and gate types */
        !           150: #define        SDT_SYSNULL      0      /* system null */
        !           151: #define        SDT_SYS286TSS    1      /* system 286 TSS available */
        !           152: #define        SDT_SYSLDT       2      /* system local descriptor table */
        !           153: #define        SDT_SYS286BSY    3      /* system 286 TSS busy */
        !           154: #define        SDT_SYS286CGT    4      /* system 286 call gate */
        !           155: #define        SDT_SYSTASKGT    5      /* system task gate */
        !           156: #define        SDT_SYS286IGT    6      /* system 286 interrupt gate */
        !           157: #define        SDT_SYS286TGT    7      /* system 286 trap gate */
        !           158: #define        SDT_SYSNULL2     8      /* system null again */
        !           159: #define        SDT_SYS386TSS    9      /* system 386 TSS available */
        !           160: #define        SDT_SYSNULL3    10      /* system null again */
        !           161: #define        SDT_SYS386BSY   11      /* system 386 TSS busy */
        !           162: #define        SDT_SYS386CGT   12      /* system 386 call gate */
        !           163: #define        SDT_SYSNULL4    13      /* system null again */
        !           164: #define        SDT_SYS386IGT   14      /* system 386 interrupt gate */
        !           165: #define        SDT_SYS386TGT   15      /* system 386 trap gate */
        !           166:
        !           167: /* memory segment types */
        !           168: #define        SDT_MEMRO       16      /* memory read only */
        !           169: #define        SDT_MEMROA      17      /* memory read only accessed */
        !           170: #define        SDT_MEMRW       18      /* memory read write */
        !           171: #define        SDT_MEMRWA      19      /* memory read write accessed */
        !           172: #define        SDT_MEMROD      20      /* memory read only expand dwn limit */
        !           173: #define        SDT_MEMRODA     21      /* memory read only expand dwn limit accessed */
        !           174: #define        SDT_MEMRWD      22      /* memory read write expand dwn limit */
        !           175: #define        SDT_MEMRWDA     23      /* memory read write expand dwn limit acessed */
        !           176: #define        SDT_MEME        24      /* memory execute only */
        !           177: #define        SDT_MEMEA       25      /* memory execute only accessed */
        !           178: #define        SDT_MEMER       26      /* memory execute read */
        !           179: #define        SDT_MEMERA      27      /* memory execute read accessed */
        !           180: #define        SDT_MEMEC       28      /* memory execute only conforming */
        !           181: #define        SDT_MEMEAC      29      /* memory execute only accessed conforming */
        !           182: #define        SDT_MEMERC      30      /* memory execute read conforming */
        !           183: #define        SDT_MEMERAC     31      /* memory execute read accessed conforming */
        !           184:
        !           185: /* is memory segment descriptor pointer ? */
        !           186: #define ISMEMSDP(s)    ((s->d_type) >= SDT_MEMRO && \
        !           187:                         (s->d_type) <= SDT_MEMERAC)
        !           188:
        !           189: /* is 286 gate descriptor pointer ? */
        !           190: #define IS286GDP(s)    ((s->d_type) >= SDT_SYS286CGT && \
        !           191:                         (s->d_type) < SDT_SYS286TGT)
        !           192:
        !           193: /* is 386 gate descriptor pointer ? */
        !           194: #define IS386GDP(s)    ((s->d_type) >= SDT_SYS386CGT && \
        !           195:                         (s->d_type) < SDT_SYS386TGT)
        !           196:
        !           197: /* is gate descriptor pointer ? */
        !           198: #define ISGDP(s)       (IS286GDP(s) || IS386GDP(s))
        !           199:
        !           200: /* is segment descriptor pointer ? */
        !           201: #define ISSDP(s)       (ISMEMSDP(s) || !ISGDP(s))
        !           202:
        !           203: /* is system segment descriptor pointer ? */
        !           204: #define ISSYSSDP(s)    (!ISMEMSDP(s) && !ISGDP(s))
        !           205:
        !           206: /*
        !           207:  * Segment Protection Exception code bits
        !           208:  */
        !           209: #define        SEGEX_EXT       0x01    /* recursive or externally induced */
        !           210: #define        SEGEX_IDT       0x02    /* interrupt descriptor table */
        !           211: #define        SEGEX_TI        0x04    /* local descriptor table */
        !           212:
        !           213: /*
        !           214:  * Entries in the Interrupt Descriptor Table (IDT)
        !           215:  */
        !           216: #define        NIDT    256
        !           217: #define        NRSVIDT 32              /* reserved entries for cpu exceptions */
        !           218:
        !           219: /*
        !           220:  * Entries in the Global Descriptor Table (GDT)
        !           221:  */
        !           222: #define        GNULL_SEL       0       /* Null descriptor */
        !           223: #define        GCODE_SEL       1       /* Kernel code descriptor */
        !           224: #define        GDATA_SEL       2       /* Kernel data descriptor */
        !           225: #define        GLDT_SEL        3       /* Default LDT descriptor */
        !           226: #define        GUCODE1_SEL     4       /* User code descriptor */
        !           227: #define        GUCODE_SEL      5       /* User code descriptor (a stack short) */
        !           228: #define        GUDATA_SEL      6       /* User data descriptor */
        !           229: #define        GAPM32CODE_SEL  7       /* 32 bit APM code descriptor */
        !           230: #define        GAPM16CODE_SEL  8       /* 16 bit APM code descriptor */
        !           231: #define        GAPMDATA_SEL    9       /* APM data descriptor */
        !           232: #define        GICODE_SEL      10      /* Interrupt code descriptor (same as Kernel code) */
        !           233: #define GCPU_SEL       11      /* per-CPU segment */
        !           234: #define        NGDT            12
        !           235:
        !           236: /*
        !           237:  * Entries in the Local Descriptor Table (LDT)
        !           238:  */
        !           239: #define        LSYS5CALLS_SEL  0       /* iBCS system call gate */
        !           240: #define        LSYS5SIGR_SEL   1       /* iBCS sigreturn gate */
        !           241: #define        LUCODE1_SEL     2       /* User code descriptor */
        !           242: #define        LUCODE_SEL      3       /* User code descriptor (a stack short) */
        !           243: #define        LUDATA_SEL      4       /* User data descriptor */
        !           244: #define        LBSDICALLS_SEL  16      /* BSDI system call gate */
        !           245: #define        NLDT            17
        !           246:
        !           247: #endif /* _I386_SEGMENTS_H_ */

CVSweb