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