1219b2ee8SDavid 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
8219b2ee8SDavid du Colombier char *symfil;
9219b2ee8SDavid du Colombier char *corfil;
103e12c5d1SDavid du Colombier
113e12c5d1SDavid du Colombier Map *symmap;
123e12c5d1SDavid du Colombier Map *cormap;
13219b2ee8SDavid du Colombier Map *dotmap;
143e12c5d1SDavid du Colombier
153e12c5d1SDavid du Colombier int fsym, fcor;
16219b2ee8SDavid du Colombier static Fhdr fhdr;
17219b2ee8SDavid du Colombier
183e12c5d1SDavid du Colombier static int getfile(char*, int, int);
193e12c5d1SDavid du Colombier
203e12c5d1SDavid du Colombier void
setsym(void)213e12c5d1SDavid du Colombier setsym(void)
223e12c5d1SDavid du Colombier {
233e12c5d1SDavid du Colombier Symbol s;
243e12c5d1SDavid du Colombier
253e12c5d1SDavid du Colombier if((fsym = getfile(symfil, 1, wtflag)) < 0) {
263e12c5d1SDavid du Colombier symmap = dumbmap(-1);
273e12c5d1SDavid du Colombier return;
283e12c5d1SDavid du Colombier }
29219b2ee8SDavid du Colombier if (crackhdr(fsym, &fhdr)) {
30219b2ee8SDavid du Colombier machbytype(fhdr.type);
31219b2ee8SDavid du Colombier symmap = loadmap(symmap, fsym, &fhdr);
323e12c5d1SDavid du Colombier if (symmap == 0)
333e12c5d1SDavid du Colombier symmap = dumbmap(fsym);
34219b2ee8SDavid du Colombier if (syminit(fsym, &fhdr) < 0)
35219b2ee8SDavid du Colombier dprint("%r\n");
363e12c5d1SDavid du Colombier if (mach->sbreg && lookup(0, mach->sbreg, &s))
373e12c5d1SDavid du Colombier mach->sb = s.value;
383e12c5d1SDavid du Colombier }
393e12c5d1SDavid du Colombier else
403e12c5d1SDavid du Colombier symmap = dumbmap(fsym);
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier
433e12c5d1SDavid du Colombier void
setcor(void)443e12c5d1SDavid du Colombier setcor(void)
453e12c5d1SDavid du Colombier {
467dd7cddfSDavid du Colombier int i;
47219b2ee8SDavid du Colombier
487dd7cddfSDavid du Colombier if (cormap) {
497dd7cddfSDavid du Colombier for (i = 0; i < cormap->nsegs; i++)
507dd7cddfSDavid du Colombier if (cormap->seg[i].inuse)
517dd7cddfSDavid du Colombier close(cormap->seg[i].fd);
52219b2ee8SDavid du Colombier }
53219b2ee8SDavid du Colombier
543e12c5d1SDavid du Colombier fcor = getfile(corfil, 2, ORDWR);
55219b2ee8SDavid du Colombier if (fcor <= 0) {
56219b2ee8SDavid du Colombier if (cormap)
57219b2ee8SDavid du Colombier free(cormap);
58219b2ee8SDavid du Colombier cormap = dumbmap(-1);
59219b2ee8SDavid du Colombier return;
60219b2ee8SDavid du Colombier }
617dd7cddfSDavid du Colombier if(pid > 0) { /* provide addressability to executing process */
627dd7cddfSDavid du Colombier cormap = attachproc(pid, kflag, fcor, &fhdr);
63219b2ee8SDavid du Colombier if (!cormap)
647dd7cddfSDavid du Colombier cormap = dumbmap(-1);
657dd7cddfSDavid du Colombier } else {
667dd7cddfSDavid du Colombier cormap = newmap(cormap, 2);
677dd7cddfSDavid du Colombier if (!cormap)
687dd7cddfSDavid du Colombier cormap = dumbmap(-1);
697dd7cddfSDavid du Colombier setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text");
707dd7cddfSDavid du Colombier setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data");
71219b2ee8SDavid du Colombier }
72219b2ee8SDavid du Colombier kmsys();
73219b2ee8SDavid du Colombier return;
743e12c5d1SDavid du Colombier }
753e12c5d1SDavid du Colombier
763e12c5d1SDavid du Colombier Map *
dumbmap(int fd)773e12c5d1SDavid du Colombier dumbmap(int fd)
783e12c5d1SDavid du Colombier {
793e12c5d1SDavid du Colombier Map *dumb;
803e12c5d1SDavid du Colombier
817dd7cddfSDavid du Colombier extern Mach mi386;
827dd7cddfSDavid du Colombier extern Machdata i386mach;
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier dumb = newmap(0, 1);
857dd7cddfSDavid du Colombier setmap(dumb, fd, 0, 0xffffffff, 0, "data");
867dd7cddfSDavid du Colombier if (!mach) /* default machine = 386 */
877dd7cddfSDavid du Colombier mach = &mi386;
88219b2ee8SDavid du Colombier if (!machdata)
897dd7cddfSDavid du Colombier machdata = &i386mach;
903e12c5d1SDavid du Colombier return dumb;
913e12c5d1SDavid du Colombier }
923e12c5d1SDavid du Colombier
933e12c5d1SDavid du Colombier /*
943e12c5d1SDavid du Colombier * set up maps for a direct process image (/proc)
953e12c5d1SDavid du Colombier */
963e12c5d1SDavid du Colombier
973e12c5d1SDavid du Colombier void
cmdmap(Map * map)983e12c5d1SDavid du Colombier cmdmap(Map *map)
993e12c5d1SDavid du Colombier {
1003e12c5d1SDavid du Colombier int i;
1013e12c5d1SDavid du Colombier char name[MAXSYM];
1023e12c5d1SDavid du Colombier
1033e12c5d1SDavid du Colombier extern char lastc;
1043e12c5d1SDavid du Colombier
1053e12c5d1SDavid du Colombier rdc();
1063e12c5d1SDavid du Colombier readsym(name);
107219b2ee8SDavid du Colombier i = findseg(map, name);
108219b2ee8SDavid du Colombier if (i < 0) /* not found */
1093e12c5d1SDavid du Colombier error("Invalid map name");
110219b2ee8SDavid du Colombier
111219b2ee8SDavid du Colombier if (expr(0)) {
112219b2ee8SDavid du Colombier if (strcmp(name, "text") == 0)
113219b2ee8SDavid du Colombier textseg(expv, &fhdr);
114219b2ee8SDavid du Colombier map->seg[i].b = expv;
115219b2ee8SDavid du Colombier } else
1163e12c5d1SDavid du Colombier error("Invalid base address");
1173e12c5d1SDavid du Colombier if (expr(0))
118219b2ee8SDavid du Colombier map->seg[i].e = expv;
1193e12c5d1SDavid du Colombier else
1203e12c5d1SDavid du Colombier error("Invalid end address");
1213e12c5d1SDavid du Colombier if (expr(0))
122219b2ee8SDavid du Colombier map->seg[i].f = expv;
1233e12c5d1SDavid du Colombier else
1243e12c5d1SDavid du Colombier error("Invalid file offset");
1253e12c5d1SDavid du Colombier if (rdc()=='?' && map == cormap) {
1263e12c5d1SDavid du Colombier if (fcor)
1273e12c5d1SDavid du Colombier close(fcor);
1283e12c5d1SDavid du Colombier fcor=fsym;
1293e12c5d1SDavid du Colombier corfil=symfil;
1303e12c5d1SDavid du Colombier cormap = symmap;
1313e12c5d1SDavid du Colombier } else if (lastc == '/' && map == symmap) {
1323e12c5d1SDavid du Colombier if (fsym)
1333e12c5d1SDavid du Colombier close(fsym);
1343e12c5d1SDavid du Colombier fsym=fcor;
1353e12c5d1SDavid du Colombier symfil=corfil;
1363e12c5d1SDavid du Colombier symmap=cormap;
1373e12c5d1SDavid du Colombier } else
1383e12c5d1SDavid du Colombier reread();
1393e12c5d1SDavid du Colombier }
1403e12c5d1SDavid du Colombier
1413e12c5d1SDavid du Colombier static int
getfile(char * filnam,int cnt,int omode)1423e12c5d1SDavid du Colombier getfile(char *filnam, int cnt, int omode)
1433e12c5d1SDavid du Colombier {
1443e12c5d1SDavid du Colombier int f;
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier if (filnam == 0)
1473e12c5d1SDavid du Colombier return -1;
1483e12c5d1SDavid du Colombier if (strcmp(filnam, "-") == 0)
1493e12c5d1SDavid du Colombier return 0;
1503e12c5d1SDavid du Colombier f = open(filnam, omode|OCEXEC);
1513e12c5d1SDavid du Colombier if(f < 0 && omode == ORDWR){
1523e12c5d1SDavid du Colombier f = open(filnam, OREAD|OCEXEC);
1533e12c5d1SDavid du Colombier if(f >= 0)
1543e12c5d1SDavid du Colombier dprint("%s open read-only\n", filnam);
1553e12c5d1SDavid du Colombier }
1563e12c5d1SDavid du Colombier if (f < 0 && xargc > cnt)
1573e12c5d1SDavid du Colombier if (wtflag)
1583e12c5d1SDavid du Colombier f = create(filnam, 1, 0666);
1593e12c5d1SDavid du Colombier if (f < 0) {
160bd389b36SDavid du Colombier dprint("cannot open `%s': %r\n", filnam);
1613e12c5d1SDavid du Colombier return -1;
1623e12c5d1SDavid du Colombier }
1633e12c5d1SDavid du Colombier return f;
1643e12c5d1SDavid du Colombier }
1653e12c5d1SDavid du Colombier
1663e12c5d1SDavid du Colombier void
kmsys(void)1673e12c5d1SDavid du Colombier kmsys(void)
1683e12c5d1SDavid du Colombier {
169219b2ee8SDavid du Colombier int i;
1703e12c5d1SDavid du Colombier
171219b2ee8SDavid du Colombier i = findseg(symmap, "text");
172219b2ee8SDavid du Colombier if (i >= 0) {
173219b2ee8SDavid du Colombier symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
174219b2ee8SDavid du Colombier symmap->seg[i].e = ~0;
1753e12c5d1SDavid du Colombier }
176219b2ee8SDavid du Colombier i = findseg(symmap, "data");
177219b2ee8SDavid du Colombier if (i >= 0) {
178219b2ee8SDavid du Colombier symmap->seg[i].b |= mach->kbase;
179219b2ee8SDavid du Colombier symmap->seg[i].e |= mach->kbase;
1803e12c5d1SDavid du Colombier }
1813e12c5d1SDavid du Colombier }
1823e12c5d1SDavid du Colombier
1833e12c5d1SDavid du Colombier void
attachprocess(void)1847dd7cddfSDavid du Colombier attachprocess(void)
1853e12c5d1SDavid du Colombier {
1863e12c5d1SDavid du Colombier char buf[100];
187*9a747e4fSDavid du Colombier Dir *sym, *mem;
1883e12c5d1SDavid du Colombier int fd;
1893e12c5d1SDavid du Colombier
1903e12c5d1SDavid du Colombier if (!adrflg) {
1913e12c5d1SDavid du Colombier dprint("used pid$a\n");
1923e12c5d1SDavid du Colombier return;
1933e12c5d1SDavid du Colombier }
194*9a747e4fSDavid du Colombier sym = dirfstat(fsym);
1957dd7cddfSDavid du Colombier sprint(buf, "/proc/%lud/mem", adrval);
1963e12c5d1SDavid du Colombier corfil = buf;
1973e12c5d1SDavid du Colombier setcor();
1987dd7cddfSDavid du Colombier sprint(buf, "/proc/%lud/text", adrval);
1993e12c5d1SDavid du Colombier fd = open(buf, OREAD);
200*9a747e4fSDavid du Colombier mem = nil;
201*9a747e4fSDavid du Colombier if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
202*9a747e4fSDavid du Colombier || sym->qid.path != mem->qid.path)
2033e12c5d1SDavid du Colombier dprint("warning: text images may be inconsistent\n");
204*9a747e4fSDavid du Colombier free(sym);
205*9a747e4fSDavid du Colombier free(mem);
2063e12c5d1SDavid du Colombier if (fd >= 0)
2073e12c5d1SDavid du Colombier close(fd);
2083e12c5d1SDavid du Colombier }
209