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) 05/03/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 } 106