root/arch/i386/include/segments.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    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_ */

/* [<][>][^][v][top][bottom][index][help] */