Annotation of kernel/machdep/ppc/kdp_machdep.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.