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