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