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