[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

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