xref: /csrg-svn/sys/deprecated/kdb/kdb_print.c (revision 39378)
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.11 (Berkeley) 10/24/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 "../ufs/inode.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': 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 'i': {
177 		register struct vnode *vp;
178 		register struct inode *ip;
179 
180 		printf("Locked inodes\n");
181 		for (vp = vnode; vp < vnodeNVNODE; vp++) {
182 			if (vp->v_tag != VT_UFS)
183 				continue;
184 			ip = VTOI(vp);
185 			if ((ip->i_flag & ILOCKED) == 0)
186 				continue;
187 			printf("inode %d dev 0x%x type %d\n", ip->i_number,
188 				ip->i_dev, ITOV(ip)->v_type);
189 		}
190 		break;
191 	}
192 
193 	case 'k':
194 		panic("kdb requested panic");
195 		/* NOTREACHED */
196 
197 	case 'l': {
198 		struct pte savemmap;
199 		extern char vmmap[];
200 
201 		savemmap = mmap[0];
202 		for (p = allproc; p; p = p->p_nxt) {
203 			printf("%X pid %5d%c%5d %c ", p, p->p_pid,
204 				p == (struct proc *)var[varchk('p')]? '*' : ' ',
205 				p->p_ppid,
206 				p->p_stat == SSLEEP ? 'S' :
207 				p->p_stat == SRUN ? 'R':
208 				p->p_stat == SIDL ? 'I':
209 				p->p_stat == SSTOP ? 'T' : '?');
210 			if (p->p_wchan)
211 				psymoff((long)p->p_wchan, ISYM, "");
212 			if ((p->p_flag & SLOAD) && p->p_addr) {
213 				int i;
214 				*(int *)mmap = *(int *)p->p_addr;
215 				mtpr(TBIS, vmmap);
216 #define U	((struct user *)vmmap)
217 #ifdef not_until_uarea_completely_mapped
218 				if (U->u_ttyp)
219 					printf(" ctty %x ", U->u_ttyp);
220 #endif
221 				printf(" %.8s ", U->u_comm);
222 #undef U
223 			}
224 
225 			printc(EOR);
226 		}
227 		mmap[0] = savemmap;
228 		mtpr(TBIS, vmmap);
229 		break;
230 	}
231 
232 	case 't':	/* XXX - debug */
233 		if (adrflg) {
234 		      printf("dev       state  rawq   canq  outq  lwat hwat\n");
235 
236 #define T	((struct tty *)adrval)
237 			printf("%x  %x %d %d %d %d %d\n", T->t_dev,
238 				T->t_state, T->t_rawq.c_cc,
239 				T->t_canq.c_cc, T->t_outq.c_cc,
240 				T->t_lowat, T->t_hiwat);
241 	       printf(" &rawq    &canq      &outq    &outq.c_cf  &rawq.c_cf\n");
242 	       		printf(" %x %x  %x %x %x \n", &T->t_rawq,
243 				&T->t_canq, &T->t_outq, &T->t_outq.c_cf,
244 				&T->t_rawq.c_cf);
245 #undef T
246 		}
247 
248 	default:
249 		error(BADMOD);
250 	}
251 }
252 
253 static
254 printregs(c)
255 {
256 	register REGPTR	p;
257 	ADDR v;
258 
259 	for (p = reglist; p->rname; p++) {
260 		if (c != 'R' && ishiddenreg(p))
261 			continue;
262 		v = *p->rkern;
263 		printf("%s%6t%R %16t", p->rname, v);
264 		valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM);
265 		printc(EOR);
266 	}
267 	printpc();
268 }
269 
270 getreg(regnam)
271 {
272 	register REGPTR	p;
273 	register char *regptr;
274 	char *olp;
275 
276 	olp = lp;
277 	for (p = reglist; p->rname; p++) {
278 		regptr = p->rname;
279 		if (regnam == *regptr++) {
280 			while (*regptr)
281 				if (readchar() != *regptr++) {
282 					--regptr;
283 					break;
284 				}
285 			if (*regptr)
286 				lp = olp;
287 			else
288 				return ((int)p->rkern);
289 		}
290 	}
291 	lp = olp;
292 	return (-1);
293 }
294 
295 printpc()
296 {
297 
298 	psymoff((long)pcb.pcb_pc, ISYM, ":%16t");
299 	printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP));
300 	printc(EOR);
301 }
302