Blob
1 /*2 *3 * debugger4 *5 */7 #include "defs.h"8 #include "fns.h"10 void11 scanform(long icount, int prt, char *ifp, Map *map, int literal)12 {13 char *fp;14 char c;15 int fcount;16 ADDR savdot;17 int firstpass;19 firstpass = 1;20 while (icount) {21 fp=ifp;22 savdot=dot;23 /*now loop over format*/24 while (*fp) {25 if (!isdigit((uchar)*fp))26 fcount = 1;27 else {28 fcount = 0;29 while (isdigit((uchar)(c = *fp++))) {30 fcount *= 10;31 fcount += c-'0';32 }33 fp--;34 }35 if (*fp==0)36 break;37 fp=exform(fcount,prt,fp,map,literal,firstpass);38 firstpass = 0;39 }40 dotinc=dot-savdot;41 dot=savdot;42 if (--icount)43 dot=inkdot(dotinc);44 }45 }47 char *48 exform(int fcount, int prt, char *ifp, Map *map, int literal, int firstpass)49 {50 /* execute single format item `fcount' times51 * sets `dotinc' and moves `dot'52 * returns address of next format item53 */54 vlong v;55 WORD w;56 ulong savdot;57 u16int u2;58 u32int u4;59 u64int u8;60 char *fp;61 char c, modifier;62 int i;63 ushort sh;64 uchar ch, *cp;65 Symbol s;66 char buf[512];67 extern int printcol;69 fp = 0;70 while (fcount > 0) {71 fp = ifp;72 c = *fp;73 modifier = *fp++;74 if (firstpass) {75 firstpass = 0;76 if (!literal && (c == 'i' || c == 'I' || c == 'M')77 && (dot & (mach->pcquant-1))) {78 dprint("warning: instruction not aligned");79 printc('\n');80 }81 if (prt && modifier != 'a' && modifier != 'A') {82 symoff(buf, 512, dot, CANY);83 dprint("%s%c%16t", buf, map==symmap? '?':'/');84 }85 }86 if (printcol==0 && modifier != 'a' && modifier != 'A')87 dprint("\t\t");88 switch(modifier) {90 case SPC:91 case TB:92 dotinc = 0;93 break;95 case 't':96 case 'T':97 dprint("%*t", fcount);98 dotinc = 0;99 return(fp);101 case 'a':102 symoff(buf, sizeof(buf), dot, CANY);103 dprint("%s%c%16t", buf, map==symmap? '?':'/');104 dotinc = 0;105 break;107 case 'A':108 dprint("%#lux%10t", dot);109 dotinc = 0;110 break;112 case 'p':113 if (get4(map, dot, &u4) < 0)114 error("%r");115 w = u4;116 symoff(buf, sizeof(buf), w, CANY);117 dprint("%s%16t", buf);118 dotinc = mach->szaddr;119 break;121 case 'u':122 case 'd':123 case 'x':124 case 'o':125 case 'q':126 if (literal)127 u2 = (ushort) dot;128 else if (get2(map, dot, &u2) < 0)129 error("%r");130 w = u2;131 dotinc = 2;132 if (c == 'u')133 dprint("%-8lud", w);134 else if (c == 'x')135 dprint("%-8#lux", w);136 else if (c == 'd')137 dprint("%-8ld", w);138 else if (c == 'o')139 dprint("%-8#luo", w);140 else if (c == 'q')141 dprint("%-8#lo", w);142 break;144 case 'U':145 case 'D':146 case 'X':147 case 'O':148 case 'Q':149 if (literal)150 u4 = (long) dot;151 else if (get4(map, dot, &u4) < 0)152 error("%r");153 dotinc = 4;154 if (c == 'U')155 dprint("%-16lud", u4);156 else if (c == 'X')157 dprint("%-16#lux", u4);158 else if (c == 'D')159 dprint("%-16ld", u4);160 else if (c == 'O')161 dprint("%-#16luo", u4);162 else if (c == 'Q')163 dprint("%-#16lo", u4);164 break;165 case 'Z':166 case 'V':167 case 'Y':168 if (literal)169 v = dot;170 else if (get8(map, dot, &u8) < 0)171 error("%r");172 dotinc = 8;173 if (c == 'Y')174 dprint("%-20#llux", u8);175 else if (c == 'V')176 dprint("%-20lld", u8);177 else if (c == 'Z')178 dprint("%-20llud", u8);179 break;180 case 'B':181 case 'b':182 case 'c':183 case 'C':184 if (literal)185 ch = (uchar) dot;186 else if (get1(map, dot, &ch, 1) < 0)187 error("%r");188 if (modifier == 'C')189 printesc(ch);190 else if (modifier == 'B' || modifier == 'b')191 dprint("%-8#lux", (long) ch);192 else193 printc(ch);194 dotinc = 1;195 break;197 case 'r':198 if (literal)199 sh = (ushort) dot;200 else if (get2(map, dot, &sh) < 0)201 error("%r");202 dprint("%C", sh);203 dotinc = 2;204 break;206 case 'R':207 if (literal) {208 u16int sp[2];209 memmove(&sp, &dot, 4);210 dprint("%C%C", sp[0], sp[1]);211 endline();212 dotinc = 4;213 break;214 }215 savdot=dot;216 while ((i = get2(map, dot, &u2) > 0) && u2) {217 dot=inkdot(2);218 dprint("%C", u2);219 endline();220 }221 if (i < 0)222 error("%r");223 dotinc = dot-savdot+2;224 dot=savdot;225 break;227 case 's':228 if (literal) {229 cp = (uchar*)(void*)˙230 for (i = 0; i < 4; i++)231 buf[i] = cp[i];232 buf[i] = 0;233 dprint("%s", buf);234 endline();235 dotinc = 4;236 break;237 }238 savdot = dot;239 for(;;){240 i = 0;241 do{242 if (get1(map, dot, (uchar*)(void*)&buf[i], 1) < 0)243 error("%r");244 dot = inkdot(1);245 i++;246 }while(!fullrune(buf, i));247 if(buf[0] == 0)248 break;249 buf[i] = 0;250 dprint("%s", buf);251 endline();252 }253 dotinc = dot-savdot+1;254 dot = savdot;255 break;257 case 'S':258 if (literal) {259 cp = (uchar*) ˙260 for (i = 0; i < 4; i++)261 printesc(cp[i]);262 endline();263 dotinc = 4;264 break;265 }266 savdot=dot;267 while ((i = get1(map, dot, &ch, 1) > 0) && ch) {268 dot=inkdot(1);269 printesc(ch);270 endline();271 }272 if (i < 0)273 error("%r");274 dotinc = dot-savdot+1;275 dot=savdot;276 break;279 case 'I':280 case 'i':281 dotinc = mach->das(map, dot, modifier, buf, sizeof(buf));282 if (dotinc < 0)283 error("%r");284 dprint("%s\n", buf);285 break;287 case 'M':288 dotinc = mach->hexinst(map, dot, buf, sizeof(buf));289 if (dotinc < 0)290 error("%r");291 dprint("%s", buf);292 if (*fp) {293 dotinc = 0;294 dprint("%48t");295 } else296 dprint("\n");297 break;299 case 'f':300 /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */301 if (literal) {302 v = mach->swap8((ulong)dot);303 memmove(buf, &v, mach->szfloat);304 }else if (get1(map, dot, (uchar*)buf, mach->szfloat) < 0)305 error("%r");306 mach->ftoa32(buf, sizeof(buf), (void*) buf);307 dprint("%s\n", buf);308 dotinc = mach->szfloat;309 break;311 case 'F':312 /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */313 if (literal) {314 v = mach->swap8(dot);315 memmove(buf, &v, mach->szdouble);316 }else if (get1(map, dot, (uchar*)buf, mach->szdouble) < 0)317 error("%r");318 mach->ftoa64(buf, sizeof(buf), (void*) buf);319 dprint("%s\n", buf);320 dotinc = mach->szdouble;321 break;323 case 'n':324 case 'N':325 printc('\n');326 dotinc=0;327 break;329 case '"':330 dotinc=0;331 while (*fp != '"' && *fp)332 printc(*fp++);333 if (*fp)334 fp++;335 break;337 case '^':338 dot=inkdot(-dotinc*fcount);339 return(fp);341 case '+':342 dot=inkdot((WORD)fcount);343 return(fp);345 case '-':346 dot=inkdot(-(WORD)fcount);347 return(fp);349 case 'z':350 if (findsym(locaddr(dot), CTEXT, &s) >= 0)351 dprint("%s() ", s.name);352 printsource(dot);353 printc(EOR);354 return fp;356 default:357 error("bad modifier");358 }359 if (map->seg[0].fd >= 0)360 dot=inkdot(dotinc);361 fcount--;362 endline();363 }365 return(fp);366 }368 void369 printesc(int c)370 {371 static char hex[] = "0123456789abcdef";373 if (c < SPC || c >= 0177)374 dprint("\\x%c%c", hex[(c&0xF0)>>4], hex[c&0xF]);375 else376 printc(c);377 }379 ADDR380 inkdot(WORD incr)381 {382 ADDR newdot;384 newdot=dot+incr;385 if ((incr >= 0 && newdot < dot)386 || (incr < 0 && newdot > dot))387 error("address wraparound");388 return(newdot);389 }