bool f18a_debug(f18a *f18a) { static char buf[BUFSIZ]; f18a_msg("entering emulator debugger: enter 'h' for help.\n"); dumpheader(); dumpstate(f18a); for (;;) { f18a_msg(" * "); if (!f18a_getstr(buf, BUFSIZ)) return false; char *delim = " \t\n"; char *tok = strtok(buf, delim); if (!tok) continue; if (matches(tok, "h", "help") || matches(tok, "?", "?")) { f18a_msg( " help, ?: show this message\n" " continue: resume running\n" " step [n]: execute a single instruction (or n instructions)\n" " dump: display the state of the cpu\n" " print addr [len]: display memory contents in hex\n" " (addr is hex, len decimal)\n" " exit, quit: exit emulator\n" "unambiguous abbreviations are recognized " "(e.g., s for step or con for continue).\n" ); } else if (matches(tok, "con", "continue")) { return true; } else if (matches(tok, "s", "step")) { uint32_t steps = 1; tok = strtok(NULL, delim); if (tok) { char *endptr; steps = strtoul(tok, &endptr, 10); if (*endptr) { f18a_msg("argument to 'step' must be a decimal number\n"); continue; } } for (uint32_t i = 0; i < steps; i++) { f18a_runterm(); f18a_step(f18a); f18a_dbgterm(); dumpstate(f18a); } } else if (matches(tok, "d", "dump")) { dumpheader(); dumpstate(f18a); } else if (matches(tok, "p", "print")) { tok = strtok(NULL, delim); if (!tok) { f18a_msg("print requires an argument\n"); continue; } char *endptr; u32 addr = strtoul(tok, &endptr, 16); if (*endptr) { f18a_msg("addr argument to 'print' must be a hex number: %s\n", endptr); continue; } u16 length = 1; tok = strtok(NULL, delim); if (tok) { length = strtoul(tok, &endptr, 10); if (*endptr) { f18a_msg("len argument to 'print' must be a decimal number\n"); continue; } } dumpram(f18a, addr, length); } else if (matches(tok, "e", "exit") || matches(tok, "q", "quit")) { return false; } else { f18a_msg("unrecognized or ambiguous command: %s\n", tok); } } }
int main(int argc, char **argv) { int ch, col, ktrlen, size; pid_t do_pid = -1; void *m; int trpoints = ALL_POINTS; char *cp; (void) setlocale(LC_CTYPE, ""); while ((ch = getopt(argc,argv,"f:djlm:np:RTt:")) != -1) switch((char)ch) { case 'f': tracefile = optarg; break; case 'j': fixedformat = 1; break; case 'd': decimal = 1; break; case 'l': tail = 1; break; case 'm': maxdata = atoi(optarg); break; case 'n': fancy = 0; break; case 'p': do_pid = strtoul(optarg, &cp, 0); if (*cp != 0) errx(1,"invalid number %s", optarg); break; case 'R': timestamp = 2; /* relative timestamp */ break; case 'T': timestamp = 1; break; case 't': trpoints = getpoints(optarg); if (trpoints < 0) errx(1, "unknown trace point in %s", optarg); break; default: usage(); } if (argc > optind) usage(); m = (void *)malloc(size = 1025); if (m == NULL) errx(1, "%s", strerror(ENOMEM)); if (!freopen(tracefile, "r", stdin)) err(1, "%s", tracefile); while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { if (trpoints & (1 << ktr_header.ktr_type) && (do_pid == -1 || ktr_header.ktr_pid == do_pid)) col = dumpheader(&ktr_header); else col = -1; if ((ktrlen = ktr_header.ktr_len) < 0) errx(1, "bogus length 0x%x", ktrlen); if (ktrlen > size) { m = (void *)realloc(m, ktrlen+1); if (m == NULL) errx(1, "%s", strerror(ENOMEM)); size = ktrlen; } if (ktrlen && fread_tail(m, ktrlen, 1) == 0) errx(1, "data too short"); if ((trpoints & (1<<ktr_header.ktr_type)) == 0) continue; if (col == -1) continue; switch (ktr_header.ktr_type) { case KTR_SYSCALL: ktrsyscall((struct ktr_syscall *)m); break; case KTR_SYSRET: ktrsysret((struct ktr_sysret *)m); break; case KTR_NAMEI: ktrnamei(m, ktrlen); break; case KTR_GENIO: ktrgenio((struct ktr_genio *)m, ktrlen); break; case KTR_PSIG: ktrpsig((struct ktr_psig *)m); break; case KTR_CSW: ktrcsw((struct ktr_csw *)m); break; case KTR_USER: ktruser(ktrlen, m); break; } if (tail) (void)fflush(stdout); } exit(0); }
static int transfer( /* transfer a Radiance picture */ char *ospec ) { char oname[PATH_MAX]; FILE *fp; int order; int xmax, ymax; COLR *scanin; int y; /* get header info. */ if (!(y = loadheader(stdin))) return(0); if (y < 0 || (order = fgetresolu(&xmax, &ymax, stdin)) < 0) { fprintf(stderr, "%s: bad input format\n", progname); exit(1); } /* did we pass the target frame? */ if (findframe && findframe < frameno) return(0); /* allocate scanline */ scanin = (COLR *)tempbuffer(xmax*sizeof(COLR)); if (scanin == NULL) { perror(progname); exit(1); } /* skip frame? */ if (findframe > frameno) { for (y = ymax; y--; ) if (freadcolrs(scanin, xmax, stdin) < 0) { fprintf(stderr, "%s: error reading input picture\n", progname); exit(1); } return(1); } /* open output file/command */ if (ospec == NULL) { strcpy(oname, "<stdout>"); fp = stdout; } else { sprintf(oname, ospec, frameno); if (oname[0] == '!') { if ((fp = popen(oname+1, "w")) == NULL) { fprintf(stderr, "%s: cannot start \"%s\"\n", progname, oname); exit(1); } } else { if (!force && access(oname, 0) >= 0) { fprintf(stderr, "%s: output file \"%s\" exists\n", progname, oname); exit(1); } if ((fp = fopen(oname, "w")) == NULL) { fprintf(stderr, "%s: ", progname); perror(oname); exit(1); } } } SET_FILE_BINARY(fp); dumpheader(fp); /* put out header */ fputs(progname, fp); if (bradj) fprintf(fp, " -e %+d", bradj); if (!doflat) fputs(" -r", fp); fputc('\n', fp); if (bradj) fputexpos(pow(2.0, (double)bradj), fp); fputc('\n', fp); fputresolu(order, xmax, ymax, fp); /* transfer picture */ for (y = ymax; y--; ) { if (freadcolrs(scanin, xmax, stdin) < 0) { fprintf(stderr, "%s: error reading input picture\n", progname); exit(1); } if (bradj) shiftcolrs(scanin, xmax, bradj); if (doflat) putbinary((char *)scanin, sizeof(COLR), xmax, fp); else fwritecolrs(scanin, xmax, fp); if (ferror(fp)) { fprintf(stderr, "%s: error writing output to \"%s\"\n", progname, oname); exit(1); } } /* clean up */ if (oname[0] == '!') pclose(fp); else if (ospec != NULL) fclose(fp); return(1); }