|
|
1.1 root 1: /*
2: * Copyright (c) 1986 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_print.c 7.16 (Berkeley) 5/3/90
7: */
8:
9: #include "machine/mtpr.h"
10: #undef ISP
11: #include "../kdb/defs.h"
12: #undef CTRL
13: #include "ioctl.h"
14: #include "tty.h"
15: #include "vnode.h"
16: #include "mount.h"
17:
18: char *BADRAD;
19:
20: ADDR lastframe;
21: ADDR callpc;
22:
23: char *BADMOD;
24: char *lp;
25: long maxpos;
26: int radix;
27: char lastc;
28:
29: /* breakpoints */
30: BKPTR bkpthead;
31:
32: extern REGLIST reglist[];
33:
34: /* general printing routines ($) */
35:
36: printtrace(modif)
37: {
38: register narg, i;
39: register BKPTR bkptr;
40: register ADDR word;
41: register char *comptr;
42: register ADDR argp, frame;
43: register struct nlist *sp;
44: int ntramp;
45: register struct proc *p;
46: extern struct proc *allproc;
47:
48: if (cntflg==0)
49: cntval = -1;
50: switch (modif) {
51:
52: case 'd':
53: if (adrflg) {
54: if (adrval < 2 || adrval > 16)
55: error(BADRAD);
56: radix = adrval;
57: }
58: printf("radix=%d base ten", radix);
59: break;
60:
61: case 'w': case 'W':
62: printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS));
63: break;
64:
65: case 's': case 'S':
66: printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF));
67: break;
68:
69: case 'V':
70: printf("variables\n");
71: for (i=0;i<=35;i++)
72: if (var[i]) {
73: printc((i<=9 ? '0' : 'a'-10) + i);
74: printf(" = %R\n",var[i]);
75: }
76: break;
77:
78: case 0: case '?':
79: if (p = (struct proc *)var[varchk('p')])
80: printf("pid = %d\n", p->p_pid);
81: else
82: printf("in idle loop\n");
83: printtrap(var[varchk('t')], var[varchk('c')]);
84: /* fall thru... */
85: case 'r': case 'R':
86: printregs(modif);
87: return;
88:
89: case 'c': case 'C':
90: if (adrflg) {
91: frame = adrval;
92: callpc = getprevpc(frame);
93: } else {
94: frame = pcb.pcb_fp;
95: callpc = pcb.pcb_pc;
96: }
97: lastframe = NOFRAME;
98: ntramp = 0;
99: while (cntval-- && frame != NOFRAME) {
100: char *name;
101:
102: chkerr();
103: /* check for pc in pcb (signal trampoline code) */
104: if (issignalpc(callpc)) {
105: name = "sigtramp";
106: ntramp++;
107: } else {
108: ntramp = 0;
109: (void) findsym((long)callpc, ISYM);
110: if (cursym)
111: name = cursym->n_un.n_name;
112: else
113: name = "?";
114: }
115: printf("%s(", name);
116: narg = getnargs(frame);
117: if (narg > 10)
118: narg = 10;
119: argp = frame;
120: if (ntramp != 1)
121: while (narg) {
122: printf("%R",
123: get((off_t)(argp = nextarg(argp)),
124: DSP));
125: if (--narg != 0)
126: printc(',');
127: }
128: printf(") at ");
129: psymoff((long)callpc, ISYM, "\n");
130:
131: if (modif=='C') {
132: while (localsym((long)frame)) {
133: word = get((off_t)localval, DSP);
134: printf("%8t%s:%10t",
135: cursym->n_un.n_name);
136: if (errflg) {
137: printf("?\n");
138: errflg = 0;
139: } else
140: printf("%R\n", word);
141: }
142: }
143: if (ntramp != 1) {
144: callpc = getprevpc(frame);
145: lastframe = frame;
146: frame = getprevframe(frame);
147: } else
148: callpc = getsignalpc(lastframe);
149: if (!adrflg && !INSTACK(frame))
150: break;
151: }
152: break;
153:
154: /*print externals*/
155: case 'e': case 'E':
156: for (sp = symtab; sp < esymtab; sp++)
157: if (sp->n_type==(N_DATA|N_EXT) ||
158: sp->n_type==(N_BSS|N_EXT))
159: printf("%s:%12t%R\n", sp->n_un.n_name,
160: get((off_t)sp->n_value, DSP));
161: break;
162:
163: /*print breakpoints*/
164: case 'b': case 'B':
165: printf("breakpoints\ncount%8tbkpt%24tcommand\n");
166: for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
167: if (bkptr->flag) {
168: printf("%-8.8d",bkptr->count);
169: psymoff((long)bkptr->loc,ISYM,"%24t");
170: comptr=bkptr->comm;
171: while (*comptr)
172: printc(*comptr++);
173: }
174: break;
175:
176: case 'k':
177: panic("kdb requested panic");
178: /* NOTREACHED */
179:
180: case 'l': {
181: struct pte savemmap;
182: extern char vmmap[];
183:
184: savemmap = mmap[0];
185: for (p = allproc; p; p = p->p_nxt) {
186: printf("%X pid %5d%c%5d %c ", p, p->p_pid,
187: p == (struct proc *)var[varchk('p')]? '*' : ' ',
188: p->p_ppid,
189: p->p_stat == SSLEEP ? 'S' :
190: p->p_stat == SRUN ? 'R':
191: p->p_stat == SIDL ? 'I':
192: p->p_stat == SSTOP ? 'T' : '?');
193: if (p->p_wchan)
194: psymoff((long)p->p_wchan, ISYM, "");
195: if ((p->p_flag & SLOAD) && p->p_addr) {
196: int i;
197: *(int *)mmap = *(int *)p->p_addr;
198: mtpr(TBIS, vmmap);
199: #define U ((struct user *)vmmap)
200: #ifdef not_until_uarea_completely_mapped
201: if (U->u_ttyp)
202: printf(" ctty %x ", U->u_ttyp);
203: #endif
204: printf(" %.8s ", p->p_comm);
205: #undef U
206: }
207:
208: printc(EOR);
209: }
210: mmap[0] = savemmap;
211: mtpr(TBIS, vmmap);
212: break;
213: }
214:
215: case 't': /* XXX - debug */
216: if (adrflg) {
217: printf("dev state rawq canq outq lwat hwat\n");
218:
219: #define T ((struct tty *)adrval)
220: printf("%x %x %d %d %d %d %d\n", T->t_dev,
221: T->t_state, T->t_rawq.c_cc,
222: T->t_canq.c_cc, T->t_outq.c_cc,
223: T->t_lowat, T->t_hiwat);
224: printf(" &rawq &canq &outq &outq.c_cf &rawq.c_cf\n");
225: printf(" %x %x %x %x %x \n", &T->t_rawq,
226: &T->t_canq, &T->t_outq, &T->t_outq.c_cf,
227: &T->t_rawq.c_cf);
228: #undef T
229: }
230:
231: case 'v': {
232: register struct mount *mp;
233: register struct vnode *vp;
234:
235: printf("Locked vnodes\n");
236: mp = rootfs;
237: do {
238: for (vp = mp->m_mounth; vp; vp = vp->v_mountf)
239: if (VOP_ISLOCKED(vp))
240: vprint((char *)0, vp);
241: mp = mp->m_next;
242: } while (mp != rootfs);
243: break;
244: }
245:
246: default:
247: error(BADMOD);
248: }
249: }
250:
251: static
252: printregs(c)
253: {
254: register REGPTR p;
255: ADDR v;
256:
257: for (p = reglist; p->rname; p++) {
258: if (c != 'R' && ishiddenreg(p))
259: continue;
260: v = *p->rkern;
261: printf("%s%6t%R %16t", p->rname, v);
262: valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM);
263: printc(EOR);
264: }
265: printpc();
266: }
267:
268: getreg(regnam)
269: {
270: register REGPTR p;
271: register char *regptr;
272: char *olp;
273:
274: olp = lp;
275: for (p = reglist; p->rname; p++) {
276: regptr = p->rname;
277: if (regnam == *regptr++) {
278: while (*regptr)
279: if (readchar() != *regptr++) {
280: --regptr;
281: break;
282: }
283: if (*regptr)
284: lp = olp;
285: else
286: return ((int)p->rkern);
287: }
288: }
289: lp = olp;
290: return (-1);
291: }
292:
293: printpc()
294: {
295:
296: psymoff((long)pcb.pcb_pc, ISYM, ":%16t");
297: printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP));
298: printc(EOR);
299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.