home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / i386 / include / segments.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-04  |  7.4 KB  |  191 lines

  1. /*-
  2.  * Copyright (c) 1989, 1990 William F. Jolitz
  3.  * Copyright (c) 1990 The Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * William Jolitz.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *    must display the following acknowledgement:
  19.  *    This product includes software developed by the University of
  20.  *    California, Berkeley and its contributors.
  21.  * 4. 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. /*
  46.  * Selectors
  47.  */
  48.  
  49. #define    ISPL(s)    ((s)&3)        /* what is the priority level of a selector */
  50. #define    SEL_KPL    0        /* kernel priority level */    
  51. #define    SEL_UPL    3        /* user priority level */    
  52. #define    ISLDT(s)    ((s)&SEL_LDT)    /* is it local or global */
  53. #define    SEL_LDT    4        /* local descriptor table */    
  54. #define    IDXSEL(s)    (((s)>>3) & 0x1fff)        /* index of selector */
  55. #define    LSEL(s,r)    (((s)<<3) | SEL_LDT | r)    /* a local selector */
  56. #define    GSEL(s,r)    (((s)<<3) | r)            /* a global selector */
  57.  
  58. /*
  59.  * Memory and System segment descriptors
  60.  */
  61. struct    segment_descriptor    {
  62.     unsigned sd_lolimit:16 ;    /* segment extent (lsb) */
  63.     unsigned sd_lobase:24 ;        /* segment base address (lsb) */
  64.     unsigned sd_type:5 ;        /* segment type */
  65.     unsigned sd_dpl:2 ;        /* segment descriptor priority level */
  66.     unsigned sd_p:1 ;        /* segment descriptor present */
  67.     unsigned sd_hilimit:4 ;        /* segment extent (msb) */
  68.     unsigned sd_xx:2 ;        /* unused */
  69.     unsigned sd_def32:1 ;        /* default 32 vs 16 bit size */
  70.     unsigned sd_gran:1 ;        /* limit granularity (byte/page units)*/
  71.     unsigned sd_hibase:8 ;        /* segment base address  (msb) */
  72. } ;
  73.  
  74. /*
  75.  * Gate descriptors (e.g. indirect descriptors)
  76.  */
  77. struct    gate_descriptor    {
  78.     unsigned gd_looffset:16 ;    /* gate offset (lsb) */
  79.     unsigned gd_selector:16 ;    /* gate segment selector */
  80.     unsigned gd_stkcpy:5 ;        /* number of stack wds to cpy */
  81.     unsigned gd_xx:3 ;        /* unused */
  82.     unsigned gd_type:5 ;        /* segment type */
  83.     unsigned gd_dpl:2 ;        /* segment descriptor priority level */
  84.     unsigned gd_p:1 ;        /* segment descriptor present */
  85.     unsigned gd_hioffset:16 ;    /* gate offset (msb) */
  86. } ;
  87.  
  88. /*
  89.  * Generic descriptor
  90.  */
  91. union    descriptor    {
  92.     struct    segment_descriptor sd;
  93.     struct    gate_descriptor gd;
  94. };
  95. #define    d_type    gd.gd_type
  96.  
  97.     /* system segments and gate types */
  98. #define    SDT_SYSNULL     0    /* system null */
  99. #define    SDT_SYS286TSS     1    /* system 286 TSS available */
  100. #define    SDT_SYSLDT     2    /* system local descriptor table */
  101. #define    SDT_SYS286BSY     3    /* system 286 TSS busy */
  102. #define    SDT_SYS286CGT     4    /* system 286 call gate */
  103. #define    SDT_SYSTASKGT     5    /* system task gate */
  104. #define    SDT_SYS286IGT     6    /* system 286 interrupt gate */
  105. #define    SDT_SYS286TGT     7    /* system 286 trap gate */
  106. #define    SDT_SYSNULL2     8    /* system null again */
  107. #define    SDT_SYS386TSS     9    /* system 386 TSS available */
  108. #define    SDT_SYSNULL3    10    /* system null again */
  109. #define    SDT_SYS386BSY    11    /* system 386 TSS busy */
  110. #define    SDT_SYS386CGT    12    /* system 386 call gate */
  111. #define    SDT_SYSNULL4    13    /* system null again */
  112. #define    SDT_SYS386IGT    14    /* system 386 interrupt gate */
  113. #define    SDT_SYS386TGT    15    /* system 386 trap gate */
  114.  
  115.     /* memory segment types */
  116. #define    SDT_MEMRO    16    /* memory read only */
  117. #define    SDT_MEMROA    17    /* memory read only accessed */
  118. #define    SDT_MEMRW    18    /* memory read write */
  119. #define    SDT_MEMRWA    19    /* memory read write accessed */
  120. #define    SDT_MEMROD    20    /* memory read only expand dwn limit */
  121. #define    SDT_MEMRODA    21    /* memory read only expand dwn limit accessed */
  122. #define    SDT_MEMRWD    22    /* memory read write expand dwn limit */
  123. #define    SDT_MEMRWDA    23    /* memory read write expand dwn limit acessed */
  124. #define    SDT_MEME    24    /* memory execute only */
  125. #define    SDT_MEMEA    25    /* memory execute only accessed */
  126. #define    SDT_MEMER    26    /* memory execute read */
  127. #define    SDT_MEMERA    27    /* memory execute read accessed */
  128. #define    SDT_MEMEC    28    /* memory execute only conforming */
  129. #define    SDT_MEMEAC    29    /* memory execute only accessed conforming */
  130. #define    SDT_MEMERC    30    /* memory execute read conforming */
  131. #define    SDT_MEMERAC    31    /* memory execute read accessed conforming */
  132.  
  133. /* is memory segment descriptor pointer ? */
  134. #define ISMEMSDP(s)    ((s->d_type) >= SDT_MEMRO && (s->d_type) <= SDT_MEMERAC)
  135.  
  136. /* is 286 gate descriptor pointer ? */
  137. #define IS286GDP(s)    (((s->d_type) >= SDT_SYS286CGT \
  138.                  && (s->d_type) < SDT_SYS286TGT))
  139.  
  140. /* is 386 gate descriptor pointer ? */
  141. #define IS386GDP(s)    (((s->d_type) >= SDT_SYS386CGT \
  142.                 && (s->d_type) < SDT_SYS386TGT))
  143.  
  144. /* is gate descriptor pointer ? */
  145. #define ISGDP(s)    (IS286GDP(s) || IS386GDP(s))
  146.  
  147. /* is segment descriptor pointer ? */
  148. #define ISSDP(s)    (ISMEMSDP(s) || !ISGDP(s))
  149.  
  150. /* is system segment descriptor pointer ? */
  151. #define ISSYSSDP(s)    (!ISMEMSDP(s) && !ISGDP(s))
  152.  
  153. /*
  154.  * Software definitions are in this convenient format,
  155.  * which are translated into inconvenient segment descriptors
  156.  * when needed to be used by the 386 hardware
  157.  */
  158.  
  159. struct    soft_segment_descriptor    {
  160.     unsigned ssd_base ;        /* segment base address  */
  161.     unsigned ssd_limit ;        /* segment extent */
  162.     unsigned ssd_type:5 ;        /* segment type */
  163.     unsigned ssd_dpl:2 ;        /* segment descriptor priority level */
  164.     unsigned ssd_p:1 ;        /* segment descriptor present */
  165.     unsigned ssd_xx:4 ;        /* unused */
  166.     unsigned ssd_xx1:2 ;        /* unused */
  167.     unsigned ssd_def32:1 ;        /* default 32 vs 16 bit size */
  168.     unsigned ssd_gran:1 ;        /* limit granularity (byte/page units)*/
  169. };
  170.  
  171. extern ssdtosd() ;    /* to decode a ssd */
  172. extern sdtossd() ;    /* to encode a sd */
  173.  
  174. /*
  175.  * region descriptors, used to load gdt/idt tables before segments yet exist
  176.  */
  177. struct region_descriptor {
  178.     unsigned rd_limit:16 ;        /* segment extent */
  179.     char *rd_base;            /* base address  */
  180. };
  181.  
  182. /*
  183.  * Segment Protection Exception code bits
  184.  */
  185.  
  186. #define    SEGEX_EXT    0x01    /* recursive or externally induced */
  187. #define    SEGEX_IDT    0x02    /* interrupt descriptor table */
  188. #define    SEGEX_TI    0x04    /* local descriptor table */
  189.                 /* other bits are affected descriptor index */
  190. #define SEGEX_IDX(s)    ((s)>>3)&0x1fff)
  191.