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