|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1992 NeXT Computer, Inc.
27: *
28: * Intel386 Family: Interrupt descriptor table.
29: *
30: * HISTORY
31: *
32: * 3 April 1992 ? at NeXT
33: * Created.
34: */
35:
36: #import <mach/mach_types.h>
37:
38: #import <architecture/i386/table.h>
39:
40: #import <machdep/i386/idt.h>
41: #import <machdep/i386/desc_inline.h>
42:
43: extern trp_divr(), trp_debg(), int__nmi(), trp_brpt();
44: extern trp_over(), flt_bnds(), flt_opcd(), flt_ncpr();
45: extern abt_dblf(), abt_over(), flt_btss(), flt_bseg();
46: extern flt_bstk(), flt_prot(), trp_0x0F(), flt_page();
47: extern flt_bcpr(), trp_0x11(), trp_0x12(), trp_0x13();
48: extern trp_0x14(), trp_0x15(), trp_0x16(), trp_0x17();
49: extern trp_0x18(), trp_0x19(), trp_0x1A(), trp_0x1B();
50: extern trp_0x1C(), trp_0x1D(), trp_0x1E(), trp_0x1F();
51: extern trp_0x20(), trp_0x21(), trp_0x22(), trp_0x23();
52: extern trp_0x24(), trp_0x25(), trp_0x26(), trp_0x27();
53: extern trp_0x28(), trp_0x29(), trp_0x2A(), trp_0x2B();
54: extern trp_0x2C(), trp_0x2D(), trp_0x2E(), trp_0x2F();
55: extern trp_0x30(), trp_0x31(), trp_0x32(), trp_0x33();
56: extern trp_0x34(), trp_0x35(), trp_0x36(), trp_0x37();
57: extern trp_0x38(), trp_0x39(), trp_0x3A(), trp_0x3B();
58: extern trp_0x3C(), trp_0x3D(), trp_0x3E(), trp_0x3F();
59:
60: extern int_0x40(), int_0x41(), int_0x42(), int_0x43();
61: extern int_0x44(), int_0x45(), int_0x46(), int_0x47();
62: extern int_0x48(), int_0x49(), int_0x4A(), int_0x4B();
63: extern int_0x4C(), int_0x4D(), int_0x4E(), int_0x4F();
64: extern int_0x50(), int_0x51(), int_0x52(), int_0x53();
65: extern int_0x54(), int_0x55(), int_0x56(), int_0x57();
66: extern int_0x58(), int_0x59(), int_0x5A(), int_0x5B();
67: extern int_0x5C(), int_0x5D(), int_0x5E(), int_0x5F();
68: extern int_0x60(), int_0x61(), int_0x62(), int_0x63();
69: extern int_0x64(), int_0x65(), int_0x66(), int_0x67();
70: extern int_0x68(), int_0x69(), int_0x6A(), int_0x6B();
71: extern int_0x6C(), int_0x6D(), int_0x6E(), int_0x6F();
72: extern int_0x70(), int_0x71(), int_0x72(), int_0x73();
73: extern int_0x74(), int_0x75(), int_0x76(), int_0x77();
74: extern int_0x78(), int_0x79(), int_0x7A(), int_0x7B();
75: extern int_0x7C(), int_0x7D(), int_0x7E(), int_0x7F();
76: extern int_0x80(), int_0x81(), int_0x82(), int_0x83();
77: extern int_0x84(), int_0x85(), int_0x86(), int_0x87();
78: extern int_0x88(), int_0x89(), int_0x8A(), int_0x8B();
79: extern int_0x8C(), int_0x8D(), int_0x8E(), int_0x8F();
80: extern int_0x90(), int_0x91(), int_0x92(), int_0x93();
81: extern int_0x94(), int_0x95(), int_0x96(), int_0x97();
82: extern int_0x98(), int_0x99(), int_0x9A(), int_0x9B();
83: extern int_0x9C(), int_0x9D(), int_0x9E(), int_0x9F();
84: extern int_0xA0(), int_0xA1(), int_0xA2(), int_0xA3();
85: extern int_0xA4(), int_0xA5(), int_0xA6(), int_0xA7();
86: extern int_0xA8(), int_0xA9(), int_0xAA(), int_0xAB();
87: extern int_0xAC(), int_0xAD(), int_0xAE(), int_0xAF();
88: extern int_0xB0(), int_0xB1(), int_0xB2(), int_0xB3();
89: extern int_0xB4(), int_0xB5(), int_0xB6(), int_0xB7();
90: extern int_0xB8(), int_0xB9(), int_0xBA(), int_0xBB();
91: extern int_0xBC(), int_0xBD(), int_0xBE(), int_0xBF();
92: extern int_0xC0(), int_0xC1(), int_0xC2(), int_0xC3();
93: extern int_0xC4(), int_0xC5(), int_0xC6(), int_0xC7();
94: extern int_0xC8(), int_0xC9(), int_0xCA(), int_0xCB();
95: extern int_0xCC(), int_0xCD(), int_0xCE(), int_0xCF();
96: extern int_0xD0(), int_0xD1(), int_0xD2(), int_0xD3();
97: extern int_0xD4(), int_0xD5(), int_0xD6(), int_0xD7();
98: extern int_0xD8(), int_0xD9(), int_0xDA(), int_0xDB();
99: extern int_0xDC(), int_0xDD(), int_0xDE(), int_0xDF();
100: extern int_0xE0(), int_0xE1(), int_0xE2(), int_0xE3();
101: extern int_0xE4(), int_0xE5(), int_0xE6(), int_0xE7();
102: extern int_0xE8(), int_0xE9(), int_0xEA(), int_0xEB();
103: extern int_0xEC(), int_0xED(), int_0xEE(), int_0xEF();
104: extern int_0xF0(), int_0xF1(), int_0xF2(), int_0xF3();
105: extern int_0xF4(), int_0xF5(), int_0xF6(), int_0xF7();
106: extern int_0xF8(), int_0xF9(), int_0xFA(), int_0xFB();
107: extern int_0xFC(), int_0xFD(), int_0xFE(), int_0xFF();
108:
109: void
110: locate_idt(
111: vm_offset_t base
112: )
113: {
114: extern
115: unsigned int idt_base;
116: extern
117: unsigned short idt_limit;
118:
119: idt_base = base;
120: idt_limit = (IDTSZ * sizeof (idt_entry_t)) - 1;
121:
122: asm volatile("lidt %0"
123: :
124: : "m" (idt_limit));
125: }
126:
127:
128: typedef struct {
129: vm_offset_t offset;
130: sel_t seg;
131: unsigned short type :5,
132: dpl :2,
133: :9;
134: } idt_pseudo_entry_t;
135:
136: idt_pseudo_entry_t idt_pseudo[];
137:
138: void
139: idt_init(void)
140: {
141: idt_pseudo_entry_t tmp;
142: int i;
143:
144: for (i = 0; i < IDTSZ; i++) {
145: tmp = idt_pseudo[i];
146: if (tmp.type == DESC_TRAP_GATE)
147: make_trap_gate((trap_gate_t *)&idt[i],
148: tmp.seg,
149: tmp.offset,
150: tmp.dpl);
151: else
152: if (tmp.type == DESC_INTR_GATE)
153: make_intr_gate((intr_gate_t *)&idt[i],
154: tmp.seg,
155: tmp.offset,
156: tmp.dpl);
157: else
158: if (tmp.type == DESC_TASK_GATE)
159: make_task_gate((task_gate_t *)&idt[i],
160: tmp.seg,
161: tmp.offset,
162: tmp.dpl);
163: }
164:
165: locate_idt((vm_offset_t) idt);
166: }
167:
168: #define IPE(o, t, p) \
169: { (vm_offset_t)(o), KCS_SEL, (t), (p) }
170:
171: #define TG DESC_TRAP_GATE
172: #define IG DESC_INTR_GATE
173: #define K KERN_PRIV
174: #define U USER_PRIV
175:
176: idt_pseudo_entry_t idt_pseudo[IDTSZ] = {
177: IPE(trp_divr, TG, K),
178: IPE(trp_debg, IG, K),
179: IPE(int__nmi, IG, K),
180: IPE(trp_brpt, TG, U),
181: IPE(trp_over, TG, U),
182: IPE(flt_bnds, TG, U),
183: IPE(flt_opcd, TG, K),
184: IPE(flt_ncpr, TG, K),
185: IPE(abt_dblf, TG, K),
186: IPE(abt_over, TG, K),
187: IPE(flt_btss, TG, K),
188: IPE(flt_bseg, TG, K),
189: IPE(flt_bstk, TG, K),
190: IPE(flt_prot, TG, K),
191: IPE(flt_page, TG, K),
192: IPE(trp_0x0F, TG, K),
193: IPE(flt_bcpr, TG, K),
194: IPE(trp_0x11, TG, K),
195: IPE(trp_0x12, TG, K),
196: IPE(trp_0x13, TG, K),
197: IPE(trp_0x14, TG, K),
198: IPE(trp_0x15, TG, K),
199: IPE(trp_0x16, TG, K),
200: IPE(trp_0x17, TG, K),
201: IPE(trp_0x18, TG, K),
202: IPE(trp_0x19, TG, K),
203: IPE(trp_0x1A, TG, K),
204: IPE(trp_0x1B, TG, K),
205: IPE(trp_0x1C, TG, K),
206: IPE(trp_0x1D, TG, K),
207: IPE(trp_0x1E, TG, K),
208: IPE(trp_0x1F, TG, K),
209: IPE(trp_0x20, TG, K),
210: IPE(trp_0x21, TG, K),
211: IPE(trp_0x22, TG, K),
212: IPE(trp_0x23, TG, K),
213: IPE(trp_0x24, TG, K),
214: IPE(trp_0x25, TG, K),
215: IPE(trp_0x26, TG, K),
216: IPE(trp_0x27, TG, K),
217: IPE(trp_0x28, TG, K),
218: IPE(trp_0x29, TG, K),
219: IPE(trp_0x2A, TG, K),
220: IPE(trp_0x2B, TG, K),
221: IPE(trp_0x2C, TG, K),
222: IPE(trp_0x2D, TG, K),
223: IPE(trp_0x2E, TG, K),
224: IPE(trp_0x2F, TG, K),
225: IPE(trp_0x30, TG, K),
226: IPE(trp_0x31, TG, K),
227: IPE(trp_0x32, TG, K),
228: IPE(trp_0x33, TG, K),
229: IPE(trp_0x34, TG, K),
230: IPE(trp_0x35, TG, K),
231: IPE(trp_0x36, TG, K),
232: IPE(trp_0x37, TG, K),
233: IPE(trp_0x38, TG, K),
234: IPE(trp_0x39, TG, K),
235: IPE(trp_0x3A, TG, K),
236: IPE(trp_0x3B, TG, K),
237: IPE(trp_0x3C, TG, K),
238: IPE(trp_0x3D, TG, K),
239: IPE(trp_0x3E, TG, K),
240: IPE(trp_0x3F, TG, K),
241:
242: IPE(int_0x40, IG, K),
243: IPE(int_0x41, IG, K),
244: IPE(int_0x42, IG, K),
245: IPE(int_0x43, IG, K),
246: IPE(int_0x44, IG, K),
247: IPE(int_0x45, IG, K),
248: IPE(int_0x46, IG, K),
249: IPE(int_0x47, IG, K),
250: IPE(int_0x48, IG, K),
251: IPE(int_0x49, IG, K),
252: IPE(int_0x4A, IG, K),
253: IPE(int_0x4B, IG, K),
254: IPE(int_0x4C, IG, K),
255: IPE(int_0x4D, IG, K),
256: IPE(int_0x4E, IG, K),
257: IPE(int_0x4F, IG, K),
258: IPE(int_0x50, IG, K),
259: IPE(int_0x51, IG, K),
260: IPE(int_0x52, IG, K),
261: IPE(int_0x53, IG, K),
262: IPE(int_0x54, IG, K),
263: IPE(int_0x55, IG, K),
264: IPE(int_0x56, IG, K),
265: IPE(int_0x57, IG, K),
266: IPE(int_0x58, IG, K),
267: IPE(int_0x59, IG, K),
268: IPE(int_0x5A, IG, K),
269: IPE(int_0x5B, IG, K),
270: IPE(int_0x5C, IG, K),
271: IPE(int_0x5D, IG, K),
272: IPE(int_0x5E, IG, K),
273: IPE(int_0x5F, IG, K),
274: IPE(int_0x60, IG, K),
275: IPE(int_0x61, IG, K),
276: IPE(int_0x62, IG, K),
277: IPE(int_0x63, IG, K),
278: IPE(int_0x64, IG, K),
279: IPE(int_0x65, IG, K),
280: IPE(int_0x66, IG, K),
281: IPE(int_0x67, IG, K),
282: IPE(int_0x68, IG, K),
283: IPE(int_0x69, IG, K),
284: IPE(int_0x6A, IG, K),
285: IPE(int_0x6B, IG, K),
286: IPE(int_0x6C, IG, K),
287: IPE(int_0x6D, IG, K),
288: IPE(int_0x6E, IG, K),
289: IPE(int_0x6F, IG, K),
290: IPE(int_0x70, IG, K),
291: IPE(int_0x71, IG, K),
292: IPE(int_0x72, IG, K),
293: IPE(int_0x73, IG, K),
294: IPE(int_0x74, IG, K),
295: IPE(int_0x75, IG, K),
296: IPE(int_0x76, IG, K),
297: IPE(int_0x77, IG, K),
298: IPE(int_0x78, IG, K),
299: IPE(int_0x79, IG, K),
300: IPE(int_0x7A, IG, K),
301: IPE(int_0x7B, IG, K),
302: IPE(int_0x7C, IG, K),
303: IPE(int_0x7D, IG, K),
304: IPE(int_0x7E, IG, K),
305: IPE(int_0x7F, IG, K),
306: IPE(int_0x80, IG, K),
307: IPE(int_0x81, IG, K),
308: IPE(int_0x82, IG, K),
309: IPE(int_0x83, IG, K),
310: IPE(int_0x84, IG, K),
311: IPE(int_0x85, IG, K),
312: IPE(int_0x86, IG, K),
313: IPE(int_0x87, IG, K),
314: IPE(int_0x88, TG, K),
315: IPE(int_0x89, TG, K),
316: IPE(int_0x8A, TG, K),
317: IPE(int_0x8B, TG, K),
318: IPE(int_0x8C, TG, K),
319: IPE(int_0x8D, TG, K),
320: IPE(int_0x8E, TG, K),
321: IPE(int_0x8F, TG, K),
322: IPE(int_0x90, TG, K),
323: IPE(int_0x91, TG, K),
324: IPE(int_0x92, TG, K),
325: IPE(int_0x93, TG, K),
326: IPE(int_0x94, TG, K),
327: IPE(int_0x95, TG, K),
328: IPE(int_0x96, TG, K),
329: IPE(int_0x97, TG, K),
330: IPE(int_0x98, TG, K),
331: IPE(int_0x99, TG, K),
332: IPE(int_0x9A, TG, K),
333: IPE(int_0x9B, TG, K),
334: IPE(int_0x9C, TG, K),
335: IPE(int_0x9D, TG, K),
336: IPE(int_0x9E, TG, K),
337: IPE(int_0x9F, TG, K),
338: IPE(int_0xA0, TG, K),
339: IPE(int_0xA1, TG, K),
340: IPE(int_0xA2, TG, K),
341: IPE(int_0xA3, TG, K),
342: IPE(int_0xA4, TG, K),
343: IPE(int_0xA5, TG, K),
344: IPE(int_0xA6, TG, K),
345: IPE(int_0xA7, TG, K),
346: IPE(int_0xA8, TG, K),
347: IPE(int_0xA9, TG, K),
348: IPE(int_0xAA, TG, K),
349: IPE(int_0xAB, TG, K),
350: IPE(int_0xAC, TG, K),
351: IPE(int_0xAD, TG, K),
352: IPE(int_0xAE, TG, K),
353: IPE(int_0xAF, TG, K),
354: IPE(int_0xB0, TG, K),
355: IPE(int_0xB1, TG, K),
356: IPE(int_0xB2, TG, K),
357: IPE(int_0xB3, TG, K),
358: IPE(int_0xB4, TG, K),
359: IPE(int_0xB5, TG, K),
360: IPE(int_0xB6, TG, K),
361: IPE(int_0xB7, TG, K),
362: IPE(int_0xB8, TG, K),
363: IPE(int_0xB9, TG, K),
364: IPE(int_0xBA, TG, K),
365: IPE(int_0xBB, TG, K),
366: IPE(int_0xBC, TG, K),
367: IPE(int_0xBD, TG, K),
368: IPE(int_0xBE, TG, K),
369: IPE(int_0xBF, TG, K),
370: IPE(int_0xC0, TG, K),
371: IPE(int_0xC1, TG, K),
372: IPE(int_0xC2, TG, K),
373: IPE(int_0xC3, TG, K),
374: IPE(int_0xC4, TG, K),
375: IPE(int_0xC5, TG, K),
376: IPE(int_0xC6, TG, K),
377: IPE(int_0xC7, TG, K),
378: IPE(int_0xC8, TG, K),
379: IPE(int_0xC9, TG, K),
380: IPE(int_0xCA, TG, K),
381: IPE(int_0xCB, TG, K),
382: IPE(int_0xCC, TG, K),
383: IPE(int_0xCD, TG, K),
384: IPE(int_0xCE, TG, K),
385: IPE(int_0xCF, TG, K),
386: IPE(int_0xD0, TG, K),
387: IPE(int_0xD1, TG, K),
388: IPE(int_0xD2, TG, K),
389: IPE(int_0xD3, TG, K),
390: IPE(int_0xD4, TG, K),
391: IPE(int_0xD5, TG, K),
392: IPE(int_0xD6, TG, K),
393: IPE(int_0xD7, TG, K),
394: IPE(int_0xD8, TG, K),
395: IPE(int_0xD9, TG, K),
396: IPE(int_0xDA, TG, K),
397: IPE(int_0xDB, TG, K),
398: IPE(int_0xDC, TG, K),
399: IPE(int_0xDD, TG, K),
400: IPE(int_0xDE, TG, K),
401: IPE(int_0xDF, TG, K),
402: IPE(int_0xE0, TG, K),
403: IPE(int_0xE1, TG, K),
404: IPE(int_0xE2, TG, K),
405: IPE(int_0xE3, TG, K),
406: IPE(int_0xE4, TG, K),
407: IPE(int_0xE5, TG, K),
408: IPE(int_0xE6, TG, K),
409: IPE(int_0xE7, TG, K),
410: IPE(int_0xE8, TG, K),
411: IPE(int_0xE9, TG, K),
412: IPE(int_0xEA, TG, K),
413: IPE(int_0xEB, TG, K),
414: IPE(int_0xEC, TG, K),
415: IPE(int_0xED, TG, K),
416: IPE(int_0xEE, TG, K),
417: IPE(int_0xEF, TG, K),
418: IPE(int_0xF0, TG, K),
419: IPE(int_0xF1, TG, K),
420: IPE(int_0xF2, TG, K),
421: IPE(int_0xF3, TG, K),
422: IPE(int_0xF4, TG, K),
423: IPE(int_0xF5, TG, K),
424: IPE(int_0xF6, TG, K),
425: IPE(int_0xF7, TG, K),
426: IPE(int_0xF8, TG, K),
427: IPE(int_0xF9, TG, K),
428: IPE(int_0xFA, TG, K),
429: IPE(int_0xFB, TG, K),
430: IPE(int_0xFC, TG, K),
431: IPE(int_0xFD, TG, K),
432: IPE(int_0xFE, TG, K),
433: IPE(int_0xFF, TG, K),
434: };
435:
436: idt_t * idt = (idt_entry_t *)idt_pseudo;
437:
438: void
439: idt_copy(
440: vm_offset_t new_idt,
441: vm_size_t length
442: )
443: {
444: if (length < (IDTSZ * sizeof (idt_entry_t)))
445: panic("idt_copy");
446:
447: (void) memcpy((void *)new_idt, idt, IDTSZ * sizeof (idt_entry_t));
448: (vm_offset_t)idt = new_idt;
449:
450: locate_idt((vm_offset_t) idt);
451: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.