|
|
1.1 root 1: /* @(#)kdb_machdep.c 7.3 (Berkeley) 5/19/88 */
2:
3: #include "param.h"
4: #include "conf.h"
5: #include "dir.h"
6: #include "user.h"
7: #include "proc.h"
8: #include "uio.h"
9: #include "systm.h"
10: #include "reboot.h"
11: #include "vmmac.h"
12: #include "ioctl.h"
13: #include "tty.h"
14:
15: #include "cpu.h"
16: #include "mtpr.h"
17: #include "psl.h"
18: #include "pte.h"
19: #include "reg.h"
20: #include "trap.h"
21: #include "kdbparam.h"
22:
23: #define KDBSPACE 1024 /* 1K of memory for breakpoint table */
24: static char kdbbuf[KDBSPACE];
25: static char *kdbend = kdbbuf;
26: /*
27: * Dynamically allocate space for the debugger.
28: */
29: char *
30: kdbmalloc(n)
31: u_int n;
32: {
33: char *old = kdbend;
34:
35: if (kdbend+n >= kdbbuf+KDBSPACE) {
36: printf("kdb: Out of space\n");
37: return ((char *)-1);
38: }
39: kdbend += n;
40: return (old);
41: }
42:
43: /*
44: * Initialize the kernel debugger.
45: */
46: kdb_init()
47: {
48: char *symtab, *strtab;
49: int strsize;
50: extern int end;
51:
52: kdbsetup();
53: if (bootesym > (char *)&end) {
54: symtab = (char *)&end + sizeof (int);
55: #define symsize *(int *)&end
56: strtab = symtab + symsize;
57: strsize = roundup(*(int *)strtab, sizeof (int));
58: if (strtab + strsize == bootesym) {
59: printf("[Preserving %d bytes of symbol information]\n",
60: symsize + strsize);
61: kdbsetsym(symtab, strtab, strtab, strsize);
62: } else
63: printf("kdb_init: bad bootesym %x, calculated %x\n",
64: bootesym, strtab + strsize);
65: }
66: /*
67: * If boot flags indicate, force entry into the debugger.
68: */
69: if ((boothowto&(RB_HALT|RB_KDB)) == (RB_HALT|RB_KDB))
70: setsoftkdb();
71: #undef symsize
72: }
73:
74: int kdbactive = 0;
75: #define ESC '\033'
76:
77: /*
78: * Process a keyboard interrupt from the console.
79: * We look for an escape sequence which signals
80: * a request to enter the debugger.
81: */
82: kdbrintr(c, tp)
83: int c;
84: struct tty *tp;
85: {
86: static int escape = 0;
87:
88: c &= 0177; /* strip parity also */
89: if (!escape)
90: return (c == ESC && ++escape);
91: escape = 0;
92: /*
93: * Transfer control to the debugger only if the
94: * system was booted with RB_KDB and the trap
95: * enable flag (RB_NOYSNC) is set.
96: */
97: if ((boothowto&(RB_KDB|RB_NOSYNC)) != (RB_KDB|RB_NOSYNC) ||
98: (c != 'k' && c != 'K' && c != CTRL('k'))) {
99: (*linesw[tp->t_line].l_rint)(ESC, tp);
100: return (0);
101: }
102: if (!kdbactive)
103: setsoftkdb();
104: return (1);
105: }
106:
107: static int
108: movpsl()
109: {
110:
111: asm(" movpsl r0"); /* XXX */
112: }
113:
114: #define TYPE SP+1
115: #define CODE PC-1
116: #define USER 040
117: static caddr_t kdbnofault; /* label for peek & poke */
118: /*
119: * Field a kdb-related trap or fault.
120: */
121: kdb_trap(apsl)
122: register int *apsl;
123: {
124: register int *locr0, type;
125: int code, retval;
126: static int prevtype = -1, prevcode;
127: extern char *trap_type[];
128: extern int TRAP_TYPES;
129:
130: /*
131: * Allow panic if the debugger is not enabled.
132: */
133: if ((boothowto&RB_KDB) == 0)
134: return (0);
135: locr0 = apsl - PS;
136: type = locr0[TYPE], code = locr0[CODE];
137: if (type == T_KDBTRAP && prevtype != -1) {
138: type = prevtype, code = prevcode;
139: prevtype = -1;
140: }
141: if (type != T_TRCTRAP && type != T_BPTFLT) {
142: /*
143: * Catch traps from kdbpeek and kdbpoke and perform
144: * non-local goto to error label setup in routines.
145: */
146: if (kdbnofault) {
147: locr0[PC] = (int)kdbnofault;
148: return (1);
149: }
150: type &= ~USER;
151: }
152: /*
153: * We prefer to run the debugger from the interrupt stack to
154: * avoid overflowing the kernel stack. Thus, if we're not
155: * currently on the interrupt stack and the ipl is low, schedule
156: * a software interrupt to force reentry on the interrupt stack
157: * immediately after the rei that'll take place on return.
158: */
159: if ((movpsl()&PSL_IS) == 0) {
160: int s = splhigh();
161: if (s < KDB_IPL) {
162: prevtype = type, prevcode = code;
163: setsoftkdb();
164: return (1);
165: }
166: splx(s);
167: printf("(from kernel stack)\n");
168: }
169: getpcb(locr0);
170: /*
171: * Mark debugger active and initiate input
172: * polling in the console device driver.
173: */
174: cnpoll(kdbactive = 1);
175: retval = kdb(type, code, noproc ? (struct proc *)0 : u.u_procp);
176: cnpoll(kdbactive = 0);
177: setpcb(locr0);
178: return (retval);
179: }
180:
181: static char *codenames[] = {
182: "code = 0",
183: "integer overflow",
184: "integer divide by zero",
185: "floating overflow",
186: "floating/decimal divide by zero",
187: "floating underflow",
188: "decimal overflow",
189: "subscript out of range",
190: "floating overflow",
191: "floating divide by zero",
192: "floating undeflow"
193: };
194: #define NCODES (sizeof (codenames) / sizeof (codenames[0]))
195:
196: /*
197: * Announce a trap.
198: */
199: kdbprinttrap(type, code)
200: int type, code;
201: {
202:
203: extern int TRAP_TYPES;
204: extern char *trap_type[];
205:
206: if (type != T_TRCTRAP && type != T_BPTFLT) {
207: if (type < TRAP_TYPES && trap_type[type])
208: printf(trap_type[type]);
209: else
210: printf("trap type %d", type);
211: if (type == T_ARITHTRAP && (unsigned)code < NCODES)
212: printf(", %s", code);
213: else if (code)
214: printf(", code = %d", code);
215: printf("\n");
216: }
217: }
218:
219: /*
220: * Read character from the console.
221: */
222: kdbreadc(cp)
223: char *cp;
224: {
225:
226: *cp = cngetc();
227: return (1);
228: }
229:
230: /*
231: * Write characters to the console.
232: */
233: kdbwrite(cp, len)
234: register char *cp;
235: register int len;
236: {
237:
238: while (len-- > 0)
239: cnputc(*cp++);
240: }
241:
242: /*
243: * Fetch a longword carefully.
244: */
245: kdbpeek(addr)
246: register caddr_t addr;
247: {
248: register long v = 0;
249:
250: asm("movab 1f,_kdbnofault");
251: v = *(long *)addr;
252: asm("1:");
253: kdbnofault = 0;
254: return (v);
255: }
256:
257: /*
258: * Put a longword carefully.
259: */
260: kdbpoke(addr, v)
261: register caddr_t addr;
262: long v;
263: {
264: register int pn, *pte, opte = 0;
265: extern char Sysbase[], etext;
266:
267: /*
268: * If we're writing to the kernel's text space,
269: * make the page writeable for the duration of
270: * the access.
271: */
272: if ((caddr_t)Sysbase <= addr && addr <= (caddr_t)&etext) {
273: pn = btop((int)addr &~ 0x80000000);
274: pte = (int *)&Sysmap[pn];
275: opte = *pte;
276: *pte = (*pte &~ PG_PROT)|PG_KW;
277: mtpr(TBIS, addr);
278: }
279: asm("movab 1f,_kdbnofault");
280: *(long *)addr = v;
281: asm("1:");
282: kdbnofault = 0;
283: if (opte) {
284: *pte = opte;
285: mtpr(TBIS, addr);
286: }
287: }
288:
289: static
290: getpcb(locr0)
291: register int *locr0;
292: {
293: extern struct pcb kdbpcb;
294: register struct pcb *pcb = &kdbpcb;
295:
296: pcb->pcb_r0 = locr0[R0];
297: pcb->pcb_r1 = locr0[R1];
298: pcb->pcb_r2 = locr0[R2];
299: pcb->pcb_r3 = locr0[R3];
300: pcb->pcb_r4 = locr0[R4];
301: pcb->pcb_r5 = locr0[R5];
302: pcb->pcb_r6 = locr0[R6];
303: pcb->pcb_r7 = locr0[R7];
304: pcb->pcb_r8 = locr0[R8];
305: pcb->pcb_r9 = locr0[R9];
306: pcb->pcb_r10 = locr0[R10];
307: pcb->pcb_r11 = locr0[R11];
308: pcb->pcb_ap = locr0[AP];
309: pcb->pcb_fp = locr0[FP];
310: pcb->pcb_usp = locr0[SP];
311: pcb->pcb_pc = locr0[PC];
312: pcb->pcb_psl = locr0[PS];
313: pcb->pcb_ksp = mfpr(KSP);
314: pcb->pcb_esp = mfpr(ISP);
315: pcb->pcb_p0br = (struct pte *)mfpr(P0BR);
316: pcb->pcb_p0lr = mfpr(P0LR);
317: pcb->pcb_p1br = (struct pte *)mfpr(P1BR);
318: pcb->pcb_p1lr = mfpr(P1LR);
319: }
320:
321: static
322: setpcb(locr0)
323: register int *locr0;
324: {
325: extern struct pcb kdbpcb;
326: register struct pcb *pcb = &kdbpcb;
327:
328: locr0[R0] = pcb->pcb_r0;
329: locr0[R1] = pcb->pcb_r1;
330: locr0[R2] = pcb->pcb_r2;
331: locr0[R3] = pcb->pcb_r3;
332: locr0[R4] = pcb->pcb_r4;
333: locr0[R5] = pcb->pcb_r5;
334: locr0[R6] = pcb->pcb_r6;
335: locr0[R7] = pcb->pcb_r7;
336: locr0[R8] = pcb->pcb_r8;
337: locr0[R9] = pcb->pcb_r9;
338: locr0[R10] = pcb->pcb_r10;
339: locr0[R11] = pcb->pcb_r11;
340: locr0[AP] = pcb->pcb_ap;
341: locr0[FP] = pcb->pcb_fp;
342: locr0[SP] = pcb->pcb_usp;
343: locr0[PC] = pcb->pcb_pc;
344: locr0[PS] = pcb->pcb_psl;
345: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.