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