|
|
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) 1997 Apple Computer, Inc. All rights reserved. ! 27: * Copyright (c) 1994 NeXT Computer, Inc. All rights reserved. ! 28: * ! 29: * machdep/ppc/kdp_machdep.c ! 30: * ! 31: * Machine-dependent code for Remote Debugging Protocol ! 32: * ! 33: * History: ! 34: * March, 1997 Umesh Vaishampayan [[email protected]] ! 35: * Created. ! 36: * 03 Nov 1997 Herb Ruth [[email protected]] ! 37: * Added extern declarations for implicit function ! 38: * declarations. Changed dprintf macro to call kprintf() ! 39: * instead of kdp_printf() when KDP_TEST_HARNESS==1 ! 40: * Added sync and isync ppc instructions to kdp_flush_cache(). ! 41: * ! 42: */ ! 43: ! 44: #import <sys/param.h> ! 45: #import <sys/systm.h> ! 46: #import <sys/mbuf.h> ! 47: #import <sys/socket.h> ! 48: #import <net/if.h> ! 49: #import <net/route.h> ! 50: #import <netinet/in.h> ! 51: #import <netinet/in_systm.h> ! 52: #import <netinet/ip.h> ! 53: #import <netinet/ip_var.h> ! 54: #import <netinet/in_pcb.h> ! 55: #import <mach/mach_types.h> ! 56: #import <kern/kdp_internal.h> ! 57: #import <kern/miniMon.h> ! 58: #import <bsd/sys/conf.h> ! 59: #import <bsd/sys/reboot.h> ! 60: #include <stdarg.h> ! 61: #import <sys/subr_prf.h> ! 62: #include <mach/exception.h> ! 63: ! 64: #define KDP_TEST_HARNESS 0 ! 65: #if KDP_TEST_HARNESS ! 66: /*#define dprintf(x) kdp_printf x*/ ! 67: #define dprintf(x) kprintf x ! 68: #else ! 69: #define dprintf(x) ! 70: #endif ! 71: ! 72: /* 03 Nov 1997 */ ! 73: #warning extern declarations -- FIXME XXX ! 74: ! 75: extern int cnputc(char c); ! 76: extern void kprintf(const char *format, ...); ! 77: extern boot(int paniced, int howto, char *command); ! 78: ! 79: extern unsigned splhigh(void); ! 80: extern void splx(unsigned level); ! 81: extern void us_spin(int usec); ! 82: ! 83: void ! 84: kdp_printf( ! 85: const char *format, ! 86: ... ! 87: ) ! 88: { ! 89: va_list ap; ! 90: static char rdpPrintfBuf[512]; ! 91: char *p = rdpPrintfBuf; ! 92: ! 93: va_start(ap, format); ! 94: prf(format, ap, TOSTR, (struct tty *)&p); ! 95: va_end(ap); ! 96: *p++ = '\0'; ! 97: ! 98: p = rdpPrintfBuf; ! 99: while (*p) ! 100: cnputc(*p++); ! 101: } ! 102: ! 103: ! 104: void ! 105: kdp_exception( ! 106: unsigned char *pkt, ! 107: int *len, ! 108: unsigned short *remote_port, ! 109: unsigned int exception, ! 110: unsigned int code, ! 111: unsigned int subcode ! 112: ) ! 113: { ! 114: struct { ! 115: kdp_exception_t pkt; ! 116: kdp_exc_info_t exc; ! 117: } aligned_pkt; ! 118: ! 119: kdp_exception_t *rq = (kdp_exception_t *)&aligned_pkt; ! 120: ! 121: bcopy(pkt, rq, sizeof(*rq)); ! 122: rq->hdr.request = KDP_EXCEPTION; ! 123: rq->hdr.is_reply = 0; ! 124: rq->hdr.seq = kdp.exception_seq; ! 125: rq->hdr.key = 0; ! 126: rq->hdr.len = sizeof (*rq) + sizeof(kdp_exc_info_t); ! 127: ! 128: rq->n_exc_info = 1; ! 129: rq->exc_info[0].cpu = 0; ! 130: rq->exc_info[0].exception = exception; ! 131: rq->exc_info[0].code = code; ! 132: rq->exc_info[0].subcode = subcode; ! 133: ! 134: rq->hdr.len += rq->n_exc_info * sizeof (kdp_exc_info_t); ! 135: ! 136: bcopy(rq, pkt, rq->hdr.len); ! 137: ! 138: kdp.exception_ack_needed = TRUE; ! 139: ! 140: *remote_port = kdp.exception_port; ! 141: *len = rq->hdr.len; ! 142: } ! 143: ! 144: void ! 145: kdp_exception_ack( ! 146: unsigned char *pkt, ! 147: int len ! 148: ) ! 149: { ! 150: kdp_exception_ack_t aligned_pkt; ! 151: kdp_exception_ack_t *rq = (kdp_exception_ack_t *)&aligned_pkt; ! 152: ! 153: if (len < sizeof (*rq)) ! 154: return; ! 155: ! 156: bcopy(pkt, rq, sizeof(*rq)); ! 157: ! 158: if (!rq->hdr.is_reply || rq->hdr.request != KDP_EXCEPTION) ! 159: return; ! 160: ! 161: dprintf(("kdp_exception_ack: seq 0x%08x 0x%08x\n", ! 162: rq->hdr.seq, kdp.exception_seq)); ! 163: ! 164: if (rq->hdr.seq == kdp.exception_seq) { ! 165: kdp.exception_ack_needed = FALSE; ! 166: kdp.exception_seq++; ! 167: } ! 168: } ! 169: ! 170: static void ! 171: kdp_getintegerstate( ! 172: struct ppc_thread_state *state ! 173: ) ! 174: { ! 175: struct ppc_thread_state *saved_state; ! 176: ! 177: saved_state = kdp.saved_state; ! 178: ! 179: *state = (struct ppc_thread_state) { 0 }; ! 180: ! 181: state->srr0 = saved_state->srr0; ! 182: state->srr1 = saved_state->srr1; ! 183: state->r0 = saved_state->r0; ! 184: state->r1 = saved_state->r1; ! 185: state->r2 = saved_state->r2; ! 186: state->r3 = saved_state->r3; ! 187: state->r4 = saved_state->r4; ! 188: state->r5 = saved_state->r5; ! 189: state->r6 = saved_state->r6; ! 190: state->r7 = saved_state->r7; ! 191: state->r8 = saved_state->r8; ! 192: state->r9 = saved_state->r9; ! 193: state->r10 = saved_state->r10; ! 194: state->r11 = saved_state->r11; ! 195: state->r12 = saved_state->r12; ! 196: state->r13 = saved_state->r13; ! 197: state->r14 = saved_state->r14; ! 198: state->r15 = saved_state->r15; ! 199: state->r16 = saved_state->r16; ! 200: state->r17 = saved_state->r17; ! 201: state->r18 = saved_state->r18; ! 202: state->r19 = saved_state->r19; ! 203: state->r20 = saved_state->r20; ! 204: state->r21 = saved_state->r21; ! 205: state->r22 = saved_state->r22; ! 206: state->r23 = saved_state->r23; ! 207: state->r24 = saved_state->r24; ! 208: state->r25 = saved_state->r25; ! 209: state->r26 = saved_state->r26; ! 210: state->r27 = saved_state->r27; ! 211: state->r28 = saved_state->r28; ! 212: state->r29 = saved_state->r29; ! 213: state->r30 = saved_state->r30; ! 214: state->r31 = saved_state->r31; ! 215: state->cr = saved_state->cr; ! 216: state->xer = saved_state->xer; ! 217: state->lr = saved_state->lr; ! 218: state->ctr = saved_state->ctr; ! 219: state->mq = saved_state->mq; /* This is BOGUS ! (601) ONLY */ ! 220: state->pad = saved_state->pad; ! 221: } ! 222: ! 223: kdp_error_t ! 224: kdp_machine_read_regs( ! 225: unsigned int cpu, ! 226: unsigned int flavor, ! 227: char *data, ! 228: int *size ! 229: ) ! 230: { ! 231: switch (flavor) { ! 232: ! 233: case PPC_THREAD_STATE: ! 234: // dprintf(("kdp_machine_read_regs: THREAD_STATE\n")); ! 235: dprintf(("kdp_machine_read_regs\n")); ! 236: kdp_getintegerstate((struct ppc_thread_state *)data); ! 237: *size = sizeof (struct ppc_thread_state); ! 238: return KDPERR_NO_ERROR; ! 239: ! 240: case PPC_FLOAT_STATE: ! 241: dprintf(("kdp_machine_read_regs: THREAD_FPSTATE\n")); ! 242: *(struct ppc_float_state *)data = (struct ppc_float_state) { {0.0}, 0, 0 }; ! 243: *size = sizeof (struct ppc_float_state); ! 244: return KDPERR_NO_ERROR; ! 245: ! 246: default: ! 247: dprintf(("kdp_machine_read_regs: bad flavor %d\n")); ! 248: return KDPERR_BADFLAVOR; ! 249: } ! 250: } ! 251: ! 252: static void ! 253: kdp_setintegerstate( ! 254: struct ppc_thread_state *state ! 255: ) ! 256: { ! 257: struct ppc_thread_state *saved_state; ! 258: ! 259: saved_state = kdp.saved_state; ! 260: ! 261: saved_state->srr0 = state->srr0 ; ! 262: saved_state->srr1 = state->srr1 ; ! 263: saved_state->r0 = state->r0 ; ! 264: saved_state->r1 = state->r1 ; ! 265: saved_state->r2 = state->r2 ; ! 266: saved_state->r3 = state->r3 ; ! 267: saved_state->r4 = state->r4 ; ! 268: saved_state->r5 = state->r5 ; ! 269: saved_state->r6 = state->r6 ; ! 270: saved_state->r7 = state->r7 ; ! 271: saved_state->r8 = state->r8 ; ! 272: saved_state->r9 = state->r9 ; ! 273: saved_state->r10 = state->r10 ; ! 274: saved_state->r11 = state->r11 ; ! 275: saved_state->r12 = state->r12 ; ! 276: saved_state->r13 = state->r13 ; ! 277: saved_state->r14 = state->r14 ; ! 278: saved_state->r15 = state->r15 ; ! 279: saved_state->r16 = state->r16 ; ! 280: saved_state->r17 = state->r17 ; ! 281: saved_state->r18 = state->r18 ; ! 282: saved_state->r19 = state->r19 ; ! 283: saved_state->r20 = state->r20 ; ! 284: saved_state->r21 = state->r21 ; ! 285: saved_state->r22 = state->r22 ; ! 286: saved_state->r23 = state->r23 ; ! 287: saved_state->r24 = state->r24 ; ! 288: saved_state->r25 = state->r25 ; ! 289: saved_state->r26 = state->r26 ; ! 290: saved_state->r27 = state->r27 ; ! 291: saved_state->r28 = state->r28 ; ! 292: saved_state->r29 = state->r29 ; ! 293: saved_state->r30 = state->r30 ; ! 294: saved_state->r31 = state->r31 ; ! 295: saved_state->cr = state->cr ; ! 296: saved_state->xer = state->xer ; ! 297: saved_state->lr = state->lr ; ! 298: saved_state->ctr = state->ctr ; ! 299: saved_state->mq = state->mq ; /* BOGUS! (601)ONLY */ ! 300: saved_state->pad = state->pad ; ! 301: } ! 302: ! 303: kdp_error_t ! 304: kdp_machine_write_regs( ! 305: unsigned int cpu, ! 306: unsigned int flavor, ! 307: char *data, ! 308: int *size ! 309: ) ! 310: { ! 311: switch (flavor) { ! 312: ! 313: case PPC_THREAD_STATE: ! 314: // dprintf(("kdp_machine_write_regs: THREAD_STATE\n")); ! 315: dprintf(("kdp_machine_write_regs\n")); ! 316: kdp_setintegerstate((struct ppc_thread_state *)data); ! 317: return KDPERR_NO_ERROR; ! 318: ! 319: case PPC_FLOAT_STATE: ! 320: dprintf(("kdp_machine_write_regs: THREAD_FPSTATE\n")); ! 321: return KDPERR_NO_ERROR; ! 322: ! 323: default: ! 324: dprintf(("kdp_machine_write_regs: bad flavor %d\n")); ! 325: return KDPERR_BADFLAVOR; ! 326: } ! 327: } ! 328: ! 329: void ! 330: kdp_machine_hostinfo( ! 331: kdp_hostinfo_t *hostinfo ! 332: ) ! 333: { ! 334: machine_slot_t m; ! 335: int i; ! 336: ! 337: hostinfo->cpus_mask = 0; ! 338: ! 339: for (i = 0; i < machine_info.max_cpus; i++) { ! 340: m = &machine_slot[i]; ! 341: if (!m->is_cpu) ! 342: continue; ! 343: ! 344: hostinfo->cpus_mask |= (1 << i); ! 345: if (hostinfo->cpu_type == 0) { ! 346: hostinfo->cpu_type = m->cpu_type; ! 347: hostinfo->cpu_subtype = m->cpu_subtype; ! 348: } ! 349: } ! 350: } ! 351: ! 352: void ! 353: kdp_panic( ! 354: const char *msg ! 355: ) ! 356: { ! 357: dprintf(("kdp_panic: exception, code & subcode not passed to safe_prf.\n")); ! 358: safe_prf("kdp panic: %s\n", msg); ! 359: while(1) {} ! 360: } ! 361: ! 362: ! 363: void ! 364: kdp_reboot(void) ! 365: { ! 366: boot(RB_BOOT, RB_AUTOBOOT | RB_NOSYNC, ""); ! 367: } ! 368: ! 369: int ! 370: kdp_intr_disbl(void) ! 371: { ! 372: return splhigh(); ! 373: } ! 374: ! 375: void ! 376: kdp_intr_enbl(int s) ! 377: { ! 378: splx(s); ! 379: } ! 380: ! 381: void ! 382: kdp_us_spin(int usec) ! 383: { ! 384: us_spin(usec); ! 385: } ! 386: ! 387: void print_saved_state(void *state) ! 388: { ! 389: struct ppc_thread_state *saved_state; ! 390: ! 391: saved_state = state; ! 392: ! 393: safe_prf("pc = 0x%x\n", saved_state->srr0); ! 394: safe_prf("msr = 0x%x\n", saved_state->srr1); ! 395: safe_prf("rp = 0x%x\n", saved_state->lr); ! 396: safe_prf("sp = 0x%x\n", saved_state->r1); ! 397: } ! 398: ! 399: void ! 400: kdp_flush_cache(void) ! 401: { ! 402: __asm__ volatile ("sync"); ! 403: __asm__ volatile ("isync"); ! 404: } ! 405: ! 406: #if 1 ! 407: void ! 408: kdp_init_integerstate(struct ppc_thread_state *instate) ! 409: { ! 410: __asm__ volatile (".set SS_R0,8"); ! 411: __asm__ volatile (".set SS_R1,12"); ! 412: __asm__ volatile (".set SS_R2,16"); ! 413: __asm__ volatile (".set SS_R3,20"); ! 414: __asm__ volatile (".set SS_R4,24"); ! 415: __asm__ volatile (".set SS_R5,28"); ! 416: __asm__ volatile (".set SS_R6,32"); ! 417: __asm__ volatile (".set SS_R7,36"); ! 418: __asm__ volatile (".set SS_R8,40"); ! 419: __asm__ volatile (".set SS_R9,44"); ! 420: __asm__ volatile (".set SS_R10,48"); ! 421: __asm__ volatile (".set SS_R11,52"); ! 422: __asm__ volatile (".set SS_R12,56"); ! 423: __asm__ volatile (".set SS_R13,60"); ! 424: __asm__ volatile (".set SS_R14,64"); ! 425: __asm__ volatile (".set SS_R15,68"); ! 426: __asm__ volatile (".set SS_R16,72"); ! 427: __asm__ volatile (".set SS_R17,76"); ! 428: __asm__ volatile (".set SS_R18,80"); ! 429: __asm__ volatile (".set SS_R19,84"); ! 430: __asm__ volatile (".set SS_R20,88"); ! 431: __asm__ volatile (".set SS_R21,92"); ! 432: __asm__ volatile (".set SS_R22,96"); ! 433: __asm__ volatile (".set SS_R23,100"); ! 434: __asm__ volatile (".set SS_R24,104"); ! 435: __asm__ volatile (".set SS_R25,108"); ! 436: __asm__ volatile (".set SS_R26,112"); ! 437: __asm__ volatile (".set SS_R27,116"); ! 438: __asm__ volatile (".set SS_R28,120"); ! 439: __asm__ volatile (".set SS_R29,124"); ! 440: __asm__ volatile (".set SS_R30,128"); ! 441: __asm__ volatile (".set SS_R31,132"); ! 442: __asm__ volatile (".set SS_CR,136"); ! 443: __asm__ volatile (".set SS_XER,140"); ! 444: __asm__ volatile (".set SS_LR,144"); ! 445: __asm__ volatile (".set SS_CTR,148"); ! 446: __asm__ volatile (".set SS_SRR0,0"); ! 447: __asm__ volatile (".set SS_SRR1,4"); ! 448: ! 449: __asm__ volatile("stw r0, SS_R0(r3)"); ! 450: __asm__ volatile("stw r5, SS_R5(r3)"); ! 451: ! 452: __asm__ volatile("addis r5, 0, hi16(L_kdbmarker)"); ! 453: __asm__ volatile("ori r5, r5, lo16(L_kdbmarker)"); ! 454: ! 455: __asm__ volatile("lwz r0, 0(r1)"); ! 456: __asm__ volatile("stw r0, SS_R1(r3)"); ! 457: __asm__ volatile(".noflag_reg 2"); ! 458: __asm__ volatile("stw r2, SS_R2(r3)"); ! 459: __asm__ volatile(".flag_reg 2"); ! 460: __asm__ volatile("stw r3, SS_R3(r3)"); ! 461: __asm__ volatile("stw r4, SS_R4(r3)"); ! 462: __asm__ volatile("stw r6, SS_R6(r3)"); ! 463: __asm__ volatile("stw r7, SS_R7(r3)"); ! 464: __asm__ volatile("stw r8, SS_R8(r3)"); ! 465: __asm__ volatile("stw r9, SS_R9(r3)"); ! 466: __asm__ volatile("stw r10, SS_R10(r3)"); ! 467: __asm__ volatile("stw r11, SS_R11(r3)"); ! 468: __asm__ volatile("stw r12, SS_R12(r3)"); ! 469: __asm__ volatile(".noflag_reg 13"); ! 470: __asm__ volatile("stw r13, SS_R13(r3)"); ! 471: __asm__ volatile(".flag_reg 13"); ! 472: __asm__ volatile("stw r14, SS_R14(r3)"); ! 473: __asm__ volatile("stw r15, SS_R15(r3)"); ! 474: __asm__ volatile("stw r16, SS_R16(r3)"); ! 475: __asm__ volatile("stw r17, SS_R17(r3)"); ! 476: __asm__ volatile("stw r18, SS_R18(r3)"); ! 477: __asm__ volatile("stw r19, SS_R19(r3)"); ! 478: __asm__ volatile("stw r20, SS_R20(r3)"); ! 479: __asm__ volatile("stw r21, SS_R21(r3)"); ! 480: __asm__ volatile("stw r22, SS_R22(r3)"); ! 481: __asm__ volatile("stw r23, SS_R23(r3)"); ! 482: __asm__ volatile("stw r24, SS_R24(r3)"); ! 483: __asm__ volatile("stw r25, SS_R25(r3)"); ! 484: __asm__ volatile("stw r26, SS_R26(r3)"); ! 485: __asm__ volatile("stw r27, SS_R27(r3)"); ! 486: __asm__ volatile("stw r28, SS_R28(r3)"); ! 487: __asm__ volatile("stw r29, SS_R29(r3)"); ! 488: __asm__ volatile("stw r30, SS_R30(r3)"); ! 489: __asm__ volatile("stw r31, SS_R31(r3)"); ! 490: ! 491: __asm__ volatile("mfcr r0"); ! 492: __asm__ volatile("stw r0, SS_CR(r3)"); ! 493: ! 494: __asm__ volatile("stw r5, SS_SRR0(r3)"); ! 495: ! 496: // __asm__ volatile("mfsrr0 r0"); ! 497: // __asm__ volatile("stw r0, SS_SRR0(r3)"); ! 498: __asm__ volatile("mfsrr1 r0"); ! 499: __asm__ volatile("stw r0, SS_SRR1(r3)"); ! 500: __asm__ volatile("mfxer r0"); ! 501: __asm__ volatile("stw r0, SS_XER(r3)"); ! 502: __asm__ volatile("mflr r0"); ! 503: __asm__ volatile("stw r0, SS_LR(r3)"); ! 504: __asm__ volatile("mfctr r0"); ! 505: __asm__ volatile("stw r0, SS_CTR(r3)"); ! 506: ! 507: } ! 508: ! 509: ! 510: void ! 511: call_kdp() ! 512: { ! 513: static struct ppc_thread_state __kdp_space; ! 514: kdp_init_integerstate(&__kdp_space); ! 515: kdp_raise_exception(EXC_SOFTWARE, 0, 0, &__kdp_space); ! 516: ! 517: __asm__ volatile("L_kdbmarker:"); ! 518: __asm__ volatile("nop"); ! 519: ! 520: } ! 521: #endif ! 522: ! 523: /* ! 524: * table to convert system specific code to generic codes for kdb ! 525: */ ! 526: int kdp_trap_codes[] = { ! 527: EXC_BAD_ACCESS, /* 0x0000 INVALID EXCEPTION */ ! 528: EXC_BAD_ACCESS, /* 0x0100 System reset */ ! 529: EXC_BAD_ACCESS, /* 0x0200 Machine check */ ! 530: EXC_BAD_ACCESS, /* 0x0300 Data access */ ! 531: EXC_BAD_ACCESS, /* 0x0400 Instruction access */ ! 532: EXC_BAD_ACCESS, /* 0x0500 External interrupt */ ! 533: EXC_BAD_ACCESS, /* 0x0600 Alignment */ ! 534: EXC_BREAKPOINT, /* 0x0700 Program - fp exc, ill/priv instr, trap */ ! 535: EXC_ARITHMETIC, /* 0x0800 Floating point disabled */ ! 536: EXC_SOFTWARE, /* 0x0900 Decrementer */ ! 537: EXC_BAD_ACCESS, /* 0x0A00 I/O controller interface */ ! 538: EXC_BAD_ACCESS, /* 0x0B00 INVALID EXCEPTION */ ! 539: EXC_SOFTWARE, /* 0x0C00 System call exception */ ! 540: EXC_BREAKPOINT, /* 0x0D00 Trace */ ! 541: EXC_SOFTWARE, /* 0x0E00 FP assist */ ! 542: EXC_SOFTWARE, /* 0x0F00 Performance monitoring */ ! 543: EXC_BAD_ACCESS, /* 0x1000 Instruction PTE miss */ ! 544: EXC_BAD_ACCESS, /* 0x1100 Data load PTE miss */ ! 545: EXC_BAD_ACCESS, /* 0x1200 Data store PTE miss */ ! 546: EXC_BREAKPOINT, /* 0x1300 Instruction bkpt */ ! 547: EXC_SOFTWARE, /* 0x1400 System management */ ! 548: EXC_BAD_ACCESS, /* 0x1500 INVALID EXCEPTION */ ! 549: EXC_BAD_ACCESS, /* 0x1600 INVALID EXCEPTION */ ! 550: EXC_BAD_ACCESS, /* 0x1700 INVALID EXCEPTION */ ! 551: EXC_BAD_ACCESS, /* 0x1800 INVALID EXCEPTION */ ! 552: EXC_BAD_ACCESS, /* 0x1900 INVALID EXCEPTION */ ! 553: EXC_BAD_ACCESS, /* 0x1A00 INVALID EXCEPTION */ ! 554: EXC_BAD_ACCESS, /* 0x1B00 INVALID EXCEPTION */ ! 555: EXC_BAD_ACCESS, /* 0x1C00 INVALID EXCEPTION */ ! 556: EXC_BAD_ACCESS, /* 0x1D00 INVALID EXCEPTION */ ! 557: EXC_BAD_ACCESS, /* 0x1E00 INVALID EXCEPTION */ ! 558: EXC_BAD_ACCESS, /* 0x1F00 INVALID EXCEPTION */ ! 559: EXC_BREAKPOINT, /* 0x2000 Run Mode/Trace */ ! 560: EXC_BAD_ACCESS, /* 0x2100 INVALID EXCEPTION */ ! 561: EXC_BAD_ACCESS, /* 0x2200 INVALID EXCEPTION */ ! 562: EXC_BAD_ACCESS, /* 0x2300 INVALID EXCEPTION */ ! 563: EXC_BAD_ACCESS, /* 0x2400 INVALID EXCEPTION */ ! 564: EXC_BAD_ACCESS, /* 0x2500 INVALID EXCEPTION */ ! 565: EXC_BAD_ACCESS, /* 0x2600 INVALID EXCEPTION */ ! 566: EXC_BAD_ACCESS, /* 0x2700 INVALID EXCEPTION */ ! 567: EXC_BAD_ACCESS, /* 0x2800 INVALID EXCEPTION */ ! 568: EXC_BAD_ACCESS, /* 0x2900 INVALID EXCEPTION */ ! 569: EXC_BAD_ACCESS, /* 0x2A00 INVALID EXCEPTION */ ! 570: EXC_BAD_ACCESS, /* 0x2B00 INVALID EXCEPTION */ ! 571: EXC_BAD_ACCESS, /* 0x2C00 INVALID EXCEPTION */ ! 572: EXC_BAD_ACCESS, /* 0x2D00 INVALID EXCEPTION */ ! 573: EXC_BAD_ACCESS, /* 0x2E00 INVALID EXCEPTION */ ! 574: EXC_BAD_ACCESS, /* 0x2F00 INVALID EXCEPTION */ ! 575: EXC_SOFTWARE /* 0x3000 AST trap (software) */ ! 576: }; ! 577: ! 578: int kdp_segments[16] = { ! 579: -1, -1, 0, 3, ! 580: 4, 5, 0xB, -1, ! 581: -1, -1, -1, -1, ! 582: -1, -1, -1, -1 ! 583: }; ! 584: ! 585: int kdp_space; ! 586: ! 587: int ! 588: kdp_map_segment(unsigned int segment) ! 589: { ! 590: segment &= 0xF; ! 591: return kdp_segments[segment]; ! 592: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.