|
|
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.19 (Berkeley) 6/22/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 *kdbBADRAD;
19:
20: char *kdbBADMOD;
21: char *kdblp;
22: long kdbmaxpos;
23: int kdbradix;
24: char kdblastc;
25:
26: /* breakpoints */
27: BKPTR kdbbkpthead;
28:
29: extern REGLIST kdbreglist[];
30:
31: /* general printing routines ($) */
32:
33: kdbprinttrace(modif)
34: {
35: register int i;
36: register BKPTR bkptr;
37: register char *comptr;
38: register struct nlist *sp;
39: register struct proc *p;
40: extern struct proc *allproc;
41:
42: if (kdbcntflg==0)
43: kdbcntval = -1;
44: switch (modif) {
45:
46: case 'd':
47: if (kdbadrflg) {
48: if (kdbadrval < 2 || kdbadrval > 16)
49: kdberror(kdbBADRAD);
50: kdbradix = kdbadrval;
51: }
52: kdbprintf("radix=%d base ten", kdbradix);
53: break;
54:
55: case 'w': case 'W':
56: kdbprintf("maxpos=%d", kdbmaxpos=(kdbadrflg?kdbadrval:MAXPOS));
57: break;
58:
59: case 's': case 'S':
60: kdbprintf("maxoff=%d", kdbmaxoff=(kdbadrflg?kdbadrval:MAXOFF));
61: break;
62:
63: case 'V':
64: kdbprintf("variables\n");
65: for (i=0;i<=35;i++)
66: if (kdbvar[i]) {
67: kdbprintc((i<=9 ? '0' : 'a'-10) + i);
68: kdbprintf(" = %R\n",kdbvar[i]);
69: }
70: break;
71:
72: case 0: case '?':
73: if (p = (struct proc *)kdbvar[kdbvarchk('p')])
74: kdbprintf("pid = %d\n", p->p_pid);
75: else
76: kdbprintf("in idle loop\n");
77: kdbprinttrap(kdbvar[kdbvarchk('t')], kdbvar[kdbvarchk('c')]);
78: /* fall thru... */
79: case 'r': case 'R':
80: kdbprintregs(modif);
81: return;
82:
83: case 'c': case 'C':
84: kdbstacktrace(modif == 'C');
85: break;
86:
87: /*print externals*/
88: case 'e': case 'E':
89: for (sp = kdbsymtab; sp < kdbesymtab; sp++)
90: if (sp->n_type==(N_DATA|N_EXT) ||
91: sp->n_type==(N_BSS|N_EXT))
92: kdbprintf("%s:%12t%R\n", sp->n_un.n_name,
93: kdbget((off_t)sp->n_value, DSP));
94: break;
95:
96: /*print breakpoints*/
97: case 'b': case 'B':
98: kdbprintf("breakpoints\ncount%8tbkpt%24tcommand\n");
99: for (bkptr=kdbbkpthead; bkptr; bkptr=bkptr->nxtbkpt)
100: if (bkptr->flag) {
101: kdbprintf("%-8.8d",bkptr->count);
102: kdbpsymoff((long)bkptr->loc,ISYM,"%24t");
103: comptr=bkptr->comm;
104: while (*comptr)
105: kdbprintc(*comptr++);
106: }
107: break;
108:
109: case 'k':
110: panic("kdb requested panic");
111: /* NOTREACHED */
112:
113: case 'l': {
114: struct pte savemmap;
115: extern char vmmap[];
116:
117: savemmap = mmap[0];
118: for (p = allproc; p; p = p->p_nxt) {
119: kdbprintf("%X pid %5d%c%5d %c ", p, p->p_pid,
120: p == (struct proc *)kdbvar[kdbvarchk('p')]? '*' : ' ',
121: p->p_ppid,
122: p->p_stat == SSLEEP ? 'S' :
123: p->p_stat == SRUN ? 'R':
124: p->p_stat == SIDL ? 'I':
125: p->p_stat == SSTOP ? 'T' : '?');
126: if (p->p_wchan)
127: kdbpsymoff((long)p->p_wchan, ISYM, "");
128: if ((p->p_flag & SLOAD) && p->p_addr) {
129: int i;
130: *(int *)mmap = *(int *)p->p_addr;
131: mtpr(TBIS, vmmap);
132: #define U ((struct user *)vmmap)
133: #ifdef not_until_uarea_completely_mapped
134: if (U->u_ttyp)
135: kdbprintf(" ctty %x ", U->u_ttyp);
136: #endif
137: kdbprintf(" %.8s ", p->p_comm);
138: #undef U
139: }
140:
141: kdbprintc(EOR);
142: }
143: mmap[0] = savemmap;
144: mtpr(TBIS, vmmap);
145: break;
146: }
147:
148: case 't': /* XXX - debug */
149: if (kdbadrflg) {
150: kdbprintf("dev state rawq canq outq lwat hwat\n");
151:
152: #define T ((struct tty *)kdbadrval)
153: kdbprintf("%x %x %d %d %d %d %d\n", T->t_dev,
154: T->t_state, T->t_rawq.c_cc,
155: T->t_canq.c_cc, T->t_outq.c_cc,
156: T->t_lowat, T->t_hiwat);
157: kdbprintf(" &rawq &canq &outq &outq.c_cf &rawq.c_cf\n");
158: kdbprintf(" %x %x %x %x %x \n", &T->t_rawq,
159: &T->t_canq, &T->t_outq, &T->t_outq.c_cf,
160: &T->t_rawq.c_cf);
161: #undef T
162: }
163:
164: case 'v': {
165: register struct mount *mp;
166: register struct vnode *vp;
167:
168: kdbprintf("Locked vnodes\n");
169: mp = rootfs;
170: do {
171: for (vp = mp->mnt_mounth; vp; vp = vp->v_mountf)
172: if (VOP_ISLOCKED(vp))
173: vprint((char *)0, vp);
174: mp = mp->mnt_next;
175: } while (mp != rootfs);
176: break;
177: }
178:
179: default:
180: kdberror(kdbBADMOD);
181: }
182: }
183:
184: static
185: kdbprintregs(c)
186: {
187: register REGPTR p;
188: ADDR v;
189:
190: for (p = kdbreglist; p->rname; p++) {
191: if (c != 'R' && ishiddenreg(p))
192: continue;
193: v = *p->rkern;
194: kdbprintf("%s%6t%R %16t", p->rname, v);
195: kdbvalpr((long)v, p->rkern == &kdbpcb.pcb_pc ? ISYM : DSYM);
196: kdbprintc(EOR);
197: }
198: kdbprintpc();
199: }
200:
201: kdbgetreg(regnam)
202: {
203: register REGPTR p;
204: register char *regptr;
205: char *olp;
206:
207: olp = kdblp;
208: for (p = kdbreglist; p->rname; p++) {
209: regptr = p->rname;
210: if (regnam == *regptr++) {
211: while (*regptr)
212: if (kdbreadchar() != *regptr++) {
213: --regptr;
214: break;
215: }
216: if (*regptr)
217: kdblp = olp;
218: else
219: return ((int)p->rkern);
220: }
221: }
222: kdblp = olp;
223: return (-1);
224: }
225:
226: kdbprintpc()
227: {
228:
229: kdbpsymoff((long)kdbpcb.pcb_pc, ISYM, ":%16t");
230: kdbprintins(ISP, (long)kdbchkget((off_t)kdbpcb.pcb_pc, ISP));
231: kdbprintc(EOR);
232: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.