1 #ifndef lint 2 static char sccsid[] = "@(#)print.c 5.3 (Berkeley) 04/09/89"; 3 #endif 4 5 /* 6 * adb - printing routines 7 */ 8 9 #include "defs.h" 10 #include <sys/file.h> 11 12 extern char LONGFIL[]; 13 extern char NOTOPEN[]; 14 extern char BADMOD[]; 15 16 int infile; /* XXX */ 17 int outfile; /* XXX */ 18 19 off_t lseek(); 20 21 /* general printing routines ($) */ 22 23 printtrace(modif) 24 int modif; 25 { 26 int stack, i; 27 28 switch (modif) { 29 30 case '<': 31 if (ecount == 0) { 32 while (readchar() != '\n') 33 /* void */; 34 unreadc(); 35 break; 36 } 37 if (rdc() == '<') 38 stack = 1; 39 else { 40 stack = 0; 41 unreadc(); 42 } 43 /* FALLTHROUGH */ 44 45 case '>': { 46 char file[64]; 47 char Ifile[128]; 48 extern char *Ipath; 49 int index; 50 char *strcpy(), *strcat(); 51 52 index = 0; 53 if (rdc() != '\n') { 54 do { 55 file[index++] = lastc; 56 if (index >= 63) 57 error(LONGFIL); 58 } while (readchar() != '\n'); 59 file[index] = 0; 60 if (modif == '<') { 61 if (Ipath) { 62 (void) strcpy(Ifile, Ipath); 63 (void) strcat(Ifile, "/"); 64 (void) strcat(Ifile, file); 65 } 66 if (strcmp(file, "-") != 0) { 67 iclose(stack, 0); 68 infile = open(file, 0); 69 if (infile < 0) 70 infile = open(Ifile, 0); 71 } else 72 (void) lseek(infile, 0L, 0); 73 if (infile < 0) { 74 infile = 0; 75 error(NOTOPEN); 76 /* NOTREACHED */ 77 } 78 var[9] = ecount; 79 } else { 80 oclose(); 81 outfile = open(file, O_CREAT|O_WRONLY, 0644); 82 (void) lseek(outfile, 0L, 2); 83 } 84 } else { 85 if (modif == '<') 86 iclose(-1, 0); 87 else 88 oclose(); 89 } 90 unreadc(); 91 break; 92 } 93 94 case 'p': 95 if (!kernel) 96 prints("not debugging kernel\n"); 97 else { 98 if (gavedot) 99 setpcb(dot); 100 getpcb(); 101 } 102 break; 103 104 case 'd': 105 if (gavedot) { 106 i = edot; 107 if (!(i >= 2 && i <= 16 || i <= -2 && i >= -16)) { 108 adbprintf("illegal radix %d base ten", 109 (expr_t)i); 110 break; 111 } 112 radix = i; 113 } 114 adbprintf("radix=%D base ten", (expr_t)radix); 115 break; 116 117 case 'q': 118 case 'Q': 119 case '%': 120 done(0); 121 122 case 'w': 123 case 'W': 124 maxcol = gavedot ? edot : MAXCOL; 125 break; 126 127 case 's': 128 case 'S': 129 maxoff = gavedot ? edot : MAXOFF; 130 break; 131 132 case 'v': 133 case 'V': 134 prints("variables\n"); 135 for (i = 0; i <= 35; i++) 136 if (var[i]) 137 adbprintf("%c = %R\n", 138 i > 9 ? i + 'a' - 10 : i + '0', 139 var[i]); 140 break; 141 142 case 'm': 143 case 'M': 144 printmap("? map", &txtmap); 145 printmap("/ map", &datmap); 146 break; 147 148 case 0: 149 case '?': 150 if (pid) 151 adbprintf("pcs id = %D\n", (expr_t)pid); 152 else 153 prints("no process\n"); 154 sigprint(); 155 flushbuf(); 156 /* FALLTHROUGH */ 157 158 case 'r': 159 case 'R': 160 printregs(); 161 return; 162 163 case 'c': 164 case 'C': 165 printstack(modif == 'C', gavecount ? (int)ecount : -1); 166 break; 167 168 case 'e': 169 case 'E': 170 /* print externals */ 171 printsyms(modif == 'E'); 172 break; 173 174 175 case 'b': 176 case 'B': 177 /* print breakpoints */ 178 printbkpts(); 179 break; 180 181 default: 182 error(BADMOD); 183 } 184 } 185 186 printmap(s, m) 187 char *s; 188 register struct map *m; 189 { 190 191 adbprintf("%s%12t`%s'\n", s, m->ufd < 0 ? "-" : 192 m->ufd == corefile.fd ? corefile.name : symfile.name); 193 adbprintf("b1 = %-16Re1 = %-16Rf1 = %-16R\n", 194 m->m1.b, m->m1.e, m->m1.f); 195 adbprintf("b2 = %-16Re2 = %-16Rf2 = %-16R\n", 196 m->m2.b, m->m2.e, m->m2.f); 197 } 198 199 /* 200 * Print global data and bss symbols, and if texttoo, text symbols too. 201 */ 202 printsyms(texttoo) 203 int texttoo; 204 { 205 register struct nlist *sp; 206 207 if (symtab == NULL) 208 return; 209 for (sp = symtab; sp < esymtab; sp++) { 210 if ((sp->n_type & N_EXT) == 0) 211 continue; 212 switch (sp->n_type) { 213 214 case N_TEXT|N_EXT: 215 if (texttoo) 216 adbprintf("%s:%12t@ %R\n", 217 sp->n_un.n_name, 218 (expr_t)sp->n_value); 219 break; 220 221 case N_DATA|N_EXT: 222 case N_BSS|N_EXT: 223 adbprintf("%s:%12t", sp->n_un.n_name); 224 prfrom((addr_t)sp->n_value, '\n'); 225 break; 226 } 227 } 228 } 229 230 /* 231 * Print the value stored in some location, or `?' if it cannot be read, 232 * then the character c (usually '\n' or ','). 233 */ 234 prfrom(a, c) 235 addr_t a; 236 int c; 237 { 238 expr_t v; 239 240 errflag = NULL; 241 if (adbread(SP_DATA, a, &v, sizeof(v)) == sizeof(v) && errflag == NULL) 242 adbprintf("%R\%c", v, c); 243 else { 244 errflag = NULL; 245 adbprintf("?%c", c); 246 } 247 } 248 249 #ifdef busted 250 /* 251 * Print a local symbol (called from printstack()). 252 * Local symbols end with ':', so cannot use %s format. 253 */ 254 printlsym(cp) 255 register char *cp; 256 { 257 258 while (*cp && *cp != ':') 259 printc(*cp++); 260 } 261 #endif 262 263 printregs() 264 { 265 register struct reglist *p; 266 expr_t v; 267 extern struct reglist reglist[]; 268 269 for (p = reglist; p->r_name != NULL; p++) { 270 v = getreg(p); 271 adbprintf("%s%6t%R\%16t", p->r_name, v); 272 valpr(v, ispace_reg(p) ? SP_INSTR : SP_DATA); 273 printc('\n'); 274 } 275 printpc(); 276 } 277 278 printpc() 279 { 280 281 dot = getpc(); 282 pdot(); 283 printins(SP_INSTR); 284 printc('\n'); 285 } 286