|
|
1.1 root 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) 5/3/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.