xref: /plan9/sys/src/cmd/db/setup.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 
2 /*
3  * init routines
4  */
5 #include "defs.h"
6 #include "fns.h"
7 
8 char	*symfil;
9 char	*corfil;
10 
11 Map	*symmap;
12 Map	*cormap;
13 Map	*dotmap;
14 
15 int fsym, fcor;
16 static Fhdr fhdr;
17 
18 static int getfile(char*, int, int);
19 
20 void
setsym(void)21 setsym(void)
22 {
23 	Symbol s;
24 
25 	if((fsym = getfile(symfil, 1, wtflag)) < 0) {
26 		symmap = dumbmap(-1);
27 		return;
28 	}
29 	if (crackhdr(fsym, &fhdr)) {
30 		machbytype(fhdr.type);
31 		symmap = loadmap(symmap, fsym, &fhdr);
32 		if (symmap == 0)
33 			symmap = dumbmap(fsym);
34 		if (syminit(fsym, &fhdr) < 0)
35 			dprint("%r\n");
36 		if (mach->sbreg && lookup(0, mach->sbreg, &s))
37 			mach->sb = s.value;
38 	}
39 	else
40 		symmap = dumbmap(fsym);
41 }
42 
43 void
setcor(void)44 setcor(void)
45 {
46 	int i;
47 
48 	if (cormap) {
49 		for (i = 0; i < cormap->nsegs; i++)
50 			if (cormap->seg[i].inuse)
51 				close(cormap->seg[i].fd);
52 	}
53 
54 	fcor = getfile(corfil, 2, ORDWR);
55 	if (fcor <= 0) {
56 		if (cormap)
57 			free(cormap);
58 		cormap = dumbmap(-1);
59 		return;
60 	}
61 	if(pid > 0) {	/* provide addressability to executing process */
62 		cormap = attachproc(pid, kflag, fcor, &fhdr);
63 		if (!cormap)
64 			cormap = dumbmap(-1);
65 	} else {
66 		cormap = newmap(cormap, 2);
67 		if (!cormap)
68 			cormap = dumbmap(-1);
69 		setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text");
70 		setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data");
71 	}
72 	kmsys();
73 	return;
74 }
75 
76 Map *
dumbmap(int fd)77 dumbmap(int fd)
78 {
79 	Map *dumb;
80 
81 	extern Mach mi386;
82 	extern Machdata i386mach;
83 
84 	dumb = newmap(0, 1);
85 	setmap(dumb, fd, 0, 0xffffffff, 0, "data");
86 	if (!mach) 			/* default machine = 386 */
87 		mach = &mi386;
88 	if (!machdata)
89 		machdata = &i386mach;
90 	return dumb;
91 }
92 
93 /*
94  * set up maps for a direct process image (/proc)
95  */
96 
97 void
cmdmap(Map * map)98 cmdmap(Map *map)
99 {
100 	int i;
101 	char name[MAXSYM];
102 
103 	extern char lastc;
104 
105 	rdc();
106 	readsym(name);
107 	i = findseg(map, name);
108 	if (i < 0)	/* not found */
109 		error("Invalid map name");
110 
111 	if (expr(0)) {
112 		if (strcmp(name, "text") == 0)
113 			textseg(expv, &fhdr);
114 		map->seg[i].b = expv;
115 	} else
116 		error("Invalid base address");
117 	if (expr(0))
118 		map->seg[i].e = expv;
119 	else
120 		error("Invalid end address");
121 	if (expr(0))
122 		map->seg[i].f = expv;
123 	else
124 		error("Invalid file offset");
125 	if (rdc()=='?' && map == cormap) {
126 		if (fcor)
127 			close(fcor);
128 		fcor=fsym;
129 		corfil=symfil;
130 		cormap = symmap;
131 	} else if (lastc == '/' && map == symmap) {
132 		if (fsym)
133 			close(fsym);
134 		fsym=fcor;
135 		symfil=corfil;
136 		symmap=cormap;
137 	} else
138 		reread();
139 }
140 
141 static int
getfile(char * filnam,int cnt,int omode)142 getfile(char *filnam, int cnt, int omode)
143 {
144 	int f;
145 
146 	if (filnam == 0)
147 		return -1;
148 	if (strcmp(filnam, "-") == 0)
149 		return 0;
150 	f = open(filnam, omode|OCEXEC);
151 	if(f < 0 && omode == ORDWR){
152 		f = open(filnam, OREAD|OCEXEC);
153 		if(f >= 0)
154 			dprint("%s open read-only\n", filnam);
155 	}
156 	if (f < 0 && xargc > cnt)
157 		if (wtflag)
158 			f = create(filnam, 1, 0666);
159 	if (f < 0) {
160 		dprint("cannot open `%s': %r\n", filnam);
161 		return -1;
162 	}
163 	return f;
164 }
165 
166 void
kmsys(void)167 kmsys(void)
168 {
169 	int i;
170 
171 	i = findseg(symmap, "text");
172 	if (i >= 0) {
173 		symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
174 		symmap->seg[i].e = ~0;
175 	}
176 	i = findseg(symmap, "data");
177 	if (i >= 0) {
178 		symmap->seg[i].b |= mach->kbase;
179 		symmap->seg[i].e |= mach->kbase;
180 	}
181 }
182 
183 void
attachprocess(void)184 attachprocess(void)
185 {
186 	char buf[100];
187 	Dir *sym, *mem;
188 	int fd;
189 
190 	if (!adrflg) {
191 		dprint("used pid$a\n");
192 		return;
193 	}
194 	sym = dirfstat(fsym);
195 	sprint(buf, "/proc/%lud/mem", adrval);
196 	corfil = buf;
197 	setcor();
198 	sprint(buf, "/proc/%lud/text", adrval);
199 	fd = open(buf, OREAD);
200 	mem = nil;
201 	if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
202 				|| sym->qid.path != mem->qid.path)
203 		dprint("warning: text images may be inconsistent\n");
204 	free(sym);
205 	free(mem);
206 	if (fd >= 0)
207 		close(fd);
208 }
209