Blame


1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <mach.h>
5 564ca709 2004-04-19 devnull #define Extern
6 564ca709 2004-04-19 devnull #include "acid.h"
7 564ca709 2004-04-19 devnull #include "y.tab.h"
8 564ca709 2004-04-19 devnull
9 564ca709 2004-04-19 devnull extern int __ifmt(Fmt*);
10 564ca709 2004-04-19 devnull
11 564ca709 2004-04-19 devnull static Biobuf bioout;
12 564ca709 2004-04-19 devnull static char* lm[16];
13 564ca709 2004-04-19 devnull static int nlm;
14 564ca709 2004-04-19 devnull static char* mtype;
15 564ca709 2004-04-19 devnull
16 564ca709 2004-04-19 devnull static int attachfiles(int, char**);
17 564ca709 2004-04-19 devnull int xfmt(Fmt*);
18 564ca709 2004-04-19 devnull int isnumeric(char*);
19 564ca709 2004-04-19 devnull void die(void);
20 564ca709 2004-04-19 devnull void setcore(Fhdr*);
21 564ca709 2004-04-19 devnull
22 564ca709 2004-04-19 devnull void
23 564ca709 2004-04-19 devnull usage(void)
24 564ca709 2004-04-19 devnull {
25 564ca709 2004-04-19 devnull fprint(2, "usage: acid [-c core] [-l module] [-m machine] [-qrw] [-k] [pid] [file]\n");
26 564ca709 2004-04-19 devnull exits("usage");
27 f9aa99c7 2004-06-09 devnull }
28 f9aa99c7 2004-06-09 devnull
29 f9aa99c7 2004-06-09 devnull Map*
30 f9aa99c7 2004-06-09 devnull dumbmap(int fd)
31 f9aa99c7 2004-06-09 devnull {
32 f9aa99c7 2004-06-09 devnull Map *dumb;
33 f9aa99c7 2004-06-09 devnull Seg s;
34 f9aa99c7 2004-06-09 devnull
35 f9aa99c7 2004-06-09 devnull dumb = allocmap();
36 f9aa99c7 2004-06-09 devnull memset(&s, 0, sizeof s);
37 f9aa99c7 2004-06-09 devnull s.fd = fd;
38 f9aa99c7 2004-06-09 devnull s.base = 0;
39 f9aa99c7 2004-06-09 devnull s.offset = 0;
40 f9aa99c7 2004-06-09 devnull s.size = 0xFFFFFFFF;
41 f9aa99c7 2004-06-09 devnull s.name = "data";
42 f9aa99c7 2004-06-09 devnull s.file = "<dumb>";
43 f9aa99c7 2004-06-09 devnull if(addseg(dumb, s) < 0){
44 f9aa99c7 2004-06-09 devnull freemap(dumb);
45 f9aa99c7 2004-06-09 devnull return nil;
46 f9aa99c7 2004-06-09 devnull }
47 f9aa99c7 2004-06-09 devnull if(mach == nil)
48 f9aa99c7 2004-06-09 devnull mach = machcpu;
49 f9aa99c7 2004-06-09 devnull return dumb;
50 564ca709 2004-04-19 devnull }
51 564ca709 2004-04-19 devnull
52 564ca709 2004-04-19 devnull void
53 564ca709 2004-04-19 devnull main(int argc, char *argv[])
54 564ca709 2004-04-19 devnull {
55 f7b74c17 2004-12-28 devnull Lsym *volatile l;
56 564ca709 2004-04-19 devnull Node *n;
57 564ca709 2004-04-19 devnull char buf[128], *s;
58 564ca709 2004-04-19 devnull int pid, i;
59 564ca709 2004-04-19 devnull
60 564ca709 2004-04-19 devnull argv0 = argv[0];
61 564ca709 2004-04-19 devnull pid = 0;
62 564ca709 2004-04-19 devnull quiet = 1;
63 564ca709 2004-04-19 devnull
64 564ca709 2004-04-19 devnull mtype = 0;
65 564ca709 2004-04-19 devnull ARGBEGIN{
66 564ca709 2004-04-19 devnull case 'A':
67 564ca709 2004-04-19 devnull abort();
68 564ca709 2004-04-19 devnull break;
69 564ca709 2004-04-19 devnull case 'm':
70 564ca709 2004-04-19 devnull mtype = ARGF();
71 564ca709 2004-04-19 devnull break;
72 564ca709 2004-04-19 devnull case 'w':
73 564ca709 2004-04-19 devnull wtflag = 1;
74 564ca709 2004-04-19 devnull break;
75 564ca709 2004-04-19 devnull case 'l':
76 564ca709 2004-04-19 devnull s = ARGF();
77 564ca709 2004-04-19 devnull if(s == 0)
78 564ca709 2004-04-19 devnull usage();
79 564ca709 2004-04-19 devnull lm[nlm++] = s;
80 564ca709 2004-04-19 devnull break;
81 564ca709 2004-04-19 devnull case 'k':
82 564ca709 2004-04-19 devnull kernel++;
83 564ca709 2004-04-19 devnull break;
84 564ca709 2004-04-19 devnull case 'q':
85 564ca709 2004-04-19 devnull quiet = 0;
86 564ca709 2004-04-19 devnull break;
87 564ca709 2004-04-19 devnull case 'r':
88 564ca709 2004-04-19 devnull pid = 1;
89 564ca709 2004-04-19 devnull remote++;
90 564ca709 2004-04-19 devnull kernel++;
91 564ca709 2004-04-19 devnull break;
92 564ca709 2004-04-19 devnull default:
93 564ca709 2004-04-19 devnull usage();
94 564ca709 2004-04-19 devnull }ARGEND
95 fa325e9b 2020-01-10 cross
96 443d6288 2012-02-19 rsc USED(pid);
97 564ca709 2004-04-19 devnull
98 564ca709 2004-04-19 devnull fmtinstall('Z', Zfmt);
99 564ca709 2004-04-19 devnull fmtinstall('L', locfmt);
100 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
101 564ca709 2004-04-19 devnull bout = &bioout;
102 564ca709 2004-04-19 devnull
103 e637c944 2004-04-20 devnull initexpr();
104 d2cbcb77 2004-04-20 devnull initprint();
105 564ca709 2004-04-19 devnull kinit();
106 564ca709 2004-04-19 devnull initialising = 1;
107 564ca709 2004-04-19 devnull pushfile(0);
108 564ca709 2004-04-19 devnull loadvars();
109 564ca709 2004-04-19 devnull installbuiltin();
110 4f2ac1b7 2005-01-23 devnull acidregs = mallocz(sizeof *acidregs, 1);
111 4f2ac1b7 2005-01-23 devnull acidregs->rw = acidregsrw;
112 564ca709 2004-04-19 devnull
113 564ca709 2004-04-19 devnull if(mtype && machbyname(mtype) == 0)
114 564ca709 2004-04-19 devnull print("unknown machine %s", mtype);
115 564ca709 2004-04-19 devnull
116 564ca709 2004-04-19 devnull if (attachfiles(argc, argv) < 0)
117 564ca709 2004-04-19 devnull varreg(); /* use default register set on error */
118 564ca709 2004-04-19 devnull if(mach == nil)
119 564ca709 2004-04-19 devnull mach = machcpu;
120 564ca709 2004-04-19 devnull
121 564ca709 2004-04-19 devnull symhdr = nil; /* not supposed to use this anymore */
122 564ca709 2004-04-19 devnull
123 564ca709 2004-04-19 devnull l = mkvar("acid");
124 564ca709 2004-04-19 devnull l->v->set = 1;
125 564ca709 2004-04-19 devnull l->v->type = TLIST;
126 564ca709 2004-04-19 devnull l->v->store.u.l = nil;
127 564ca709 2004-04-19 devnull
128 13e66070 2004-04-20 devnull loadmodule(unsharp("#9/acid/port"));
129 564ca709 2004-04-19 devnull for(i = 0; i < nlm; i++) {
130 564ca709 2004-04-19 devnull if(access(lm[i], AREAD) >= 0)
131 564ca709 2004-04-19 devnull loadmodule(lm[i]);
132 564ca709 2004-04-19 devnull else {
133 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", lm[i]);
134 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
135 564ca709 2004-04-19 devnull }
136 564ca709 2004-04-19 devnull }
137 564ca709 2004-04-19 devnull
138 564ca709 2004-04-19 devnull userinit();
139 564ca709 2004-04-19 devnull varsym();
140 564ca709 2004-04-19 devnull
141 564ca709 2004-04-19 devnull l = look("acidmap");
142 564ca709 2004-04-19 devnull if(l && l->proc) {
143 b4a659b6 2004-04-19 devnull if(setjmp(err) == 0){
144 b4a659b6 2004-04-19 devnull n = an(ONAME, ZN, ZN);
145 b4a659b6 2004-04-19 devnull n->sym = l;
146 b4a659b6 2004-04-19 devnull n = an(OCALL, n, ZN);
147 b4a659b6 2004-04-19 devnull execute(n);
148 b4a659b6 2004-04-19 devnull }
149 564ca709 2004-04-19 devnull }
150 564ca709 2004-04-19 devnull
151 564ca709 2004-04-19 devnull interactive = 1;
152 564ca709 2004-04-19 devnull initialising = 0;
153 564ca709 2004-04-19 devnull line = 1;
154 564ca709 2004-04-19 devnull
155 564ca709 2004-04-19 devnull notify(catcher);
156 564ca709 2004-04-19 devnull
157 564ca709 2004-04-19 devnull for(;;) {
158 564ca709 2004-04-19 devnull if(setjmp(err)) {
159 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
160 564ca709 2004-04-19 devnull unwind();
161 564ca709 2004-04-19 devnull }
162 564ca709 2004-04-19 devnull stacked = 0;
163 564ca709 2004-04-19 devnull
164 564ca709 2004-04-19 devnull Bprint(bout, "acid; ");
165 564ca709 2004-04-19 devnull
166 564ca709 2004-04-19 devnull if(yyparse() != 1)
167 564ca709 2004-04-19 devnull die();
168 564ca709 2004-04-19 devnull restartio();
169 564ca709 2004-04-19 devnull
170 564ca709 2004-04-19 devnull unwind();
171 564ca709 2004-04-19 devnull }
172 9268e33d 2005-01-14 devnull /*
173 564ca709 2004-04-19 devnull Bputc(bout, '\n');
174 564ca709 2004-04-19 devnull exits(0);
175 9268e33d 2005-01-14 devnull */
176 4f2ac1b7 2005-01-23 devnull }
177 4f2ac1b7 2005-01-23 devnull
178 4f2ac1b7 2005-01-23 devnull void
179 4f2ac1b7 2005-01-23 devnull setstring(char *var, char *s)
180 4f2ac1b7 2005-01-23 devnull {
181 4f2ac1b7 2005-01-23 devnull Lsym *l;
182 4f2ac1b7 2005-01-23 devnull Value *v;
183 4f2ac1b7 2005-01-23 devnull
184 4f2ac1b7 2005-01-23 devnull l = mkvar(var);
185 4f2ac1b7 2005-01-23 devnull v = l->v;
186 4f2ac1b7 2005-01-23 devnull v->store.fmt = 's';
187 4f2ac1b7 2005-01-23 devnull v->set = 1;
188 4f2ac1b7 2005-01-23 devnull v->store.u.string = strnode(s ? s : "");
189 4f2ac1b7 2005-01-23 devnull v->type = TSTRING;
190 564ca709 2004-04-19 devnull }
191 564ca709 2004-04-19 devnull
192 564ca709 2004-04-19 devnull static int
193 564ca709 2004-04-19 devnull attachfiles(int argc, char **argv)
194 564ca709 2004-04-19 devnull {
195 f7b74c17 2004-12-28 devnull volatile int pid;
196 564ca709 2004-04-19 devnull Lsym *l;
197 564ca709 2004-04-19 devnull
198 b4a659b6 2004-04-19 devnull pid = 0;
199 564ca709 2004-04-19 devnull interactive = 0;
200 443d6288 2012-02-19 rsc USED(pid);
201 fa325e9b 2020-01-10 cross
202 564ca709 2004-04-19 devnull if(setjmp(err))
203 564ca709 2004-04-19 devnull return -1;
204 564ca709 2004-04-19 devnull
205 7b8a3f12 2005-02-11 devnull attachargs(argc, argv, wtflag?ORDWR:OREAD, 1);
206 564ca709 2004-04-19 devnull
207 4f2ac1b7 2005-01-23 devnull setstring("objtype", mach->name);
208 4f2ac1b7 2005-01-23 devnull setstring("textfile", symfil);
209 4f2ac1b7 2005-01-23 devnull setstring("systype", symhdr ? symhdr->aname : "");
210 4f2ac1b7 2005-01-23 devnull setstring("corefile", corfil);
211 564ca709 2004-04-19 devnull
212 4f2ac1b7 2005-01-23 devnull l = mkvar("pids");
213 4f2ac1b7 2005-01-23 devnull l->v->set = 1;
214 4f2ac1b7 2005-01-23 devnull l->v->type = TLIST;
215 4f2ac1b7 2005-01-23 devnull l->v->store.u.l = nil;
216 564ca709 2004-04-19 devnull
217 7b8a3f12 2005-02-11 devnull if(corpid)
218 7b8a3f12 2005-02-11 devnull sproc(corpid);
219 564ca709 2004-04-19 devnull if(corhdr)
220 564ca709 2004-04-19 devnull setcore(corhdr);
221 564ca709 2004-04-19 devnull varreg();
222 564ca709 2004-04-19 devnull return 0;
223 564ca709 2004-04-19 devnull }
224 564ca709 2004-04-19 devnull
225 564ca709 2004-04-19 devnull void
226 564ca709 2004-04-19 devnull setcore(Fhdr *hdr)
227 564ca709 2004-04-19 devnull {
228 4f2ac1b7 2005-01-23 devnull int i;
229 4f2ac1b7 2005-01-23 devnull Lsym *l;
230 4f2ac1b7 2005-01-23 devnull Value *v;
231 4f2ac1b7 2005-01-23 devnull List **tail, *tl;
232 4f2ac1b7 2005-01-23 devnull
233 564ca709 2004-04-19 devnull unmapproc(cormap);
234 564ca709 2004-04-19 devnull unmapfile(corhdr, cormap);
235 564ca709 2004-04-19 devnull free(correg);
236 564ca709 2004-04-19 devnull correg = nil;
237 564ca709 2004-04-19 devnull
238 564ca709 2004-04-19 devnull if(hdr == nil)
239 564ca709 2004-04-19 devnull error("no core");
240 564ca709 2004-04-19 devnull if(mapfile(hdr, 0, cormap, &correg) < 0)
241 564ca709 2004-04-19 devnull error("mapfile %s: %r", hdr->filename);
242 564ca709 2004-04-19 devnull corhdr = hdr;
243 564ca709 2004-04-19 devnull corfil = hdr->filename;
244 4f2ac1b7 2005-01-23 devnull
245 4f2ac1b7 2005-01-23 devnull l = mkvar("pid");
246 4f2ac1b7 2005-01-23 devnull v = l->v;
247 4f2ac1b7 2005-01-23 devnull v->store.fmt = 'D';
248 4f2ac1b7 2005-01-23 devnull v->set = 1;
249 4f2ac1b7 2005-01-23 devnull v->store.u.ival = hdr->pid;
250 4f2ac1b7 2005-01-23 devnull
251 4f2ac1b7 2005-01-23 devnull setstring("corefile", corfil);
252 4f2ac1b7 2005-01-23 devnull setstring("cmdline", hdr->cmdline);
253 4f2ac1b7 2005-01-23 devnull
254 4f2ac1b7 2005-01-23 devnull l = mkvar("pids");
255 4f2ac1b7 2005-01-23 devnull l->v->set = 1;
256 4f2ac1b7 2005-01-23 devnull l->v->type = TLIST;
257 4f2ac1b7 2005-01-23 devnull l->v->store.u.l = nil;
258 4f2ac1b7 2005-01-23 devnull tail = &l->v->store.u.l;
259 4f2ac1b7 2005-01-23 devnull for(i=0; i<hdr->nthread; i++){
260 4f2ac1b7 2005-01-23 devnull tl = al(TINT);
261 4f2ac1b7 2005-01-23 devnull tl->store.u.ival = hdr->thread[i].id;
262 4f2ac1b7 2005-01-23 devnull tl->store.fmt = 'X';
263 4f2ac1b7 2005-01-23 devnull *tail = tl;
264 4f2ac1b7 2005-01-23 devnull tail = &tl->next;
265 4f2ac1b7 2005-01-23 devnull }
266 4f2ac1b7 2005-01-23 devnull
267 4f2ac1b7 2005-01-23 devnull if(hdr->nthread)
268 4f2ac1b7 2005-01-23 devnull sproc(hdr->thread[0].id);
269 564ca709 2004-04-19 devnull }
270 564ca709 2004-04-19 devnull
271 564ca709 2004-04-19 devnull void
272 564ca709 2004-04-19 devnull die(void)
273 564ca709 2004-04-19 devnull {
274 564ca709 2004-04-19 devnull Lsym *s;
275 564ca709 2004-04-19 devnull List *f;
276 4f2ac1b7 2005-01-23 devnull int first;
277 564ca709 2004-04-19 devnull
278 564ca709 2004-04-19 devnull Bprint(bout, "\n");
279 564ca709 2004-04-19 devnull
280 4f2ac1b7 2005-01-23 devnull first = 1;
281 564ca709 2004-04-19 devnull s = look("proclist");
282 564ca709 2004-04-19 devnull if(s && s->v->type == TLIST) {
283 564ca709 2004-04-19 devnull for(f = s->v->store.u.l; f; f = f->next){
284 564ca709 2004-04-19 devnull detachproc((int)f->store.u.ival);
285 4f2ac1b7 2005-01-23 devnull Bprint(bout, "%s %d", first ? "/bin/kill -9" : "", (int)f->store.u.ival);
286 4f2ac1b7 2005-01-23 devnull first = 0;
287 564ca709 2004-04-19 devnull }
288 564ca709 2004-04-19 devnull }
289 4f2ac1b7 2005-01-23 devnull if(!first)
290 4f2ac1b7 2005-01-23 devnull Bprint(bout, "\n");
291 564ca709 2004-04-19 devnull exits(0);
292 564ca709 2004-04-19 devnull }
293 564ca709 2004-04-19 devnull
294 564ca709 2004-04-19 devnull void
295 564ca709 2004-04-19 devnull userinit(void)
296 564ca709 2004-04-19 devnull {
297 564ca709 2004-04-19 devnull Lsym *l;
298 564ca709 2004-04-19 devnull Node *n;
299 564ca709 2004-04-19 devnull char buf[128], *p;
300 564ca709 2004-04-19 devnull
301 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", mach->name);
302 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
303 c8b6342d 2005-01-13 devnull p = getenv("HOME");
304 564ca709 2004-04-19 devnull if(p != 0) {
305 564ca709 2004-04-19 devnull sprint(buf, "%s/lib/acid", p);
306 564ca709 2004-04-19 devnull silent = 1;
307 564ca709 2004-04-19 devnull loadmodule(buf);
308 564ca709 2004-04-19 devnull }
309 564ca709 2004-04-19 devnull
310 564ca709 2004-04-19 devnull interactive = 0;
311 564ca709 2004-04-19 devnull if(setjmp(err)) {
312 564ca709 2004-04-19 devnull unwind();
313 564ca709 2004-04-19 devnull return;
314 564ca709 2004-04-19 devnull }
315 564ca709 2004-04-19 devnull l = look("acidinit");
316 564ca709 2004-04-19 devnull if(l && l->proc) {
317 564ca709 2004-04-19 devnull n = an(ONAME, ZN, ZN);
318 564ca709 2004-04-19 devnull n->sym = l;
319 564ca709 2004-04-19 devnull n = an(OCALL, n, ZN);
320 564ca709 2004-04-19 devnull execute(n);
321 564ca709 2004-04-19 devnull }
322 564ca709 2004-04-19 devnull }
323 564ca709 2004-04-19 devnull
324 564ca709 2004-04-19 devnull void
325 564ca709 2004-04-19 devnull loadmodule(char *s)
326 564ca709 2004-04-19 devnull {
327 564ca709 2004-04-19 devnull interactive = 0;
328 564ca709 2004-04-19 devnull if(setjmp(err)) {
329 564ca709 2004-04-19 devnull unwind();
330 564ca709 2004-04-19 devnull return;
331 564ca709 2004-04-19 devnull }
332 564ca709 2004-04-19 devnull pushfile(s);
333 564ca709 2004-04-19 devnull silent = 0;
334 564ca709 2004-04-19 devnull yyparse();
335 564ca709 2004-04-19 devnull popio();
336 564ca709 2004-04-19 devnull return;
337 564ca709 2004-04-19 devnull }
338 564ca709 2004-04-19 devnull
339 564ca709 2004-04-19 devnull Node*
340 564ca709 2004-04-19 devnull an(int op, Node *l, Node *r)
341 564ca709 2004-04-19 devnull {
342 564ca709 2004-04-19 devnull Node *n;
343 564ca709 2004-04-19 devnull
344 564ca709 2004-04-19 devnull n = gmalloc(sizeof(Node));
345 564ca709 2004-04-19 devnull memset(n, 0, sizeof(Node));
346 564ca709 2004-04-19 devnull n->gc.gclink = gcl;
347 564ca709 2004-04-19 devnull gcl = (Gc*)n;
348 564ca709 2004-04-19 devnull n->op = op;
349 564ca709 2004-04-19 devnull n->left = l;
350 564ca709 2004-04-19 devnull n->right = r;
351 564ca709 2004-04-19 devnull return n;
352 564ca709 2004-04-19 devnull }
353 564ca709 2004-04-19 devnull
354 564ca709 2004-04-19 devnull List*
355 564ca709 2004-04-19 devnull al(int t)
356 564ca709 2004-04-19 devnull {
357 564ca709 2004-04-19 devnull List *l;
358 564ca709 2004-04-19 devnull
359 564ca709 2004-04-19 devnull l = gmalloc(sizeof(List));
360 564ca709 2004-04-19 devnull memset(l, 0, sizeof(List));
361 564ca709 2004-04-19 devnull l->type = t;
362 564ca709 2004-04-19 devnull l->gc.gclink = gcl;
363 564ca709 2004-04-19 devnull gcl = (Gc*)l;
364 564ca709 2004-04-19 devnull return l;
365 564ca709 2004-04-19 devnull }
366 564ca709 2004-04-19 devnull
367 564ca709 2004-04-19 devnull Node*
368 4a000a28 2012-03-05 rsc con(s64int v)
369 564ca709 2004-04-19 devnull {
370 564ca709 2004-04-19 devnull Node *n;
371 564ca709 2004-04-19 devnull
372 564ca709 2004-04-19 devnull n = an(OCONST, ZN, ZN);
373 564ca709 2004-04-19 devnull n->store.u.ival = v;
374 564ca709 2004-04-19 devnull n->store.fmt = 'X';
375 564ca709 2004-04-19 devnull n->type = TINT;
376 564ca709 2004-04-19 devnull return n;
377 564ca709 2004-04-19 devnull }
378 564ca709 2004-04-19 devnull
379 564ca709 2004-04-19 devnull void
380 564ca709 2004-04-19 devnull fatal(char *fmt, ...)
381 564ca709 2004-04-19 devnull {
382 564ca709 2004-04-19 devnull char buf[128];
383 564ca709 2004-04-19 devnull va_list arg;
384 564ca709 2004-04-19 devnull
385 564ca709 2004-04-19 devnull va_start(arg, fmt);
386 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
387 564ca709 2004-04-19 devnull va_end(arg);
388 564ca709 2004-04-19 devnull fprint(2, "%s: %Z (fatal problem) %s\n", argv0, buf);
389 564ca709 2004-04-19 devnull exits(buf);
390 564ca709 2004-04-19 devnull }
391 564ca709 2004-04-19 devnull
392 564ca709 2004-04-19 devnull void
393 564ca709 2004-04-19 devnull yyerror(char *fmt, ...)
394 564ca709 2004-04-19 devnull {
395 564ca709 2004-04-19 devnull char buf[128];
396 564ca709 2004-04-19 devnull va_list arg;
397 564ca709 2004-04-19 devnull
398 564ca709 2004-04-19 devnull if(strcmp(fmt, "syntax error") == 0) {
399 564ca709 2004-04-19 devnull yyerror("syntax error, near symbol '%s'", symbol);
400 564ca709 2004-04-19 devnull return;
401 564ca709 2004-04-19 devnull }
402 564ca709 2004-04-19 devnull va_start(arg, fmt);
403 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
404 564ca709 2004-04-19 devnull va_end(arg);
405 564ca709 2004-04-19 devnull print("%Z: %s\n", buf);
406 564ca709 2004-04-19 devnull }
407 564ca709 2004-04-19 devnull
408 564ca709 2004-04-19 devnull void
409 564ca709 2004-04-19 devnull marktree(Node *n)
410 564ca709 2004-04-19 devnull {
411 564ca709 2004-04-19 devnull
412 564ca709 2004-04-19 devnull if(n == 0)
413 564ca709 2004-04-19 devnull return;
414 564ca709 2004-04-19 devnull
415 564ca709 2004-04-19 devnull marktree(n->left);
416 564ca709 2004-04-19 devnull marktree(n->right);
417 564ca709 2004-04-19 devnull
418 564ca709 2004-04-19 devnull n->gc.gcmark = 1;
419 564ca709 2004-04-19 devnull if(n->op != OCONST)
420 564ca709 2004-04-19 devnull return;
421 564ca709 2004-04-19 devnull
422 564ca709 2004-04-19 devnull switch(n->type) {
423 564ca709 2004-04-19 devnull case TSTRING:
424 564ca709 2004-04-19 devnull n->store.u.string->gc.gcmark = 1;
425 564ca709 2004-04-19 devnull break;
426 564ca709 2004-04-19 devnull case TLIST:
427 564ca709 2004-04-19 devnull marklist(n->store.u.l);
428 564ca709 2004-04-19 devnull break;
429 564ca709 2004-04-19 devnull case TCODE:
430 564ca709 2004-04-19 devnull marktree(n->store.u.cc);
431 564ca709 2004-04-19 devnull break;
432 564ca709 2004-04-19 devnull }
433 564ca709 2004-04-19 devnull }
434 564ca709 2004-04-19 devnull
435 564ca709 2004-04-19 devnull void
436 564ca709 2004-04-19 devnull marklist(List *l)
437 564ca709 2004-04-19 devnull {
438 564ca709 2004-04-19 devnull while(l) {
439 564ca709 2004-04-19 devnull l->gc.gcmark = 1;
440 564ca709 2004-04-19 devnull switch(l->type) {
441 564ca709 2004-04-19 devnull case TSTRING:
442 564ca709 2004-04-19 devnull l->store.u.string->gc.gcmark = 1;
443 564ca709 2004-04-19 devnull break;
444 564ca709 2004-04-19 devnull case TLIST:
445 564ca709 2004-04-19 devnull marklist(l->store.u.l);
446 564ca709 2004-04-19 devnull break;
447 564ca709 2004-04-19 devnull case TCODE:
448 564ca709 2004-04-19 devnull marktree(l->store.u.cc);
449 564ca709 2004-04-19 devnull break;
450 564ca709 2004-04-19 devnull }
451 564ca709 2004-04-19 devnull l = l->next;
452 564ca709 2004-04-19 devnull }
453 564ca709 2004-04-19 devnull }
454 564ca709 2004-04-19 devnull
455 564ca709 2004-04-19 devnull void
456 564ca709 2004-04-19 devnull gc(void)
457 564ca709 2004-04-19 devnull {
458 564ca709 2004-04-19 devnull int i;
459 564ca709 2004-04-19 devnull Lsym *f;
460 564ca709 2004-04-19 devnull Value *v;
461 564ca709 2004-04-19 devnull Gc *m, **p, *next;
462 564ca709 2004-04-19 devnull
463 564ca709 2004-04-19 devnull if(dogc < Mempergc)
464 564ca709 2004-04-19 devnull return;
465 564ca709 2004-04-19 devnull dogc = 0;
466 564ca709 2004-04-19 devnull
467 564ca709 2004-04-19 devnull /* Mark */
468 564ca709 2004-04-19 devnull for(m = gcl; m; m = m->gclink)
469 564ca709 2004-04-19 devnull m->gcmark = 0;
470 564ca709 2004-04-19 devnull
471 564ca709 2004-04-19 devnull /* Scan */
472 564ca709 2004-04-19 devnull for(i = 0; i < Hashsize; i++) {
473 564ca709 2004-04-19 devnull for(f = hash[i]; f; f = f->hash) {
474 564ca709 2004-04-19 devnull marktree(f->proc);
475 564ca709 2004-04-19 devnull if(f->lexval != Tid)
476 564ca709 2004-04-19 devnull continue;
477 564ca709 2004-04-19 devnull for(v = f->v; v; v = v->pop) {
478 564ca709 2004-04-19 devnull switch(v->type) {
479 564ca709 2004-04-19 devnull case TSTRING:
480 564ca709 2004-04-19 devnull v->store.u.string->gc.gcmark = 1;
481 564ca709 2004-04-19 devnull break;
482 564ca709 2004-04-19 devnull case TLIST:
483 564ca709 2004-04-19 devnull marklist(v->store.u.l);
484 564ca709 2004-04-19 devnull break;
485 564ca709 2004-04-19 devnull case TCODE:
486 564ca709 2004-04-19 devnull marktree(v->store.u.cc);
487 564ca709 2004-04-19 devnull break;
488 4f2ac1b7 2005-01-23 devnull case TCON:
489 4f2ac1b7 2005-01-23 devnull marktree(v->store.u.con);
490 4f2ac1b7 2005-01-23 devnull break;
491 564ca709 2004-04-19 devnull }
492 564ca709 2004-04-19 devnull }
493 564ca709 2004-04-19 devnull }
494 564ca709 2004-04-19 devnull }
495 564ca709 2004-04-19 devnull
496 564ca709 2004-04-19 devnull /* Free */
497 564ca709 2004-04-19 devnull p = &gcl;
498 564ca709 2004-04-19 devnull for(m = gcl; m; m = next) {
499 564ca709 2004-04-19 devnull next = m->gclink;
500 564ca709 2004-04-19 devnull if(m->gcmark == 0) {
501 564ca709 2004-04-19 devnull *p = next;
502 564ca709 2004-04-19 devnull free(m); /* Sleazy reliance on my malloc */
503 564ca709 2004-04-19 devnull }
504 564ca709 2004-04-19 devnull else
505 564ca709 2004-04-19 devnull p = &m->gclink;
506 564ca709 2004-04-19 devnull }
507 564ca709 2004-04-19 devnull }
508 564ca709 2004-04-19 devnull
509 564ca709 2004-04-19 devnull void*
510 564ca709 2004-04-19 devnull gmalloc(long l)
511 564ca709 2004-04-19 devnull {
512 564ca709 2004-04-19 devnull void *p;
513 564ca709 2004-04-19 devnull
514 564ca709 2004-04-19 devnull dogc += l;
515 564ca709 2004-04-19 devnull p = malloc(l);
516 564ca709 2004-04-19 devnull if(p == 0)
517 564ca709 2004-04-19 devnull fatal("out of memory");
518 564ca709 2004-04-19 devnull return p;
519 564ca709 2004-04-19 devnull }
520 564ca709 2004-04-19 devnull
521 564ca709 2004-04-19 devnull void
522 564ca709 2004-04-19 devnull checkqid(int f1, int pid)
523 564ca709 2004-04-19 devnull {
524 564ca709 2004-04-19 devnull int fd;
525 564ca709 2004-04-19 devnull Dir *d1, *d2;
526 564ca709 2004-04-19 devnull char buf[128];
527 564ca709 2004-04-19 devnull
528 564ca709 2004-04-19 devnull if(kernel)
529 564ca709 2004-04-19 devnull return;
530 564ca709 2004-04-19 devnull
531 564ca709 2004-04-19 devnull d1 = dirfstat(f1);
532 564ca709 2004-04-19 devnull if(d1 == nil){
533 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirfstat: %r\n");
534 564ca709 2004-04-19 devnull return;
535 564ca709 2004-04-19 devnull }
536 564ca709 2004-04-19 devnull
537 564ca709 2004-04-19 devnull sprint(buf, "/proc/%d/text", pid);
538 564ca709 2004-04-19 devnull fd = open(buf, OREAD);
539 564ca709 2004-04-19 devnull if(fd < 0 || (d2 = dirfstat(fd)) == nil){
540 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirstat %s: %r\n", buf);
541 564ca709 2004-04-19 devnull free(d1);
542 564ca709 2004-04-19 devnull if(fd >= 0)
543 564ca709 2004-04-19 devnull close(fd);
544 564ca709 2004-04-19 devnull return;
545 564ca709 2004-04-19 devnull }
546 564ca709 2004-04-19 devnull
547 564ca709 2004-04-19 devnull close(fd);
548 564ca709 2004-04-19 devnull
549 564ca709 2004-04-19 devnull if(d1->qid.path != d2->qid.path || d1->qid.vers != d2->qid.vers || d1->qid.type != d2->qid.type){
550 7b8a3f12 2005-02-11 devnull print("path %#llux %#llux vers %lud %lud type %d %d\n",
551 564ca709 2004-04-19 devnull d1->qid.path, d2->qid.path, d1->qid.vers, d2->qid.vers, d1->qid.type, d2->qid.type);
552 564ca709 2004-04-19 devnull print("warning: image does not match text for pid %d\n", pid);
553 564ca709 2004-04-19 devnull }
554 564ca709 2004-04-19 devnull free(d1);
555 564ca709 2004-04-19 devnull free(d2);
556 564ca709 2004-04-19 devnull }
557 564ca709 2004-04-19 devnull
558 564ca709 2004-04-19 devnull void
559 564ca709 2004-04-19 devnull catcher(void *junk, char *s)
560 564ca709 2004-04-19 devnull {
561 564ca709 2004-04-19 devnull USED(junk);
562 564ca709 2004-04-19 devnull
563 564ca709 2004-04-19 devnull if(strstr(s, "interrupt")) {
564 564ca709 2004-04-19 devnull gotint = 1;
565 564ca709 2004-04-19 devnull noted(NCONT);
566 564ca709 2004-04-19 devnull }
567 564ca709 2004-04-19 devnull if(strstr(s, "child"))
568 564ca709 2004-04-19 devnull noted(NCONT);
569 564ca709 2004-04-19 devnull fprint(2, "note: %s\n", s);
570 564ca709 2004-04-19 devnull noted(NDFLT);
571 564ca709 2004-04-19 devnull }
572 564ca709 2004-04-19 devnull
573 564ca709 2004-04-19 devnull char*
574 564ca709 2004-04-19 devnull system(void)
575 564ca709 2004-04-19 devnull {
576 564ca709 2004-04-19 devnull char *cpu, *p, *q;
577 564ca709 2004-04-19 devnull static char kernel[128];
578 564ca709 2004-04-19 devnull
579 564ca709 2004-04-19 devnull cpu = getenv("cputype");
580 564ca709 2004-04-19 devnull if(cpu == 0) {
581 564ca709 2004-04-19 devnull cpu = "mips";
582 564ca709 2004-04-19 devnull print("$cputype not set; assuming %s\n", cpu);
583 564ca709 2004-04-19 devnull }
584 564ca709 2004-04-19 devnull p = getenv("terminal");
585 564ca709 2004-04-19 devnull if(p == 0 || (p=strchr(p, ' ')) == 0 || p[1] == ' ' || p[1] == 0) {
586 564ca709 2004-04-19 devnull p = "9power";
587 564ca709 2004-04-19 devnull print("missing or bad $terminal; assuming %s\n", p);
588 564ca709 2004-04-19 devnull }
589 564ca709 2004-04-19 devnull else{
590 564ca709 2004-04-19 devnull p++;
591 564ca709 2004-04-19 devnull q = strchr(p, ' ');
592 564ca709 2004-04-19 devnull if(q)
593 564ca709 2004-04-19 devnull *q = 0;
594 564ca709 2004-04-19 devnull sprint(kernel, "/%s/9%s", cpu, p);
595 564ca709 2004-04-19 devnull }
596 564ca709 2004-04-19 devnull return kernel;
597 564ca709 2004-04-19 devnull }
598 564ca709 2004-04-19 devnull
599 564ca709 2004-04-19 devnull int
600 564ca709 2004-04-19 devnull isnumeric(char *s)
601 564ca709 2004-04-19 devnull {
602 564ca709 2004-04-19 devnull while(*s) {
603 564ca709 2004-04-19 devnull if(*s < '0' || *s > '9')
604 564ca709 2004-04-19 devnull return 0;
605 564ca709 2004-04-19 devnull s++;
606 564ca709 2004-04-19 devnull }
607 564ca709 2004-04-19 devnull return 1;
608 564ca709 2004-04-19 devnull }