]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/include/segments.h
This is the Linux generic soundcard driver, version 1.0c. Supports
[FreeBSD/FreeBSD.git] / sys / i386 / include / segments.h
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  *      from: @(#)segments.h    7.1 (Berkeley) 5/9/91
38  *      $Id$
39  */
40
41 /*
42  * 386 Segmentation Data Structures and definitions
43  *      William F. Jolitz (william@ernie.berkeley.edu) 6/20/1989
44  */
45
46 /*
47  * Selectors
48  */
49
50 #define ISPL(s) ((s)&3)         /* what is the priority level of a selector */
51 #define SEL_KPL 0               /* kernel priority level */     
52 #define SEL_UPL 3               /* user priority level */       
53 #define ISLDT(s)        ((s)&SEL_LDT)   /* is it local or global */
54 #define SEL_LDT 4               /* local descriptor table */    
55 #define IDXSEL(s)       (((s)>>3) & 0x1fff)             /* index of selector */
56 #define LSEL(s,r)       (((s)<<3) | SEL_LDT | r)        /* a local selector */
57 #define GSEL(s,r)       (((s)<<3) | r)                  /* a global selector */
58
59 /*
60  * Memory and System segment descriptors
61  */
62 struct  segment_descriptor      {
63         unsigned sd_lolimit:16 ;        /* segment extent (lsb) */
64         unsigned sd_lobase:24 ;         /* segment base address (lsb) */
65         unsigned sd_type:5 ;            /* segment type */
66         unsigned sd_dpl:2 ;             /* segment descriptor priority level */
67         unsigned sd_p:1 ;               /* segment descriptor present */
68         unsigned sd_hilimit:4 ;         /* segment extent (msb) */
69         unsigned sd_xx:2 ;              /* unused */
70         unsigned sd_def32:1 ;           /* default 32 vs 16 bit size */
71         unsigned sd_gran:1 ;            /* limit granularity (byte/page units)*/
72         unsigned sd_hibase:8 ;          /* segment base address  (msb) */
73 } ;
74
75 /*
76  * Gate descriptors (e.g. indirect descriptors)
77  */
78 struct  gate_descriptor {
79         unsigned gd_looffset:16 ;       /* gate offset (lsb) */
80         unsigned gd_selector:16 ;       /* gate segment selector */
81         unsigned gd_stkcpy:5 ;          /* number of stack wds to cpy */
82         unsigned gd_xx:3 ;              /* unused */
83         unsigned gd_type:5 ;            /* segment type */
84         unsigned gd_dpl:2 ;             /* segment descriptor priority level */
85         unsigned gd_p:1 ;               /* segment descriptor present */
86         unsigned gd_hioffset:16 ;       /* gate offset (msb) */
87 } ;
88
89 /*
90  * Generic descriptor
91  */
92 union   descriptor      {
93         struct  segment_descriptor sd;
94         struct  gate_descriptor gd;
95 };
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         unsigned rd_base:32;            /* 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
192 /*
193  * Size of IDT table
194  */
195
196 #define NIDT    256
197 #define NRSVIDT 32              /* reserved entries for cpu exceptions */