Annotation of 43BSDReno/sys/vax/kdb_machdep.c, revision 1.1

1.1     ! root        1: /*     @(#)kdb_machdep.c       7.7 (Berkeley) 4/3/90   */
        !             2: 
        !             3: #include "param.h"
        !             4: #include "conf.h"
        !             5: #include "user.h"
        !             6: #include "proc.h"
        !             7: #include "uio.h"
        !             8: #include "systm.h"
        !             9: #include "reboot.h"
        !            10: #include "vmmac.h"
        !            11: #include "ioctl.h"
        !            12: #include "tty.h"
        !            13: 
        !            14: #include "cpu.h"
        !            15: #include "mtpr.h"
        !            16: #include "psl.h"
        !            17: #include "pte.h"
        !            18: #include "reg.h"
        !            19: #include "trap.h"
        !            20: #include "kdbparam.h"
        !            21: 
        !            22: #define        KDBSPACE        1024    /* 1K of memory for breakpoint table */
        !            23: static char kdbbuf[KDBSPACE];
        !            24: static char *kdbend = kdbbuf;
        !            25: int    kdb_escape;             /* allow kdb to be entered on console escape */
        !            26: int    kdb_panic;              /* allow kdb to be entered on panic/trap */
        !            27: 
        !            28: extern         int (*v_putc)();
        !            29: extern         int (*v_getc)();
        !            30: extern         int (*v_poll)();
        !            31: /*
        !            32:  * Dynamically allocate space for the debugger.
        !            33:  */
        !            34: char *
        !            35: kdbmalloc(n)
        !            36:        u_int n;
        !            37: {
        !            38:        char *old = kdbend;
        !            39: 
        !            40:        if (kdbend+n >= kdbbuf+KDBSPACE) {
        !            41:                printf("kdb: Out of space\n");
        !            42:                return ((char *)-1);
        !            43:        }
        !            44:        kdbend += n;
        !            45:        return (old);
        !            46: }
        !            47: 
        !            48: /*
        !            49:  * Initialize the kernel debugger.
        !            50:  */
        !            51: kdb_init()
        !            52: {
        !            53:        char *symtab, *strtab;
        !            54:        int strsize;
        !            55:        extern int end;
        !            56: 
        !            57:        kdbsetup();
        !            58:        if (bootesym > (char *)&end) {
        !            59:                symtab = (char *)&end + sizeof (int);
        !            60: #define        symsize *(int *)&end
        !            61:                strtab = symtab + symsize;
        !            62:                strsize = roundup(*(int *)strtab, sizeof (int));
        !            63:                if (strtab + strsize == bootesym) {
        !            64:                        printf("[Preserving %d bytes of symbol information]\n",
        !            65:                            symsize + strsize);
        !            66:                        kdbsetsym(symtab, strtab, strtab, strsize);
        !            67:                } else
        !            68:                        printf("kdb_init: bad bootesym %x, calculated %x\n",
        !            69:                            bootesym, strtab + strsize);
        !            70:        }
        !            71:        /*
        !            72:         * Transfer control to the debugger when magic console sequence
        !            73:         * is typed only if the system was booted with RB_KDB and the trap
        !            74:         * enable flag (RB_NOYSNC) set.
        !            75:         */
        !            76:        if ((boothowto&(RB_KDB|RB_NOSYNC)) == (RB_KDB|RB_NOSYNC))
        !            77:                kdb_escape = 1;
        !            78: 
        !            79:        if (boothowto&RB_KDB)
        !            80:                kdb_panic = 1;
        !            81: 
        !            82:        /*
        !            83:         * If boot flags indicate, force entry into the debugger.
        !            84:         */
        !            85:        if ((boothowto&(RB_HALT|RB_KDB)) == (RB_HALT|RB_KDB))
        !            86:                setsoftkdb();
        !            87: #undef symsize
        !            88: }
        !            89: 
        !            90: int    kdbactive = 0;
        !            91: #define        ESC     '\033'
        !            92: 
        !            93: /*
        !            94:  * Process a keyboard interrupt from the console.
        !            95:  * We look for an escape sequence which signals
        !            96:  * a request to enter the debugger.
        !            97:  */
        !            98: kdbrintr(c, tp)
        !            99:        int c;
        !           100:        struct tty *tp;
        !           101: {
        !           102:        static int escape = 0;
        !           103: 
        !           104:        c &= 0177;                      /* strip parity also */
        !           105:        if (!escape)
        !           106:                return (c == ESC &&  ++escape);
        !           107:        escape = 0;
        !           108:        /*
        !           109:         * Transfer control to the debugger only if the
        !           110:         * system was booted with RB_KDB and the trap
        !           111:         * enable flag (RB_NOYSNC) is set.
        !           112:         */
        !           113:        if ((boothowto&(RB_KDB|RB_NOSYNC)) != (RB_KDB|RB_NOSYNC) ||
        !           114:            (c != 'k' && c != 'K' && c != CTRL('k'))) {
        !           115:                (*linesw[tp->t_line].l_rint)(ESC, tp);
        !           116:                return (0);
        !           117:        }
        !           118:        if (!kdbactive)
        !           119:                setsoftkdb();
        !           120:        return (1);
        !           121: }
        !           122: 
        !           123: static int
        !           124: movpsl()
        !           125: {
        !           126: 
        !           127:        asm("   movpsl  r0");           /* XXX */
        !           128: }
        !           129: 
        !           130: #define        TYPE    SP+1
        !           131: #define        CODE    PC-1
        !           132: #define        USER    040
        !           133: static caddr_t kdbnofault;             /* label for peek & poke */
        !           134: /*
        !           135:  * Field a kdb-related trap or fault.
        !           136:  */
        !           137: kdb_trap(apsl)
        !           138:        register int *apsl;
        !           139: {
        !           140:        register int *locr0, type;
        !           141:        int code, retval, kstack = 0;
        !           142:        static int prevtype = -1, prevcode;
        !           143:        extern char *trap_type[];
        !           144:        extern int TRAP_TYPES;
        !           145: 
        !           146:        /*
        !           147:         * Allow panic if the debugger is not enabled.
        !           148:         */
        !           149:        if ((boothowto&RB_KDB) == 0)
        !           150:                return (0);
        !           151:        locr0 = apsl - PS;
        !           152:        type = locr0[TYPE], code = locr0[CODE];
        !           153:        if (type == T_KDBTRAP && prevtype != -1) {
        !           154:                type = prevtype, code = prevcode;
        !           155:                prevtype = -1;
        !           156:        }
        !           157:        if (type != T_TRCTRAP && type != T_BPTFLT) {
        !           158:                /*
        !           159:                 * Catch traps from kdbpeek and kdbpoke and perform
        !           160:                 * non-local goto to error label setup in routines.
        !           161:                 */
        !           162:                if (kdbnofault) {
        !           163:                        locr0[PC] = (int)kdbnofault;
        !           164:                        return (1);
        !           165:                }
        !           166:                type &= ~USER;
        !           167:        }
        !           168:        /*
        !           169:         * We prefer to run the debugger from the interrupt stack to
        !           170:         * avoid overflowing the kernel stack.  Thus, if we're not
        !           171:         * currently on the interrupt stack and the ipl is low, schedule
        !           172:         * a software interrupt to force reentry on the interrupt stack
        !           173:         * immediately after the rei that'll take place on return.
        !           174:         */
        !           175:        if ((movpsl()&PSL_IS) == 0) {
        !           176:                int s = splhigh();
        !           177:                if (s < KDB_IPL) {
        !           178:                        prevtype = type, prevcode = code;
        !           179:                        setsoftkdb();
        !           180:                        return (1);
        !           181:                }
        !           182:                splx(s);
        !           183:                kstack++;
        !           184:        }
        !           185:        getpcb(locr0);
        !           186:        /*
        !           187:         * Mark debugger active and initiate input
        !           188:         * polling in the console device driver.
        !           189:         */
        !           190:        (*v_poll)(kdbactive = 1);
        !           191:        retval = kdb(type, code, noproc ? (struct proc *)0 : u.u_procp, kstack);
        !           192:        (*v_poll)(kdbactive = 0);
        !           193:        setpcb(locr0);
        !           194:        return (retval);
        !           195: }
        !           196: 
        !           197: static char *codenames[] = {
        !           198:        "code = 0",
        !           199:        "integer overflow",
        !           200:        "integer divide by zero",
        !           201:        "floating overflow",
        !           202:        "floating/decimal divide by zero",
        !           203:        "floating underflow",
        !           204:        "decimal overflow",
        !           205:        "subscript out of range",
        !           206:        "floating overflow",
        !           207:        "floating divide by zero",
        !           208:        "floating undeflow"
        !           209: };
        !           210: #define        NCODES  (sizeof (codenames) / sizeof (codenames[0]))
        !           211: 
        !           212: /*
        !           213:  * Announce a trap.
        !           214:  */
        !           215: kdbprinttrap(type, code)
        !           216:        int type, code;
        !           217: {
        !           218: 
        !           219:        extern int TRAP_TYPES;
        !           220:        extern char *trap_type[];
        !           221: 
        !           222:        if (type != T_TRCTRAP && type != T_BPTFLT) {
        !           223:                if (type < TRAP_TYPES && trap_type[type])
        !           224:                        printf(trap_type[type]);
        !           225:                else
        !           226:                        printf("trap type %d", type);
        !           227:                if (type == T_ARITHTRAP && (unsigned)code < NCODES)
        !           228:                        printf(", %s", code);
        !           229:                else if (code)
        !           230:                        printf(", code = %d", code);
        !           231:                printf("\n");
        !           232:        }
        !           233: }
        !           234: 
        !           235: /*
        !           236:  * Read character from the console.
        !           237:  */
        !           238: kdbreadc(cp)
        !           239:        char *cp;
        !           240: {
        !           241: 
        !           242:        *cp = (*v_getc)();
        !           243:        return (1);
        !           244: }
        !           245: 
        !           246: /*
        !           247:  * Write characters to the console.
        !           248:  */
        !           249: kdbwrite(cp, len)
        !           250:        register char *cp;
        !           251:        register int len;
        !           252: {
        !           253: 
        !           254:        while (len-- > 0)
        !           255:                (*v_putc)(*cp++);
        !           256: }
        !           257: 
        !           258: /*
        !           259:  * Fetch a longword carefully.
        !           260:  */
        !           261: kdbpeek(addr)
        !           262:        register caddr_t addr;
        !           263: {
        !           264:        register long v = 0;
        !           265: 
        !           266:        asm("movab 1f,_kdbnofault");
        !           267:        v = *(long *)addr;
        !           268: asm("1:");
        !           269:        kdbnofault = 0;
        !           270:        return (v);
        !           271: }
        !           272: 
        !           273: /*
        !           274:  * Put a longword carefully.
        !           275:  */
        !           276: kdbpoke(addr, v)
        !           277:        register caddr_t addr;
        !           278:        long v;
        !           279: {
        !           280:        register int pn, *pte, opte = 0;
        !           281:        extern char Sysbase[], etext;
        !           282: 
        !           283:        /*
        !           284:         * If we're writing to the kernel's text space,
        !           285:         * make the page writeable for the duration of
        !           286:         * the access.
        !           287:         */
        !           288:        if ((caddr_t)Sysbase <= addr && addr <= (caddr_t)&etext) {
        !           289:                pn = btop((int)addr &~ 0x80000000);
        !           290:                pte = (int *)&Sysmap[pn];
        !           291:                opte = *pte;
        !           292:                *pte = (*pte &~ PG_PROT)|PG_KW;
        !           293:                mtpr(TBIS, addr);
        !           294:        }
        !           295:        asm("movab 1f,_kdbnofault");
        !           296:        *(long *)addr = v;
        !           297: asm("1:");
        !           298:        kdbnofault = 0;
        !           299:        if (opte) {
        !           300:                *pte = opte;
        !           301:                mtpr(TBIS, addr);
        !           302:        }
        !           303: }
        !           304: 
        !           305: static
        !           306: getpcb(locr0)
        !           307:        register int *locr0;
        !           308: {
        !           309:        extern struct pcb kdbpcb;
        !           310:        register struct pcb *pcb = &kdbpcb;
        !           311: 
        !           312:        pcb->pcb_r0 = locr0[R0];
        !           313:        pcb->pcb_r1 = locr0[R1];
        !           314:        pcb->pcb_r2 = locr0[R2];
        !           315:        pcb->pcb_r3 = locr0[R3];
        !           316:        pcb->pcb_r4 = locr0[R4];
        !           317:        pcb->pcb_r5 = locr0[R5];
        !           318:        pcb->pcb_r6 = locr0[R6];
        !           319:        pcb->pcb_r7 = locr0[R7];
        !           320:        pcb->pcb_r8 = locr0[R8];
        !           321:        pcb->pcb_r9 = locr0[R9];
        !           322:        pcb->pcb_r10 = locr0[R10];
        !           323:        pcb->pcb_r11 = locr0[R11];
        !           324:        pcb->pcb_ap = locr0[AP];
        !           325:        pcb->pcb_fp = locr0[FP];
        !           326:        pcb->pcb_usp = locr0[SP];
        !           327:        pcb->pcb_pc = locr0[PC];
        !           328:        pcb->pcb_psl = locr0[PS];
        !           329:        pcb->pcb_ksp = mfpr(KSP);
        !           330:        pcb->pcb_esp = mfpr(ISP);
        !           331:        pcb->pcb_p0br = (struct pte *)mfpr(P0BR);
        !           332:        pcb->pcb_p0lr = mfpr(P0LR);
        !           333:        pcb->pcb_p1br = (struct pte *)mfpr(P1BR);
        !           334:        pcb->pcb_p1lr = mfpr(P1LR);
        !           335: }
        !           336: 
        !           337: static
        !           338: setpcb(locr0)
        !           339:        register int *locr0;
        !           340: {
        !           341:        extern struct pcb kdbpcb;
        !           342:        register struct pcb *pcb = &kdbpcb;
        !           343: 
        !           344:        locr0[R0] = pcb->pcb_r0;
        !           345:        locr0[R1] = pcb->pcb_r1;
        !           346:        locr0[R2] = pcb->pcb_r2;
        !           347:        locr0[R3] = pcb->pcb_r3;
        !           348:        locr0[R4] = pcb->pcb_r4;
        !           349:        locr0[R5] = pcb->pcb_r5;
        !           350:        locr0[R6] = pcb->pcb_r6;
        !           351:        locr0[R7] = pcb->pcb_r7;
        !           352:        locr0[R8] = pcb->pcb_r8;
        !           353:        locr0[R9] = pcb->pcb_r9;
        !           354:        locr0[R10] = pcb->pcb_r10;
        !           355:        locr0[R11] = pcb->pcb_r11;
        !           356:        locr0[AP] = pcb->pcb_ap;
        !           357:        locr0[FP] = pcb->pcb_fp;
        !           358:        locr0[SP] = pcb->pcb_usp;
        !           359:        locr0[PC] = pcb->pcb_pc;
        !           360:        locr0[PS] = pcb->pcb_psl;
        !           361: }

unix.superglobalmegacorp.com

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