Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
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 *
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
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
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
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
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
}