xref: /original-bsd/sys/deprecated/kdb/kdb_print.c (revision 9fa17c5f)
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) 06/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 }
233