xref: /plan9/sys/src/cmd/db/setup.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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