|
|
1.1 ! root 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 ([email protected]) 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)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.