|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986, 1989 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)kdb_trap.c 7.8 (Berkeley) 5/3/90 ! 7: */ ! 8: ! 9: /* ! 10: * Trap handler - command loop entry point. ! 11: */ ! 12: #include "../kdb/defs.h" ! 13: ! 14: char *kdbNOEOR; ! 15: ! 16: int kdbexecuting; ! 17: char *kdblp; ! 18: ! 19: char kdblastc; ! 20: ! 21: ADDR kdbuserpc; ! 22: int kdblastcom; ! 23: ! 24: ADDR kdbmaxoff = MAXOFF; ! 25: long kdbmaxpos = MAXPOS; ! 26: ! 27: /* ! 28: * Kdb trap handler; entered on all fatal ! 29: * and/or debugger related traps or faults. ! 30: */ ! 31: kdb(type, code, curproc, kstack) ! 32: int type, code; ! 33: struct proc *curproc; ! 34: int kstack; ! 35: { ! 36: ! 37: kdbvar[kdbvarchk('t')] = type; ! 38: kdbvar[kdbvarchk('c')] = code; ! 39: kdbvar[kdbvarchk('p')] = (int)curproc; ! 40: if (kdbexecuting) ! 41: kdbdelbp(); ! 42: kdbexecuting = 0; ! 43: if (kstack) ! 44: kdbprintf("(from kernel stack)\n"); /* after delbp() */ ! 45: kdbprinttrap((long)type, (long)code); ! 46: kdbuserpc = kdbdot = kdbpcb.pcb_pc; ! 47: switch (setexit()) { ! 48: ! 49: case SINGLE: ! 50: setsstep(); /* hardware single step */ ! 51: /* fall thru... */ ! 52: case CONTIN: ! 53: return (1); ! 54: case PANIC: ! 55: return (0); ! 56: case 0: ! 57: if (kdbnextpcs(type)) ! 58: kdbprintf("breakpoint%16t"); ! 59: else ! 60: kdbprintf("stopped at%16t"); ! 61: kdbprintpc(); ! 62: break; ! 63: } ! 64: if (kdbexecuting) ! 65: kdbdelbp(); ! 66: kdbexecuting = 0; ! 67: for (;;) { ! 68: kdbflushbuf(); ! 69: if (kdberrflg) { ! 70: kdbprintf("%s\n", kdberrflg); ! 71: kdberrflg = 0; ! 72: } ! 73: if (kdbmkfault) { ! 74: kdbmkfault=0; ! 75: kdbprintc('\n'); ! 76: kdbprintf(DBNAME); ! 77: } ! 78: kdbwrite("kdb> ", 5); ! 79: kdblp=0; (void) kdbrdc(); kdblp--; ! 80: (void) kdbcommand((char *)0, kdblastcom); ! 81: if (kdblp && kdblastc!='\n') ! 82: kdberror(kdbNOEOR); ! 83: } ! 84: } ! 85: ! 86: /* ! 87: * If there has been an error or a fault, take the error. ! 88: */ ! 89: kdbchkerr() ! 90: { ! 91: if (kdberrflg || kdbmkfault) ! 92: kdberror(kdberrflg); ! 93: } ! 94: ! 95: /* ! 96: * An error occurred; save the message for ! 97: * later printing, and reset to main command loop. ! 98: */ ! 99: kdberror(n) ! 100: char *n; ! 101: { ! 102: ! 103: kdberrflg = n; ! 104: reset(ERROR); ! 105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.