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