1 /* 2 * Copyright (c) 1986 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.5 (Berkeley) 12/15/86 7 */ 8 9 /* 10 * Trap handler - command loop entry point. 11 */ 12 #include "../kdb/defs.h" 13 14 char *NOEOR; 15 16 int executing; 17 char *lp; 18 19 char lastc; 20 21 ADDR userpc; 22 int lastcom; 23 24 ADDR maxoff = MAXOFF; 25 long maxpos = 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) 32 int type, code; 33 struct proc *curproc; 34 { 35 36 var[varchk('t')] = type; 37 var[varchk('c')] = code; 38 var[varchk('p')] = (int)curproc; 39 printtrap((long)type, (long)code); 40 userpc = dot = pcb.pcb_pc; 41 switch (setexit()) { 42 43 case SINGLE: 44 setsstep(); /* hardware single step */ 45 /* fall thru... */ 46 case CONTIN: 47 return (1); 48 case 0: 49 if (nextpcs(type)) 50 printf("breakpoint%16t"); 51 else 52 printf("stopped at%16t"); 53 printpc(); 54 break; 55 } 56 if (executing) 57 delbp(); 58 executing = 0; 59 for (;;) { 60 flushbuf(); 61 if (errflg) { 62 printf("%s\n", errflg); 63 errflg = 0; 64 } 65 if (mkfault) { 66 mkfault=0; 67 printc('\n'); 68 printf(DBNAME); 69 } 70 kdbwrite("kdb> ", 5); 71 lp=0; (void) rdc(); lp--; 72 (void) command((char *)0, lastcom); 73 if (lp && lastc!='\n') 74 error(NOEOR); 75 } 76 } 77 78 /* 79 * If there has been an error or a fault, take the error. 80 */ 81 chkerr() 82 { 83 if (errflg || mkfault) 84 error(errflg); 85 } 86 87 /* 88 * An error occurred; save the message for 89 * later printing, and reset to main command loop. 90 */ 91 error(n) 92 char *n; 93 { 94 95 errflg = n; 96 reset(ERROR); 97 } 98