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