|
|
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.