void main(int argc, char **argv) { argc--; argv++; bioout = &bp; bin = &bi; Binit(bioout, 1, OWRITE); Binit(bin, 0, OREAD); tlb.on = 1; tlb.tlbsize = 24; if(argc) file = argv[0]; argc--; argv++; text = open(file, OREAD); if(text < 0) fatal(1, "open text '%s'", file); Bprint(bioout, "5i\n"); inithdr(text); initstk(argc, argv); cmd(); }
void main(int argc, char **argv) { int pid, i; argc--; argv++; bioout = &bp; bin = &bi; Binit(bioout, 1, OWRITE); Binit(bin, 0, OREAD); if(argc) { pid = atoi(argv[0]); if(pid != 0) { procinit(pid); cmd(); } file = argv[0]; } argc--; argv++; text = open(file, OREAD); if(text < 0) fatal(1, "open text '%s'", file); Bprint(bioout, "qi\n"); inithdr(text); initstk(argc, argv); for(i=0; i<32; i++) bits[i] = 1L << (31-i); fpreginit(); cmd(); }
void main(int argc, char *argv[]) { int (*t)(uvlong, uvlong, uvlong); uvlong pc, sp, link; int fd; ARGBEGIN{ case 'i': interactive++; break; default: usage(); }ARGEND link = 0; t = ctrace; switch(argc){ case 4: t = rtrace; link = strtoull(argv[3], 0, 16); break; case 3: break; default: usage(); } pc = strtoull(argv[1], 0, 16); sp = strtoull(argv[2], 0, 16); if(!interactive) readstack(); fd = open(argv[0], OREAD); if(fd < 0) fatal("can't open %s: %r", argv[0]); inithdr(fd); switch(fhdr.magic){ case I_MAGIC: /* intel 386 */ t = i386trace; break; case S_MAGIC: /* amd64 */ t = amd64trace; break; case A_MAGIC: /* 68020 */ case J_MAGIC: /* intel 960 */ t = ctrace; break; case K_MAGIC: /* sparc */ case D_MAGIC: /* amd 29000 */ case V_MAGIC: /* mips 3000 */ case M_MAGIC: /* mips 4000 */ case E_MAGIC: /* arm 7-something */ case Q_MAGIC: /* powerpc */ case N_MAGIC: /* mips 4000 LE */ case L_MAGIC: /* dec alpha */ t = rtrace; break; case X_MAGIC: /* att dsp 3210 */ sysfatal("can't ktrace %s", argv[0]); break; default: fprint(2, "%s: warning: can't tell what type of stack %s uses; assuming it's %s\n", argv0, argv[0], argc == 4 ? "risc" : "cisc"); break; } (*t)(pc, sp, link); exits(0); }
void procinit(int pid) { char *p; Segment *s; int n, m, sg, i; ulong vastart, vaend; char mfile[128], tfile[128], sfile[1024]; sprint(mfile, "/proc/%d/mem", pid); sprint(tfile, "/proc/%d/text", pid); sprint(sfile, "/proc/%d/segment", pid); text = open(tfile, OREAD); if(text < 0) fatal(1, "open text %s", tfile); inithdr(text); sg = open(sfile, OREAD); if(sg < 0) fatal(1, "open text %s", sfile); n = read(sg, sfile, sizeof(sfile)); if(n >= sizeof(sfile)) fatal(0, "segment file buffer too small"); close(sg); m = open(mfile, OREAD); if(m < 0) fatal(1, "open %s", mfile); initmap(); p = strstr(sfile, "Data"); if(p == 0) fatal(0, "no data"); vastart = strtoul(p+9, 0, 16); vaend = strtoul(p+18, 0, 16); s = &memory.seg[Data]; if(s->base != vastart || s->end != vaend) { s->base = vastart; s->end = vaend; free(s->table); s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*)); } seginit(m, s, 0, vastart, vaend); p = strstr(sfile, "Bss"); if(p == 0) fatal(0, "no bss"); vastart = strtoul(p+9, 0, 16); vaend = strtoul(p+18, 0, 16); s = &memory.seg[Bss]; if(s->base != vastart || s->end != vaend) { s->base = vastart; s->end = vaend; free(s->table); s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*)); } seginit(m, s, 0, vastart, vaend); reg.pc = greg(m, REGOFF(pc)); reg.r[1] = greg(m, REGOFF(sp)); reg.r[2] = greg(m, REGOFF(r2)); reg.r[30] = greg(m, REGOFF(r30)); reg.r[31] = greg(m, REGOFF(r31)); for(i = 0; i < 32; i++) reg.r[i] = greg(m, roff[i-1]); s = &memory.seg[Stack]; vastart = reg.r[1] & ~(BY2PG-1); seginit(m, s, (vastart-s->base)/BY2PG, vastart, STACKTOP); close(m); Bprint(bioout, "qi\n"); }