Annotation of 43BSDTahoe/sys/vax/kdb_machdep.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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