]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/db/setup.c
mothra: never snarf the "Go:" box
[plan9front.git] / sys / src / cmd / db / setup.c
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 }