xref: /original-bsd/sys/deprecated/kdb/kdb_trap.c (revision e21485a6)
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