xref: /csrg-svn/sys/deprecated/kdb/kdb_trap.c (revision 41340)
130296Ssam /*
238917Skarels  * Copyright (c) 1986, 1989 Regents of the University of California.
330296Ssam  * All rights reserved.  The Berkeley software License Agreement
430296Ssam  * specifies the terms and conditions for redistribution.
530296Ssam  *
6*41340Ssklower  *	@(#)kdb_trap.c	7.8 (Berkeley) 05/03/90
730296Ssam  */
830113Ssam 
930113Ssam /*
1030113Ssam  * Trap handler - command loop entry point.
1130113Ssam  */
1230113Ssam #include "../kdb/defs.h"
1330113Ssam 
14*41340Ssklower char	*kdbNOEOR;
1530113Ssam 
16*41340Ssklower int	kdbexecuting;
17*41340Ssklower char	*kdblp;
1830113Ssam 
19*41340Ssklower char	kdblastc;
2030113Ssam 
21*41340Ssklower ADDR	kdbuserpc;
22*41340Ssklower int	kdblastcom;
2330113Ssam 
24*41340Ssklower ADDR	kdbmaxoff = MAXOFF;
25*41340Ssklower long	kdbmaxpos = MAXPOS;
2630113Ssam 
2730127Ssam /*
2830127Ssam  * Kdb trap handler; entered on all fatal
2930127Ssam  * and/or debugger related traps or faults.
3030127Ssam  */
kdb(type,code,curproc,kstack)3140730Skarels kdb(type, code, curproc, kstack)
3230127Ssam 	int type, code;
3330113Ssam 	struct proc *curproc;
3440730Skarels 	int kstack;
3530113Ssam {
3630113Ssam 
37*41340Ssklower 	kdbvar[kdbvarchk('t')] = type;
38*41340Ssklower 	kdbvar[kdbvarchk('c')] = code;
39*41340Ssklower 	kdbvar[kdbvarchk('p')] = (int)curproc;
40*41340Ssklower 	if (kdbexecuting)
41*41340Ssklower 		kdbdelbp();
42*41340Ssklower 	kdbexecuting = 0;
4340730Skarels 	if (kstack)
44*41340Ssklower 		kdbprintf("(from kernel stack)\n"); /* after delbp() */
45*41340Ssklower 	kdbprinttrap((long)type, (long)code);
46*41340Ssklower 	kdbuserpc = kdbdot = kdbpcb.pcb_pc;
4730113Ssam 	switch (setexit()) {
4830113Ssam 
4930113Ssam 	case SINGLE:
5030136Ssam 		setsstep();		/* hardware single step */
5130113Ssam 		/* fall thru... */
5230113Ssam 	case CONTIN:
5330113Ssam 		return (1);
5438917Skarels 	case PANIC:
5538917Skarels 		return (0);
5630113Ssam 	case 0:
57*41340Ssklower 		if (kdbnextpcs(type))
58*41340Ssklower 			kdbprintf("breakpoint%16t");
5930113Ssam 		else
60*41340Ssklower 			kdbprintf("stopped at%16t");
61*41340Ssklower 		kdbprintpc();
6230113Ssam 		break;
6330113Ssam 	}
64*41340Ssklower 	if (kdbexecuting)
65*41340Ssklower 		kdbdelbp();
66*41340Ssklower 	kdbexecuting = 0;
6730113Ssam 	for (;;) {
68*41340Ssklower 		kdbflushbuf();
69*41340Ssklower 		if (kdberrflg) {
70*41340Ssklower 			kdbprintf("%s\n", kdberrflg);
71*41340Ssklower 			kdberrflg = 0;
7230113Ssam 		}
73*41340Ssklower 		if (kdbmkfault) {
74*41340Ssklower 			kdbmkfault=0;
75*41340Ssklower 			kdbprintc('\n');
76*41340Ssklower 			kdbprintf(DBNAME);
7730113Ssam 		}
7830113Ssam 		kdbwrite("kdb> ", 5);
79*41340Ssklower 		kdblp=0; (void) kdbrdc(); kdblp--;
80*41340Ssklower 		(void) kdbcommand((char *)0, kdblastcom);
81*41340Ssklower 		if (kdblp && kdblastc!='\n')
82*41340Ssklower 			kdberror(kdbNOEOR);
8330113Ssam 	}
8430113Ssam }
8530113Ssam 
8630113Ssam /*
8730113Ssam  * If there has been an error or a fault, take the error.
8830113Ssam  */
kdbchkerr()89*41340Ssklower kdbchkerr()
9030113Ssam {
91*41340Ssklower 	if (kdberrflg || kdbmkfault)
92*41340Ssklower 		kdberror(kdberrflg);
9330113Ssam }
9430113Ssam 
9530113Ssam /*
9630113Ssam  * An error occurred; save the message for
9730113Ssam  * later printing, and reset to main command loop.
9830113Ssam  */
kdberror(n)99*41340Ssklower kdberror(n)
10030113Ssam 	char *n;
10130113Ssam {
10230113Ssam 
103*41340Ssklower 	kdberrflg = n;
10430123Ssam 	reset(ERROR);
10530113Ssam }
106