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