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 */
kdb(type,code,curproc,kstack)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 */
kdbchkerr()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 */
kdberror(n)99 kdberror(n)
100 char *n;
101 {
102
103 kdberrflg = n;
104 reset(ERROR);
105 }
106