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