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