Commit | Line | Data |
---|---|---|
9d61b7ff SL |
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 | * | |
d7070096 | 6 | * @(#)kdb_print.c 7.22 (Berkeley) %G% |
9d61b7ff | 7 | */ |
3a7e1670 | 8 | |
dbdee9f3 MT |
9 | #include "machine/mtpr.h" |
10 | #undef ISP | |
b28b3a13 | 11 | #undef TB |
3a7e1670 | 12 | #include "../kdb/defs.h" |
dbdee9f3 | 13 | #undef CTRL |
bcb86c63 | 14 | #include "ioctl.h" |
dbdee9f3 | 15 | #include "tty.h" |
50155fbb | 16 | #include "vnode.h" |
8f6abf4c | 17 | #include "mount.h" |
3a7e1670 | 18 | |
addd5f13 | 19 | char *kdbBADRAD; |
54917220 | 20 | |
addd5f13 KS |
21 | char *kdbBADMOD; |
22 | char *kdblp; | |
23 | long kdbmaxpos; | |
24 | int kdbradix; | |
25 | char kdblastc; | |
3a7e1670 SL |
26 | |
27 | /* breakpoints */ | |
addd5f13 | 28 | BKPTR kdbbkpthead; |
3a7e1670 | 29 | |
addd5f13 | 30 | extern REGLIST kdbreglist[]; |
3a7e1670 SL |
31 | |
32 | /* general printing routines ($) */ | |
33 | ||
addd5f13 | 34 | kdbprinttrace(modif) |
3a7e1670 | 35 | { |
1949726e | 36 | register int i; |
3a7e1670 | 37 | register BKPTR bkptr; |
3a7e1670 | 38 | register char *comptr; |
3a7e1670 | 39 | register struct nlist *sp; |
bcb86c63 | 40 | register struct proc *p; |
4e198681 | 41 | extern struct proc *allproc; |
3a7e1670 | 42 | |
addd5f13 KS |
43 | if (kdbcntflg==0) |
44 | kdbcntval = -1; | |
3a7e1670 SL |
45 | switch (modif) { |
46 | ||
47 | case 'd': | |
addd5f13 KS |
48 | if (kdbadrflg) { |
49 | if (kdbadrval < 2 || kdbadrval > 16) | |
50 | kdberror(kdbBADRAD); | |
51 | kdbradix = kdbadrval; | |
3a7e1670 | 52 | } |
addd5f13 | 53 | kdbprintf("radix=%d base ten", kdbradix); |
3a7e1670 SL |
54 | break; |
55 | ||
56 | case 'w': case 'W': | |
addd5f13 | 57 | kdbprintf("maxpos=%d", kdbmaxpos=(kdbadrflg?kdbadrval:MAXPOS)); |
3a7e1670 SL |
58 | break; |
59 | ||
60 | case 's': case 'S': | |
addd5f13 | 61 | kdbprintf("maxoff=%d", kdbmaxoff=(kdbadrflg?kdbadrval:MAXOFF)); |
3a7e1670 SL |
62 | break; |
63 | ||
2bec3707 | 64 | case 'V': |
addd5f13 | 65 | kdbprintf("variables\n"); |
3a7e1670 | 66 | for (i=0;i<=35;i++) |
addd5f13 KS |
67 | if (kdbvar[i]) { |
68 | kdbprintc((i<=9 ? '0' : 'a'-10) + i); | |
69 | kdbprintf(" = %R\n",kdbvar[i]); | |
3a7e1670 SL |
70 | } |
71 | break; | |
72 | ||
73 | case 0: case '?': | |
addd5f13 KS |
74 | if (p = (struct proc *)kdbvar[kdbvarchk('p')]) |
75 | kdbprintf("pid = %d\n", p->p_pid); | |
4e198681 | 76 | else |
addd5f13 KS |
77 | kdbprintf("in idle loop\n"); |
78 | kdbprinttrap(kdbvar[kdbvarchk('t')], kdbvar[kdbvarchk('c')]); | |
4e198681 | 79 | /* fall thru... */ |
3a7e1670 | 80 | case 'r': case 'R': |
addd5f13 | 81 | kdbprintregs(modif); |
3a7e1670 SL |
82 | return; |
83 | ||
84 | case 'c': case 'C': | |
1949726e | 85 | kdbstacktrace(modif == 'C'); |
3a7e1670 SL |
86 | break; |
87 | ||
88 | /*print externals*/ | |
89 | case 'e': case 'E': | |
addd5f13 | 90 | for (sp = kdbsymtab; sp < kdbesymtab; sp++) |
3a7e1670 SL |
91 | if (sp->n_type==(N_DATA|N_EXT) || |
92 | sp->n_type==(N_BSS|N_EXT)) | |
addd5f13 KS |
93 | kdbprintf("%s:%12t%R\n", sp->n_un.n_name, |
94 | kdbget((off_t)sp->n_value, DSP)); | |
3a7e1670 SL |
95 | break; |
96 | ||
97 | /*print breakpoints*/ | |
98 | case 'b': case 'B': | |
addd5f13 KS |
99 | kdbprintf("breakpoints\ncount%8tbkpt%24tcommand\n"); |
100 | for (bkptr=kdbbkpthead; bkptr; bkptr=bkptr->nxtbkpt) | |
3a7e1670 | 101 | if (bkptr->flag) { |
addd5f13 KS |
102 | kdbprintf("%-8.8d",bkptr->count); |
103 | kdbpsymoff((long)bkptr->loc,ISYM,"%24t"); | |
3a7e1670 SL |
104 | comptr=bkptr->comm; |
105 | while (*comptr) | |
addd5f13 | 106 | kdbprintc(*comptr++); |
3a7e1670 SL |
107 | } |
108 | break; | |
109 | ||
7fbd3812 KM |
110 | case 'k': |
111 | panic("kdb requested panic"); | |
112 | /* NOTREACHED */ | |
113 | ||
dbdee9f3 MT |
114 | case 'l': { |
115 | struct pte savemmap; | |
116 | extern char vmmap[]; | |
117 | ||
118 | savemmap = mmap[0]; | |
3a7e1670 | 119 | for (p = allproc; p; p = p->p_nxt) { |
d7070096 | 120 | kdbprintf("%lx pid %5d%c%5d %c ", p, p->p_pid, |
addd5f13 | 121 | p == (struct proc *)kdbvar[kdbvarchk('p')]? '*' : ' ', |
bcb86c63 | 122 | p->p_ppid, |
3a7e1670 SL |
123 | p->p_stat == SSLEEP ? 'S' : |
124 | p->p_stat == SRUN ? 'R': | |
125 | p->p_stat == SIDL ? 'I': | |
126 | p->p_stat == SSTOP ? 'T' : '?'); | |
bcb86c63 | 127 | if (p->p_wchan) |
addd5f13 | 128 | kdbpsymoff((long)p->p_wchan, ISYM, ""); |
dbdee9f3 MT |
129 | if ((p->p_flag & SLOAD) && p->p_addr) { |
130 | int i; | |
131 | *(int *)mmap = *(int *)p->p_addr; | |
132 | mtpr(TBIS, vmmap); | |
133 | #define U ((struct user *)vmmap) | |
134 | #ifdef not_until_uarea_completely_mapped | |
135 | if (U->u_ttyp) | |
addd5f13 | 136 | kdbprintf(" ctty %x ", U->u_ttyp); |
dbdee9f3 | 137 | #endif |
addd5f13 | 138 | kdbprintf(" %.8s ", p->p_comm); |
dbdee9f3 MT |
139 | #undef U |
140 | } | |
141 | ||
addd5f13 | 142 | kdbprintc(EOR); |
3a7e1670 | 143 | } |
dbdee9f3 MT |
144 | mmap[0] = savemmap; |
145 | mtpr(TBIS, vmmap); | |
3a7e1670 | 146 | break; |
dbdee9f3 MT |
147 | } |
148 | ||
149 | case 't': /* XXX - debug */ | |
addd5f13 KS |
150 | if (kdbadrflg) { |
151 | kdbprintf("dev state rawq canq outq lwat hwat\n"); | |
dbdee9f3 | 152 | |
addd5f13 KS |
153 | #define T ((struct tty *)kdbadrval) |
154 | kdbprintf("%x %x %d %d %d %d %d\n", T->t_dev, | |
dbdee9f3 MT |
155 | T->t_state, T->t_rawq.c_cc, |
156 | T->t_canq.c_cc, T->t_outq.c_cc, | |
157 | T->t_lowat, T->t_hiwat); | |
addd5f13 KS |
158 | kdbprintf(" &rawq &canq &outq &outq.c_cf &rawq.c_cf\n"); |
159 | kdbprintf(" %x %x %x %x %x \n", &T->t_rawq, | |
dbdee9f3 MT |
160 | &T->t_canq, &T->t_outq, &T->t_outq.c_cf, |
161 | &T->t_rawq.c_cf); | |
162 | #undef T | |
163 | } | |
3a7e1670 | 164 | |
431d3966 KM |
165 | #ifdef DEBUG |
166 | case 'v': | |
167 | printlockedvnodes(); | |
2bec3707 | 168 | break; |
431d3966 | 169 | #endif |
2bec3707 | 170 | |
3a7e1670 | 171 | default: |
addd5f13 | 172 | kdberror(kdbBADMOD); |
3a7e1670 SL |
173 | } |
174 | } | |
175 | ||
176 | static | |
addd5f13 | 177 | kdbprintregs(c) |
3a7e1670 SL |
178 | { |
179 | register REGPTR p; | |
180 | ADDR v; | |
181 | ||
addd5f13 | 182 | for (p = kdbreglist; p->rname; p++) { |
40abac8c | 183 | if (c != 'R' && ishiddenreg(p)) |
3a7e1670 | 184 | continue; |
3a7e1670 | 185 | v = *p->rkern; |
addd5f13 KS |
186 | kdbprintf("%s%6t%R %16t", p->rname, v); |
187 | kdbvalpr((long)v, p->rkern == &kdbpcb.pcb_pc ? ISYM : DSYM); | |
188 | kdbprintc(EOR); | |
3a7e1670 | 189 | } |
addd5f13 | 190 | kdbprintpc(); |
3a7e1670 SL |
191 | } |
192 | ||
addd5f13 | 193 | kdbgetreg(regnam) |
3a7e1670 SL |
194 | { |
195 | register REGPTR p; | |
196 | register char *regptr; | |
197 | char *olp; | |
198 | ||
addd5f13 KS |
199 | olp = kdblp; |
200 | for (p = kdbreglist; p->rname; p++) { | |
40abac8c | 201 | regptr = p->rname; |
3a7e1670 SL |
202 | if (regnam == *regptr++) { |
203 | while (*regptr) | |
addd5f13 | 204 | if (kdbreadchar() != *regptr++) { |
3a7e1670 SL |
205 | --regptr; |
206 | break; | |
207 | } | |
208 | if (*regptr) | |
addd5f13 | 209 | kdblp = olp; |
3a7e1670 | 210 | else |
40abac8c | 211 | return ((int)p->rkern); |
3a7e1670 SL |
212 | } |
213 | } | |
addd5f13 | 214 | kdblp = olp; |
3a7e1670 SL |
215 | return (-1); |
216 | } | |
217 | ||
addd5f13 | 218 | kdbprintpc() |
3a7e1670 SL |
219 | { |
220 | ||
addd5f13 KS |
221 | kdbpsymoff((long)kdbpcb.pcb_pc, ISYM, ":%16t"); |
222 | kdbprintins(ISP, (long)kdbchkget((off_t)kdbpcb.pcb_pc, ISP)); | |
223 | kdbprintc(EOR); | |
3a7e1670 | 224 | } |