Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / i386 / segments.h @ 13

History | View | Annotate | Download (12.5 KB)

1 13 up20180614
/*        $NetBSD: segments.h,v 1.54 2011/04/26 15:51:23 joerg Exp $        */
2
3
/*-
4
 * Copyright (c) 1990 The Regents of the University of California.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to Berkeley by
8
 * William Jolitz.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. Neither the name of the University nor the names of its contributors
19
 *    may be used to endorse or promote products derived from this software
20
 *    without specific prior written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
 * SUCH DAMAGE.
33
 *
34
 *        @(#)segments.h        7.1 (Berkeley) 5/9/91
35
 */
36
37
/*-
38
 * Copyright (c) 1995, 1997
39
 *        Charles M. Hannum.  All rights reserved.
40
 * Copyright (c) 1989, 1990 William F. Jolitz
41
 *
42
 * This code is derived from software contributed to Berkeley by
43
 * William Jolitz.
44
 *
45
 * Redistribution and use in source and binary forms, with or without
46
 * modification, are permitted provided that the following conditions
47
 * are met:
48
 * 1. Redistributions of source code must retain the above copyright
49
 *    notice, this list of conditions and the following disclaimer.
50
 * 2. Redistributions in binary form must reproduce the above copyright
51
 *    notice, this list of conditions and the following disclaimer in the
52
 *    documentation and/or other materials provided with the distribution.
53
 * 3. All advertising materials mentioning features or use of this software
54
 *    must display the following acknowledgement:
55
 *        This product includes software developed by the University of
56
 *        California, Berkeley and its contributors.
57
 * 4. Neither the name of the University nor the names of its contributors
58
 *    may be used to endorse or promote products derived from this software
59
 *    without specific prior written permission.
60
 *
61
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
62
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
63
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
64
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
65
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
66
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
67
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
68
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
69
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
70
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
71
 * SUCH DAMAGE.
72
 *
73
 *        @(#)segments.h        7.1 (Berkeley) 5/9/91
74
 */
75
76
/*
77
 * 386 Segmentation Data Structures and definitions
78
 *        William F. Jolitz (william@ernie.berkeley.edu) 6/20/1989
79
 */
80
81
#ifndef _I386_SEGMENTS_H_
82
#define _I386_SEGMENTS_H_
83
#ifdef _KERNEL_OPT
84
#include "opt_xen.h"
85
#endif
86
87
/*
88
 * Selectors
89
 */
90
91
#define        ISPL(s)                ((s) & SEL_RPL)        /* what is the priority level of a selector */
92
#ifndef XEN
93
#define        SEL_KPL                0                /* kernel privilege level */
94
#else
95
#define        SEL_XEN                0                /* Xen privilege level */
96
#define        SEL_KPL                1                /* kernel privilege level */
97
#endif /* XEN */
98
#define        SEL_UPL                3                /* user privilege level */
99
#define        SEL_RPL                3                /* requester's privilege level mask */
100
#ifdef XEN
101
#define        CHK_UPL                2                /* user privilege level mask */
102
#else
103
#define CHK_UPL                SEL_RPL
104
#endif /* XEN */
105
#define        ISLDT(s)        ((s) & SEL_LDT)        /* is it local or global */
106
#define        SEL_LDT                4                /* local descriptor table */
107
#define        IDXSEL(s)        (((s) >> 3) & 0x1fff)                /* index of selector */
108
#define        IDXSELN(s)        (((s) >> 3))                        /* index of selector */
109
#define        GSEL(s,r)        (((s) << 3) | r)                /* a global selector */
110
#define        LSEL(s,r)        (((s) << 3) | r | SEL_LDT)        /* a local selector */
111
#define        GSYSSEL(s,r)        GSEL(s,r)        /* compat with amd64 */
112
113
#if defined(_KERNEL_OPT)
114
#include "opt_vm86.h"
115
#endif
116
117
#ifdef VM86
118
#define        USERMODE(c, f)                (ISPL(c) == SEL_UPL || ((f) & PSL_VM) != 0)
119
#define        KERNELMODE(c, f)        (ISPL(c) == SEL_KPL && ((f) & PSL_VM) == 0)
120
#else
121
#define        USERMODE(c, f)                (ISPL(c) == SEL_UPL)
122
#define        KERNELMODE(c, f)        (ISPL(c) == SEL_KPL)
123
#endif
124
125
#ifndef _LOCORE
126
127
#if __GNUC__ == 2 && __GNUC_MINOR__ < 7
128
#pragma pack(1)
129
#endif
130
131
/*
132
 * Memory and System segment descriptors
133
 */
134
struct segment_descriptor {
135
        unsigned sd_lolimit:16;                /* segment extent (lsb) */
136
        unsigned sd_lobase:24;                /* segment base address (lsb) */
137
        unsigned sd_type:5;                /* segment type */
138
        unsigned sd_dpl:2;                /* segment descriptor priority level */
139
        unsigned sd_p:1;                /* segment descriptor present */
140
        unsigned sd_hilimit:4;                /* segment extent (msb) */
141
        unsigned sd_xx:2;                /* unused */
142
        unsigned sd_def32:1;                /* default 32 vs 16 bit size */
143
        unsigned sd_gran:1;                /* limit granularity (byte/page) */
144
        unsigned sd_hibase:8;                /* segment base address (msb) */
145
} __packed;
146
147
/*
148
 * Gate descriptors (e.g. indirect descriptors)
149
 */
150
struct gate_descriptor {
151
        unsigned gd_looffset:16;        /* gate offset (lsb) */
152
        unsigned gd_selector:16;        /* gate segment selector */
153
        unsigned gd_stkcpy:5;                /* number of stack wds to cpy */
154
        unsigned gd_xx:3;                /* unused */
155
        unsigned gd_type:5;                /* segment type */
156
        unsigned gd_dpl:2;                /* segment descriptor priority level */
157
        unsigned gd_p:1;                /* segment descriptor present */
158
        unsigned gd_hioffset:16;        /* gate offset (msb) */
159
} __packed;
160
161
struct ldt_descriptor {
162
        vaddr_t ld_base;
163
        uint32_t ld_entries;
164
} __packed;
165
166
/*
167
 * Generic descriptor
168
 */
169
union descriptor {
170
        struct segment_descriptor sd;
171
        struct gate_descriptor gd;
172
        struct ldt_descriptor ld;
173
        uint32_t raw[2];
174
        uint64_t raw64;
175
} __packed;
176
177
/*
178
 * region descriptors, used to load gdt/idt tables before segments yet exist.
179
 */
180
struct region_descriptor {
181
        unsigned rd_limit:16;                /* segment extent */
182
        unsigned rd_base:32;                /* base address  */
183
} __packed;
184
185
#if __GNUC__ == 2 && __GNUC_MINOR__ < 7
186
#pragma pack(4)
187
#endif
188
189
#ifdef _KERNEL
190
extern union descriptor *gdt, *ldt;
191
extern struct gate_descriptor *idt;
192
193
void setgate(struct gate_descriptor *, void *, int, int, int, int);
194
void setregion(struct region_descriptor *, void *, size_t);
195
void setsegment(struct segment_descriptor *, const void *, size_t, int, int,
196
    int, int);
197
void setgdt(int, const void *, size_t, int, int, int, int);
198
void unsetgate(struct gate_descriptor *);
199
void cpu_init_idt(void);
200
void update_descriptor(union descriptor *, union descriptor *);
201
202
#if !defined(XEN)
203
void idt_init(void);
204
void idt_vec_reserve(int);
205
int idt_vec_alloc(int, int);
206
void idt_vec_set(int, void (*)(void));
207
void idt_vec_free(int);
208
#endif
209
210
#endif /* _KERNEL */
211
212
#endif /* !_LOCORE */
213
214
/* system segments and gate types */
215
#define        SDT_SYSNULL         0        /* system null */
216
#define        SDT_SYS286TSS         1        /* system 286 TSS available */
217
#define        SDT_SYSLDT         2        /* system local descriptor table */
218
#define        SDT_SYS286BSY         3        /* system 286 TSS busy */
219
#define        SDT_SYS286CGT         4        /* system 286 call gate */
220
#define        SDT_SYSTASKGT         5        /* system task gate */
221
#define        SDT_SYS286IGT         6        /* system 286 interrupt gate */
222
#define        SDT_SYS286TGT         7        /* system 286 trap gate */
223
#define        SDT_SYSNULL2         8        /* system null again */
224
#define        SDT_SYS386TSS         9        /* system 386 TSS available */
225
#define        SDT_SYSNULL3        10        /* system null again */
226
#define        SDT_SYS386BSY        11        /* system 386 TSS busy */
227
#define        SDT_SYS386CGT        12        /* system 386 call gate */
228
#define        SDT_SYSNULL4        13        /* system null again */
229
#define        SDT_SYS386IGT        14        /* system 386 interrupt gate */
230
#define        SDT_SYS386TGT        15        /* system 386 trap gate */
231
232
/* memory segment types */
233
#define        SDT_MEMRO        16        /* memory read only */
234
#define        SDT_MEMROA        17        /* memory read only accessed */
235
#define        SDT_MEMRW        18        /* memory read write */
236
#define        SDT_MEMRWA        19        /* memory read write accessed */
237
#define        SDT_MEMROD        20        /* memory read only expand dwn limit */
238
#define        SDT_MEMRODA        21        /* memory read only expand dwn limit accessed */
239
#define        SDT_MEMRWD        22        /* memory read write expand dwn limit */
240
#define        SDT_MEMRWDA        23        /* memory read write expand dwn limit acessed */
241
#define        SDT_MEME        24        /* memory execute only */
242
#define        SDT_MEMEA        25        /* memory execute only accessed */
243
#define        SDT_MEMER        26        /* memory execute read */
244
#define        SDT_MEMERA        27        /* memory execute read accessed */
245
#define        SDT_MEMEC        28        /* memory execute only conforming */
246
#define        SDT_MEMEAC        29        /* memory execute only accessed conforming */
247
#define        SDT_MEMERC        30        /* memory execute read conforming */
248
#define        SDT_MEMERAC        31        /* memory execute read accessed conforming */
249
250
#define SDTYPE(p)        (((const struct segment_descriptor *)(p))->sd_type)
251
/* is memory segment descriptor pointer ? */
252
#define ISMEMSDP(s)        (SDTYPE(s) >= SDT_MEMRO && \
253
                         SDTYPE(s) <= SDT_MEMERAC)
254
255
/* is 286 gate descriptor pointer ? */
256
#define IS286GDP(s)        (SDTYPE(s) >= SDT_SYS286CGT && \
257
                         SDTYPE(s) < SDT_SYS286TGT)
258
259
/* is 386 gate descriptor pointer ? */
260
#define IS386GDP(s)        (SDTYPE(s) >= SDT_SYS386CGT && \
261
                         SDTYPE(s) < SDT_SYS386TGT)
262
263
/* is gate descriptor pointer ? */
264
#define ISGDP(s)        (IS286GDP(s) || IS386GDP(s))
265
266
/* is segment descriptor pointer ? */
267
#define ISSDP(s)        (ISMEMSDP(s) || !ISGDP(s))
268
269
/* is system segment descriptor pointer ? */
270
#define ISSYSSDP(s)        (!ISMEMSDP(s) && !ISGDP(s))
271
272
/*
273
 * Segment Protection Exception code bits
274
 */
275
#define        SEGEX_EXT        0x01        /* recursive or externally induced */
276
#define        SEGEX_IDT        0x02        /* interrupt descriptor table */
277
#define        SEGEX_TI        0x04        /* local descriptor table */
278
279
/*
280
 * Entries in the Interrupt Descriptor Table (IDT)
281
 */
282
#define        NIDT        256
283
#define        NRSVIDT        32                /* reserved entries for CPU exceptions */
284
285
/*
286
 * Entries in the Global Descriptor Table (GDT).
287
 *
288
 * NB: If you change GBIOSCODE/GBIOSDATA, you *must* rebuild arch/i386/
289
 * bioscall/biostramp.inc, as that relies on GBIOSCODE/GBIOSDATA and a
290
 * normal kernel build does not rebuild it (it's merely included whole-
291
 * sale from i386/bioscall.s)
292
 *
293
 * Also, note that the GEXTBIOSDATA_SEL selector is special, as it maps
294
 * to the value 0x0040 (when created as a KPL global selector).  Some
295
 * BIOSes reference the extended BIOS data area at segment 0040 in a non
296
 * relocatable fashion (even when in protected mode); mapping the zero page
297
 * via the GEXTBIOSDATA_SEL allows these buggy BIOSes to continue to work
298
 * under NetBSD.
299
 *
300
 * The order if the first 5 descriptors is special; the sysenter/sysexit
301
 * instructions depend on them.
302
 */
303
#define        GNULL_SEL        0        /* Null descriptor */
304
#define        GCODE_SEL        1        /* Kernel code descriptor */
305
#define        GDATA_SEL        2        /* Kernel data descriptor */
306
#define        GUCODE_SEL        3        /* User code descriptor */
307
#define        GUDATA_SEL        4        /* User data descriptor */
308
#define        GLDT_SEL        5        /* Default LDT descriptor */
309
#define GCPU_SEL        6        /* per-CPU segment */
310
#define        GEXTBIOSDATA_SEL 8        /* magic to catch BIOS refs to EBDA */
311
#define        GAPM32CODE_SEL        9        /* 3 APM segments must be consecutive */
312
#define        GAPM16CODE_SEL        10        /* and in the specified order: code32 */
313
#define        GAPMDATA_SEL        11        /* code16 and then data per APM spec */
314
#define        GBIOSCODE_SEL        12
315
#define        GBIOSDATA_SEL        13
316
#define        GPNPBIOSCODE_SEL 14
317
#define        GPNPBIOSDATA_SEL 15
318
#define        GPNPBIOSSCRATCH_SEL 16
319
#define        GPNPBIOSTRAMP_SEL 17
320
#define GTRAPTSS_SEL        18
321
#define GIPITSS_SEL        19
322
#define GUCODEBIG_SEL        20        /* User code with executable stack */
323
#define        GUFS_SEL        21        /* Per-thread %fs */
324
#define        GUGS_SEL        22        /* Per-thread %gs */
325
#define        NGDT                23
326
327
/*
328
 * Entries in the Local Descriptor Table (LDT).
329
 * DO NOT ADD KERNEL DATA/CODE SEGMENTS TO THIS TABLE.
330
 */
331
#define        LSYS5CALLS_SEL        0        /* iBCS system call gate */
332
#define        LSYS5SIGR_SEL        1        /* iBCS sigreturn gate */
333
#define        LUCODE_SEL        2        /* User code descriptor */
334
#define        LUDATA_SEL        3        /* User data descriptor */
335
#define        LSOL26CALLS_SEL        4        /* Solaris 2.6 system call gate */
336
#define        LUCODEBIG_SEL        5        /* User code with executable stack */
337
#define        LBSDICALLS_SEL        16        /* BSDI system call gate */
338
#define        NLDT                17
339
340
#endif /* _I386_SEGMENTS_H_ */