1*219b2ee8SDavid du Colombier 23e12c5d1SDavid du Colombier /* 33e12c5d1SDavid du Colombier * init routines 43e12c5d1SDavid du Colombier */ 53e12c5d1SDavid du Colombier #include "defs.h" 63e12c5d1SDavid du Colombier #include "fns.h" 73e12c5d1SDavid du Colombier 8*219b2ee8SDavid du Colombier char *symfil; 9*219b2ee8SDavid du Colombier char *corfil; 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier Map *symmap; 123e12c5d1SDavid du Colombier Map *cormap; 13*219b2ee8SDavid du Colombier Map *dotmap; 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier int fsym, fcor; 16*219b2ee8SDavid du Colombier static Fhdr fhdr; 17*219b2ee8SDavid du Colombier 18*219b2ee8SDavid du Colombier extern Mach mmips; 19*219b2ee8SDavid du Colombier extern Machdata mipsmach; 203e12c5d1SDavid du Colombier 213e12c5d1SDavid du Colombier static int getfile(char*, int, int); 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier void 243e12c5d1SDavid du Colombier setsym(void) 253e12c5d1SDavid du Colombier { 263e12c5d1SDavid du Colombier Symbol s; 273e12c5d1SDavid du Colombier 283e12c5d1SDavid du Colombier if((fsym = getfile(symfil, 1, wtflag)) < 0) { 293e12c5d1SDavid du Colombier symmap = dumbmap(-1); 30*219b2ee8SDavid du Colombier machdata = &mipsmach; 31*219b2ee8SDavid du Colombier mach = &mmips; 323e12c5d1SDavid du Colombier return; 333e12c5d1SDavid du Colombier } 34*219b2ee8SDavid du Colombier if (crackhdr(fsym, &fhdr)) { 35*219b2ee8SDavid du Colombier machbytype(fhdr.type); 36*219b2ee8SDavid du Colombier symmap = loadmap(symmap, fsym, &fhdr); 373e12c5d1SDavid du Colombier if (symmap == 0) 383e12c5d1SDavid du Colombier symmap = dumbmap(fsym); 39*219b2ee8SDavid du Colombier if (syminit(fsym, &fhdr) < 0) 40*219b2ee8SDavid du Colombier dprint("%r\n"); 413e12c5d1SDavid du Colombier if (mach->sbreg && lookup(0, mach->sbreg, &s)) 423e12c5d1SDavid du Colombier mach->sb = s.value; 433e12c5d1SDavid du Colombier } 443e12c5d1SDavid du Colombier else 453e12c5d1SDavid du Colombier symmap = dumbmap(fsym); 463e12c5d1SDavid du Colombier } 473e12c5d1SDavid du Colombier 483e12c5d1SDavid du Colombier void 493e12c5d1SDavid du Colombier setcor(void) 503e12c5d1SDavid du Colombier { 51*219b2ee8SDavid du Colombier char buf[64]; 52*219b2ee8SDavid du Colombier int fd; 53*219b2ee8SDavid du Colombier ulong ksp; 54*219b2ee8SDavid du Colombier long proc; /* address of proc table */ 55*219b2ee8SDavid du Colombier 56*219b2ee8SDavid du Colombier 57*219b2ee8SDavid du Colombier if(pid > 0){ /* set kbase; should probably do other things, too */ 58*219b2ee8SDavid du Colombier sprint(buf, "/proc/%d/proc", pid); 59*219b2ee8SDavid du Colombier fd = open(buf, 0); 60*219b2ee8SDavid du Colombier if(fd >= 0){ 61*219b2ee8SDavid du Colombier seek(fd, mach->kspoff, 0); 62*219b2ee8SDavid du Colombier if(read(fd, (char *)&ksp, 4) == 4) 63*219b2ee8SDavid du Colombier mach->kbase = machdata->swal(ksp) & ~(mach->pgsize-1); 64*219b2ee8SDavid du Colombier close(fd); 65*219b2ee8SDavid du Colombier } 66*219b2ee8SDavid du Colombier } 67*219b2ee8SDavid du Colombier if (cormap) 68*219b2ee8SDavid du Colombier close(fcor); 69*219b2ee8SDavid du Colombier 703e12c5d1SDavid du Colombier fcor = getfile(corfil, 2, ORDWR); 71*219b2ee8SDavid du Colombier if (fcor <= 0) { 72*219b2ee8SDavid du Colombier if (cormap) 73*219b2ee8SDavid du Colombier free(cormap); 74*219b2ee8SDavid du Colombier cormap = dumbmap(-1); 75*219b2ee8SDavid du Colombier return; 76*219b2ee8SDavid du Colombier } 77*219b2ee8SDavid du Colombier cormap = newmap(cormap, fcor, 3); 78*219b2ee8SDavid du Colombier if (!cormap) 79*219b2ee8SDavid du Colombier return; 80*219b2ee8SDavid du Colombier setmap(cormap, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text"); 81*219b2ee8SDavid du Colombier setmap(cormap, fhdr.dataddr, mach->kbase, fhdr.dataddr, "data"); 82*219b2ee8SDavid du Colombier setmap(cormap, mach->kbase, mach->kbase+mach->pgsize, mach->kbase, "ublock"); 83*219b2ee8SDavid du Colombier fixregs(cormap); 84*219b2ee8SDavid du Colombier if (kflag) { 85*219b2ee8SDavid du Colombier if (get4(cormap, mach->kbase, &proc) < 0) 86*219b2ee8SDavid du Colombier error("can't find proc table: %r"); 87*219b2ee8SDavid du Colombier 88*219b2ee8SDavid du Colombier adjustreg(mach->pc, proc+mach->kpcoff, mach->kpcdelta); 89*219b2ee8SDavid du Colombier adjustreg(mach->sp, proc+mach->kspoff, mach->kspdelta); 90*219b2ee8SDavid du Colombier } 91*219b2ee8SDavid du Colombier kmsys(); 92*219b2ee8SDavid du Colombier return; 933e12c5d1SDavid du Colombier } 943e12c5d1SDavid du Colombier 953e12c5d1SDavid du Colombier Map * 963e12c5d1SDavid du Colombier dumbmap(int fd) 973e12c5d1SDavid du Colombier { 983e12c5d1SDavid du Colombier Map *dumb; 993e12c5d1SDavid du Colombier extern Mach mmips; 100*219b2ee8SDavid du Colombier extern Machdata mipsmach; 1013e12c5d1SDavid du Colombier 102*219b2ee8SDavid du Colombier dumb = newmap(0, fd, 1); 103*219b2ee8SDavid du Colombier setmap(dumb, 0, 0xffffffff, 0, "data"); 1043e12c5d1SDavid du Colombier if (!mach) /* default machine = mips */ 1053e12c5d1SDavid du Colombier mach = &mmips; 106*219b2ee8SDavid du Colombier if (!machdata) 107*219b2ee8SDavid du Colombier machdata = &mipsmach; 1083e12c5d1SDavid du Colombier return dumb; 1093e12c5d1SDavid du Colombier } 1103e12c5d1SDavid du Colombier 1113e12c5d1SDavid du Colombier /* 1123e12c5d1SDavid du Colombier * set up maps for a direct process image (/proc) 1133e12c5d1SDavid du Colombier */ 1143e12c5d1SDavid du Colombier 1153e12c5d1SDavid du Colombier void 1163e12c5d1SDavid du Colombier cmdmap(Map *map) 1173e12c5d1SDavid du Colombier { 1183e12c5d1SDavid du Colombier int i; 1193e12c5d1SDavid du Colombier char name[MAXSYM]; 1203e12c5d1SDavid du Colombier 1213e12c5d1SDavid du Colombier extern char lastc; 1223e12c5d1SDavid du Colombier 1233e12c5d1SDavid du Colombier rdc(); 1243e12c5d1SDavid du Colombier readsym(name); 125*219b2ee8SDavid du Colombier i = findseg(map, name); 126*219b2ee8SDavid du Colombier if (i < 0) /* not found */ 1273e12c5d1SDavid du Colombier error("Invalid map name"); 128*219b2ee8SDavid du Colombier 129*219b2ee8SDavid du Colombier if (expr(0)) { 130*219b2ee8SDavid du Colombier if (strcmp(name, "text") == 0) 131*219b2ee8SDavid du Colombier textseg(expv, &fhdr); 132*219b2ee8SDavid du Colombier map->seg[i].b = expv; 133*219b2ee8SDavid du Colombier } else 1343e12c5d1SDavid du Colombier error("Invalid base address"); 1353e12c5d1SDavid du Colombier if (expr(0)) 136*219b2ee8SDavid du Colombier map->seg[i].e = expv; 1373e12c5d1SDavid du Colombier else 1383e12c5d1SDavid du Colombier error("Invalid end address"); 1393e12c5d1SDavid du Colombier if (expr(0)) 140*219b2ee8SDavid du Colombier map->seg[i].f = expv; 1413e12c5d1SDavid du Colombier else 1423e12c5d1SDavid du Colombier error("Invalid file offset"); 1433e12c5d1SDavid du Colombier if (rdc()=='?' && map == cormap) { 1443e12c5d1SDavid du Colombier if (fcor) 1453e12c5d1SDavid du Colombier close(fcor); 1463e12c5d1SDavid du Colombier fcor=fsym; 1473e12c5d1SDavid du Colombier corfil=symfil; 1483e12c5d1SDavid du Colombier cormap = symmap; 1493e12c5d1SDavid du Colombier } else if (lastc == '/' && map == symmap) { 1503e12c5d1SDavid du Colombier if (fsym) 1513e12c5d1SDavid du Colombier close(fsym); 1523e12c5d1SDavid du Colombier fsym=fcor; 1533e12c5d1SDavid du Colombier symfil=corfil; 1543e12c5d1SDavid du Colombier symmap=cormap; 1553e12c5d1SDavid du Colombier } else 1563e12c5d1SDavid du Colombier reread(); 1573e12c5d1SDavid du Colombier } 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier static int 1603e12c5d1SDavid du Colombier getfile(char *filnam, int cnt, int omode) 1613e12c5d1SDavid du Colombier { 1623e12c5d1SDavid du Colombier int f; 1633e12c5d1SDavid du Colombier 1643e12c5d1SDavid du Colombier if (filnam == 0) 1653e12c5d1SDavid du Colombier return -1; 1663e12c5d1SDavid du Colombier if (strcmp(filnam, "-") == 0) 1673e12c5d1SDavid du Colombier return 0; 1683e12c5d1SDavid du Colombier f = open(filnam, omode|OCEXEC); 1693e12c5d1SDavid du Colombier if(f < 0 && omode == ORDWR){ 1703e12c5d1SDavid du Colombier f = open(filnam, OREAD|OCEXEC); 1713e12c5d1SDavid du Colombier if(f >= 0) 1723e12c5d1SDavid du Colombier dprint("%s open read-only\n", filnam); 1733e12c5d1SDavid du Colombier } 1743e12c5d1SDavid du Colombier if (f < 0 && xargc > cnt) 1753e12c5d1SDavid du Colombier if (wtflag) 1763e12c5d1SDavid du Colombier f = create(filnam, 1, 0666); 1773e12c5d1SDavid du Colombier if (f < 0) { 178bd389b36SDavid du Colombier dprint("cannot open `%s': %r\n", filnam); 1793e12c5d1SDavid du Colombier return -1; 1803e12c5d1SDavid du Colombier } 1813e12c5d1SDavid du Colombier return f; 1823e12c5d1SDavid du Colombier } 1833e12c5d1SDavid du Colombier 1843e12c5d1SDavid du Colombier void 1853e12c5d1SDavid du Colombier kmsys(void) 1863e12c5d1SDavid du Colombier { 187*219b2ee8SDavid du Colombier int i; 1883e12c5d1SDavid du Colombier 189*219b2ee8SDavid du Colombier i = findseg(symmap, "text"); 190*219b2ee8SDavid du Colombier if (i >= 0) { 191*219b2ee8SDavid du Colombier symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask; 192*219b2ee8SDavid du Colombier symmap->seg[i].e = ~0; 1933e12c5d1SDavid du Colombier } 194*219b2ee8SDavid du Colombier i = findseg(symmap, "data"); 195*219b2ee8SDavid du Colombier if (i >= 0) { 196*219b2ee8SDavid du Colombier symmap->seg[i].b |= mach->kbase; 197*219b2ee8SDavid du Colombier symmap->seg[i].e |= mach->kbase; 1983e12c5d1SDavid du Colombier } 199*219b2ee8SDavid du Colombier i = findseg(symmap, "ublock"); 200*219b2ee8SDavid du Colombier if (i >= 0) 201*219b2ee8SDavid du Colombier unusemap(symmap, i); 202*219b2ee8SDavid du Colombier cormap = newmap(cormap, fcor, 1); 203*219b2ee8SDavid du Colombier if (cormap) 204*219b2ee8SDavid du Colombier setmap(cormap, 0, ~0, 0, "data"); 2053e12c5d1SDavid du Colombier } 2063e12c5d1SDavid du Colombier 2073e12c5d1SDavid du Colombier void 2083e12c5d1SDavid du Colombier attachproc(void) 2093e12c5d1SDavid du Colombier { 2103e12c5d1SDavid du Colombier char buf[100]; 2113e12c5d1SDavid du Colombier int statstat; 2123e12c5d1SDavid du Colombier Dir sym, mem; 2133e12c5d1SDavid du Colombier int fd; 2143e12c5d1SDavid du Colombier 2153e12c5d1SDavid du Colombier if (!adrflg) { 2163e12c5d1SDavid du Colombier dprint("used pid$a\n"); 2173e12c5d1SDavid du Colombier return; 2183e12c5d1SDavid du Colombier } 2193e12c5d1SDavid du Colombier statstat = dirfstat(fsym, &sym); 2203e12c5d1SDavid du Colombier sprint(buf, "/proc/%d/mem", adrval); 2213e12c5d1SDavid du Colombier corfil = buf; 2223e12c5d1SDavid du Colombier setcor(); 2233e12c5d1SDavid du Colombier sprint(buf, "/proc/%d/text", adrval); 2243e12c5d1SDavid du Colombier fd = open(buf, OREAD); 2253e12c5d1SDavid du Colombier if (statstat < 0 || fd < 0 || dirfstat(fd, &mem) < 0 2263e12c5d1SDavid du Colombier || sym.qid.path != mem.qid.path) 2273e12c5d1SDavid du Colombier dprint("warning: text images may be inconsistent\n"); 2283e12c5d1SDavid du Colombier if (fd >= 0) 2293e12c5d1SDavid du Colombier close(fd); 2303e12c5d1SDavid du Colombier } 231