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"
9 564ca709 2004-04-19 devnull extern int __ifmt(Fmt*);
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;
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*);
23 564ca709 2004-04-19 devnull usage(void)
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");
30 f9aa99c7 2004-06-09 devnull dumbmap(int fd)
32 f9aa99c7 2004-06-09 devnull Map *dumb;
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;
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;
53 564ca709 2004-04-19 devnull main(int argc, char *argv[])
55 f7b74c17 2004-12-28 devnull Lsym *volatile l;
57 564ca709 2004-04-19 devnull char buf[128], *s;
58 564ca709 2004-04-19 devnull int pid, i;
60 564ca709 2004-04-19 devnull argv0 = argv[0];
62 564ca709 2004-04-19 devnull quiet = 1;
64 564ca709 2004-04-19 devnull mtype = 0;
65 564ca709 2004-04-19 devnull ARGBEGIN{
66 564ca709 2004-04-19 devnull case 'A':
69 564ca709 2004-04-19 devnull case 'm':
70 564ca709 2004-04-19 devnull mtype = ARGF();
72 564ca709 2004-04-19 devnull case 'w':
73 564ca709 2004-04-19 devnull wtflag = 1;
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)
79 564ca709 2004-04-19 devnull lm[nlm++] = s;
81 564ca709 2004-04-19 devnull case 'k':
82 564ca709 2004-04-19 devnull kernel++;
84 564ca709 2004-04-19 devnull case 'q':
85 564ca709 2004-04-19 devnull quiet = 0;
87 564ca709 2004-04-19 devnull case 'r':
89 564ca709 2004-04-19 devnull remote++;
90 564ca709 2004-04-19 devnull kernel++;
96 564ca709 2004-04-19 devnull fmtinstall('x', xfmt);
97 564ca709 2004-04-19 devnull fmtinstall('Z', Zfmt);
98 564ca709 2004-04-19 devnull fmtinstall('L', locfmt);
99 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
100 564ca709 2004-04-19 devnull bout = &bioout;
102 e637c944 2004-04-20 devnull initexpr();
103 d2cbcb77 2004-04-20 devnull initprint();
104 564ca709 2004-04-19 devnull kinit();
105 564ca709 2004-04-19 devnull initialising = 1;
106 564ca709 2004-04-19 devnull pushfile(0);
107 564ca709 2004-04-19 devnull loadvars();
108 564ca709 2004-04-19 devnull installbuiltin();
109 4f2ac1b7 2005-01-23 devnull acidregs = mallocz(sizeof *acidregs, 1);
110 4f2ac1b7 2005-01-23 devnull acidregs->rw = acidregsrw;
112 564ca709 2004-04-19 devnull if(mtype && machbyname(mtype) == 0)
113 564ca709 2004-04-19 devnull print("unknown machine %s", mtype);
115 564ca709 2004-04-19 devnull if (attachfiles(argc, argv) < 0)
116 564ca709 2004-04-19 devnull varreg(); /* use default register set on error */
117 564ca709 2004-04-19 devnull if(mach == nil)
118 564ca709 2004-04-19 devnull mach = machcpu;
120 564ca709 2004-04-19 devnull symhdr = nil; /* not supposed to use this anymore */
122 564ca709 2004-04-19 devnull l = mkvar("acid");
123 564ca709 2004-04-19 devnull l->v->set = 1;
124 564ca709 2004-04-19 devnull l->v->type = TLIST;
125 564ca709 2004-04-19 devnull l->v->store.u.l = nil;
127 13e66070 2004-04-20 devnull loadmodule(unsharp("#9/acid/port"));
128 564ca709 2004-04-19 devnull for(i = 0; i < nlm; i++) {
129 564ca709 2004-04-19 devnull if(access(lm[i], AREAD) >= 0)
130 564ca709 2004-04-19 devnull loadmodule(lm[i]);
132 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", lm[i]);
133 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
137 564ca709 2004-04-19 devnull userinit();
138 564ca709 2004-04-19 devnull varsym();
140 564ca709 2004-04-19 devnull l = look("acidmap");
141 564ca709 2004-04-19 devnull if(l && l->proc) {
142 b4a659b6 2004-04-19 devnull if(setjmp(err) == 0){
143 b4a659b6 2004-04-19 devnull n = an(ONAME, ZN, ZN);
144 b4a659b6 2004-04-19 devnull n->sym = l;
145 b4a659b6 2004-04-19 devnull n = an(OCALL, n, ZN);
146 b4a659b6 2004-04-19 devnull execute(n);
150 564ca709 2004-04-19 devnull interactive = 1;
151 564ca709 2004-04-19 devnull initialising = 0;
152 564ca709 2004-04-19 devnull line = 1;
154 564ca709 2004-04-19 devnull notify(catcher);
156 564ca709 2004-04-19 devnull for(;;) {
157 564ca709 2004-04-19 devnull if(setjmp(err)) {
158 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
159 564ca709 2004-04-19 devnull unwind();
161 564ca709 2004-04-19 devnull stacked = 0;
163 564ca709 2004-04-19 devnull Bprint(bout, "acid; ");
165 564ca709 2004-04-19 devnull if(yyparse() != 1)
167 564ca709 2004-04-19 devnull restartio();
169 564ca709 2004-04-19 devnull unwind();
172 564ca709 2004-04-19 devnull Bputc(bout, '\n');
173 564ca709 2004-04-19 devnull exits(0);
178 4f2ac1b7 2005-01-23 devnull setstring(char *var, char *s)
180 4f2ac1b7 2005-01-23 devnull Lsym *l;
181 4f2ac1b7 2005-01-23 devnull Value *v;
183 4f2ac1b7 2005-01-23 devnull l = mkvar(var);
184 4f2ac1b7 2005-01-23 devnull v = l->v;
185 4f2ac1b7 2005-01-23 devnull v->store.fmt = 's';
186 4f2ac1b7 2005-01-23 devnull v->set = 1;
187 4f2ac1b7 2005-01-23 devnull v->store.u.string = strnode(s ? s : "");
188 4f2ac1b7 2005-01-23 devnull v->type = TSTRING;
191 564ca709 2004-04-19 devnull static int
192 564ca709 2004-04-19 devnull attachfiles(int argc, char **argv)
195 f7b74c17 2004-12-28 devnull volatile int pid;
196 4f2ac1b7 2005-01-23 devnull char *s, *t;
197 564ca709 2004-04-19 devnull int i, omode;
198 564ca709 2004-04-19 devnull Fhdr *hdr;
199 564ca709 2004-04-19 devnull Lsym *l;
201 b4a659b6 2004-04-19 devnull pid = 0;
202 564ca709 2004-04-19 devnull interactive = 0;
203 564ca709 2004-04-19 devnull if(setjmp(err))
204 564ca709 2004-04-19 devnull return -1;
207 564ca709 2004-04-19 devnull * Unix and Plan 9 differ on what the right order of pid, text, and core is.
208 564ca709 2004-04-19 devnull * I never remember anyway. Let's just accept them in any order.
210 564ca709 2004-04-19 devnull omode = wtflag ? ORDWR : OREAD;
211 564ca709 2004-04-19 devnull for(i=0; i<argc; i++){
212 564ca709 2004-04-19 devnull if(isnumeric(argv[i])){
213 564ca709 2004-04-19 devnull if(pid){
214 564ca709 2004-04-19 devnull fprint(2, "already have pid %d; ignoring pid %d\n", pid, argv[i]);
215 564ca709 2004-04-19 devnull continue;
217 564ca709 2004-04-19 devnull if(corhdr){
218 564ca709 2004-04-19 devnull fprint(2, "already have core %s; ignoring pid %d\n", corfil, pid);
219 564ca709 2004-04-19 devnull continue;
221 564ca709 2004-04-19 devnull pid = atoi(argv[i]);
222 564ca709 2004-04-19 devnull continue;
224 564ca709 2004-04-19 devnull if((hdr = crackhdr(argv[i], omode)) == nil){
225 564ca709 2004-04-19 devnull fprint(2, "crackhdr %s: %r\n", argv[i]);
226 f9aa99c7 2004-06-09 devnull if(argc == 1 && (fd = open(argv[i], omode)) > 0){
227 f9aa99c7 2004-06-09 devnull fprint(2, "loading %s direct mapped\n", argv[i]);
228 f9aa99c7 2004-06-09 devnull symmap = dumbmap(fd);
229 f9aa99c7 2004-06-09 devnull cormap = dumbmap(fd);
230 f9aa99c7 2004-06-09 devnull symfil = argv[i];
231 f9aa99c7 2004-06-09 devnull corfil = argv[i];
232 f9aa99c7 2004-06-09 devnull goto Run;
234 564ca709 2004-04-19 devnull continue;
236 564ca709 2004-04-19 devnull fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
237 564ca709 2004-04-19 devnull if(hdr->ftype == FCORE){
238 564ca709 2004-04-19 devnull if(pid){
239 564ca709 2004-04-19 devnull fprint(2, "already have pid %d; ignoring core %s\n", pid, argv[i]);
240 564ca709 2004-04-19 devnull uncrackhdr(hdr);
241 564ca709 2004-04-19 devnull continue;
243 564ca709 2004-04-19 devnull if(corhdr){
244 564ca709 2004-04-19 devnull fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
245 564ca709 2004-04-19 devnull uncrackhdr(hdr);
246 564ca709 2004-04-19 devnull continue;
248 564ca709 2004-04-19 devnull corhdr = hdr;
249 564ca709 2004-04-19 devnull corfil = argv[i];
251 564ca709 2004-04-19 devnull if(symhdr){
252 564ca709 2004-04-19 devnull fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
253 564ca709 2004-04-19 devnull uncrackhdr(hdr);
254 564ca709 2004-04-19 devnull continue;
256 564ca709 2004-04-19 devnull symhdr = hdr;
257 564ca709 2004-04-19 devnull symfil = argv[i];
261 564ca709 2004-04-19 devnull if(symhdr==nil){
262 564ca709 2004-04-19 devnull symfil = "a.out";
263 564ca709 2004-04-19 devnull if(pid){
264 564ca709 2004-04-19 devnull if((s = proctextfile(pid)) != nil){
265 564ca709 2004-04-19 devnull fprint(2, "pid %d: text %s\n", pid, s);
266 564ca709 2004-04-19 devnull symfil = s;
269 4f2ac1b7 2005-01-23 devnull if(corhdr){
271 4f2ac1b7 2005-01-23 devnull * prog gives only the basename of the command,
272 4f2ac1b7 2005-01-23 devnull * so try the command line for a path.
274 4f2ac1b7 2005-01-23 devnull if((s = strdup(corhdr->cmdline)) != nil){
275 4f2ac1b7 2005-01-23 devnull t = strchr(s, ' ');
278 4f2ac1b7 2005-01-23 devnull if((t = searchpath(s)) != nil){
279 4f2ac1b7 2005-01-23 devnull fprint(2, "core: text %s\n", t);
280 4f2ac1b7 2005-01-23 devnull symfil = t;
282 4f2ac1b7 2005-01-23 devnull free(s);
286 c2a9c3bb 2004-04-19 devnull if((symhdr = crackhdr(symfil, omode)) == nil){
287 564ca709 2004-04-19 devnull fprint(2, "crackhdr %s: %r\n", symfil);
288 564ca709 2004-04-19 devnull symfil = nil;
290 4f2ac1b7 2005-01-23 devnull fprint(2, "%s: %s %s %s\n", symfil, symhdr->aname, symhdr->mname, symhdr->fname);
293 564ca709 2004-04-19 devnull if(symhdr)
294 8b549a62 2005-01-07 devnull symopen(symhdr);
296 564ca709 2004-04-19 devnull if(!mach)
297 564ca709 2004-04-19 devnull mach = machcpu;
300 564ca709 2004-04-19 devnull * Set up maps.
302 564ca709 2004-04-19 devnull symmap = allocmap();
303 564ca709 2004-04-19 devnull cormap = allocmap();
304 564ca709 2004-04-19 devnull if(symmap == nil || cormap == nil)
305 564ca709 2004-04-19 devnull sysfatal("allocating maps: %r");
307 564ca709 2004-04-19 devnull if(symhdr){
308 564ca709 2004-04-19 devnull if(mapfile(symhdr, 0, symmap, nil) < 0)
309 564ca709 2004-04-19 devnull fprint(2, "mapping %s: %r\n", symfil);
310 564ca709 2004-04-19 devnull mapfile(symhdr, 0, cormap, nil);
314 4f2ac1b7 2005-01-23 devnull setstring("objtype", mach->name);
315 4f2ac1b7 2005-01-23 devnull setstring("textfile", symfil);
316 4f2ac1b7 2005-01-23 devnull setstring("systype", symhdr ? symhdr->aname : "");
317 4f2ac1b7 2005-01-23 devnull setstring("corefile", corfil);
319 4f2ac1b7 2005-01-23 devnull l = mkvar("pids");
320 4f2ac1b7 2005-01-23 devnull l->v->set = 1;
321 4f2ac1b7 2005-01-23 devnull l->v->type = TLIST;
322 4f2ac1b7 2005-01-23 devnull l->v->store.u.l = nil;
325 564ca709 2004-04-19 devnull sproc(pid);
326 564ca709 2004-04-19 devnull if(corhdr)
327 564ca709 2004-04-19 devnull setcore(corhdr);
328 564ca709 2004-04-19 devnull varreg();
329 564ca709 2004-04-19 devnull return 0;
333 564ca709 2004-04-19 devnull setcore(Fhdr *hdr)
336 4f2ac1b7 2005-01-23 devnull Lsym *l;
337 4f2ac1b7 2005-01-23 devnull Value *v;
338 4f2ac1b7 2005-01-23 devnull List **tail, *tl;
340 564ca709 2004-04-19 devnull unmapproc(cormap);
341 564ca709 2004-04-19 devnull unmapfile(corhdr, cormap);
342 564ca709 2004-04-19 devnull free(correg);
343 564ca709 2004-04-19 devnull correg = nil;
345 564ca709 2004-04-19 devnull if(hdr == nil)
346 564ca709 2004-04-19 devnull error("no core");
347 564ca709 2004-04-19 devnull if(mapfile(hdr, 0, cormap, &correg) < 0)
348 564ca709 2004-04-19 devnull error("mapfile %s: %r", hdr->filename);
349 564ca709 2004-04-19 devnull corhdr = hdr;
350 564ca709 2004-04-19 devnull corfil = hdr->filename;
352 4f2ac1b7 2005-01-23 devnull l = mkvar("pid");
353 4f2ac1b7 2005-01-23 devnull v = l->v;
354 4f2ac1b7 2005-01-23 devnull v->store.fmt = 'D';
355 4f2ac1b7 2005-01-23 devnull v->set = 1;
356 4f2ac1b7 2005-01-23 devnull v->store.u.ival = hdr->pid;
358 4f2ac1b7 2005-01-23 devnull setstring("corefile", corfil);
359 4f2ac1b7 2005-01-23 devnull setstring("cmdline", hdr->cmdline);
361 4f2ac1b7 2005-01-23 devnull l = mkvar("pids");
362 4f2ac1b7 2005-01-23 devnull l->v->set = 1;
363 4f2ac1b7 2005-01-23 devnull l->v->type = TLIST;
364 4f2ac1b7 2005-01-23 devnull l->v->store.u.l = nil;
365 4f2ac1b7 2005-01-23 devnull tail = &l->v->store.u.l;
366 4f2ac1b7 2005-01-23 devnull for(i=0; i<hdr->nthread; i++){
367 4f2ac1b7 2005-01-23 devnull tl = al(TINT);
368 4f2ac1b7 2005-01-23 devnull tl->store.u.ival = hdr->thread[i].id;
369 4f2ac1b7 2005-01-23 devnull tl->store.fmt = 'X';
370 4f2ac1b7 2005-01-23 devnull *tail = tl;
371 4f2ac1b7 2005-01-23 devnull tail = &tl->next;
374 4f2ac1b7 2005-01-23 devnull if(hdr->nthread)
375 4f2ac1b7 2005-01-23 devnull sproc(hdr->thread[0].id);
379 564ca709 2004-04-19 devnull die(void)
381 564ca709 2004-04-19 devnull Lsym *s;
382 564ca709 2004-04-19 devnull List *f;
383 4f2ac1b7 2005-01-23 devnull int first;
385 564ca709 2004-04-19 devnull Bprint(bout, "\n");
387 4f2ac1b7 2005-01-23 devnull first = 1;
388 564ca709 2004-04-19 devnull s = look("proclist");
389 564ca709 2004-04-19 devnull if(s && s->v->type == TLIST) {
390 564ca709 2004-04-19 devnull for(f = s->v->store.u.l; f; f = f->next){
391 564ca709 2004-04-19 devnull detachproc((int)f->store.u.ival);
392 4f2ac1b7 2005-01-23 devnull Bprint(bout, "%s %d", first ? "/bin/kill -9" : "", (int)f->store.u.ival);
393 4f2ac1b7 2005-01-23 devnull first = 0;
396 4f2ac1b7 2005-01-23 devnull if(!first)
397 4f2ac1b7 2005-01-23 devnull Bprint(bout, "\n");
398 564ca709 2004-04-19 devnull exits(0);
402 564ca709 2004-04-19 devnull userinit(void)
404 564ca709 2004-04-19 devnull Lsym *l;
405 564ca709 2004-04-19 devnull Node *n;
406 564ca709 2004-04-19 devnull char buf[128], *p;
408 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", mach->name);
409 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
410 c8b6342d 2005-01-13 devnull p = getenv("HOME");
411 564ca709 2004-04-19 devnull if(p != 0) {
412 564ca709 2004-04-19 devnull sprint(buf, "%s/lib/acid", p);
413 564ca709 2004-04-19 devnull silent = 1;
414 564ca709 2004-04-19 devnull loadmodule(buf);
417 564ca709 2004-04-19 devnull interactive = 0;
418 564ca709 2004-04-19 devnull if(setjmp(err)) {
419 564ca709 2004-04-19 devnull unwind();
422 564ca709 2004-04-19 devnull l = look("acidinit");
423 564ca709 2004-04-19 devnull if(l && l->proc) {
424 564ca709 2004-04-19 devnull n = an(ONAME, ZN, ZN);
425 564ca709 2004-04-19 devnull n->sym = l;
426 564ca709 2004-04-19 devnull n = an(OCALL, n, ZN);
427 564ca709 2004-04-19 devnull execute(n);
432 564ca709 2004-04-19 devnull loadmodule(char *s)
434 564ca709 2004-04-19 devnull interactive = 0;
435 564ca709 2004-04-19 devnull if(setjmp(err)) {
436 564ca709 2004-04-19 devnull unwind();
439 564ca709 2004-04-19 devnull pushfile(s);
440 564ca709 2004-04-19 devnull silent = 0;
441 564ca709 2004-04-19 devnull yyparse();
442 564ca709 2004-04-19 devnull popio();
447 564ca709 2004-04-19 devnull an(int op, Node *l, Node *r)
449 564ca709 2004-04-19 devnull Node *n;
451 564ca709 2004-04-19 devnull n = gmalloc(sizeof(Node));
452 564ca709 2004-04-19 devnull memset(n, 0, sizeof(Node));
453 564ca709 2004-04-19 devnull n->gc.gclink = gcl;
454 564ca709 2004-04-19 devnull gcl = (Gc*)n;
455 564ca709 2004-04-19 devnull n->op = op;
456 564ca709 2004-04-19 devnull n->left = l;
457 564ca709 2004-04-19 devnull n->right = r;
458 564ca709 2004-04-19 devnull return n;
462 564ca709 2004-04-19 devnull al(int t)
464 564ca709 2004-04-19 devnull List *l;
466 564ca709 2004-04-19 devnull l = gmalloc(sizeof(List));
467 564ca709 2004-04-19 devnull memset(l, 0, sizeof(List));
468 564ca709 2004-04-19 devnull l->type = t;
469 564ca709 2004-04-19 devnull l->gc.gclink = gcl;
470 564ca709 2004-04-19 devnull gcl = (Gc*)l;
471 564ca709 2004-04-19 devnull return l;
475 564ca709 2004-04-19 devnull con(int v)
477 564ca709 2004-04-19 devnull Node *n;
479 564ca709 2004-04-19 devnull n = an(OCONST, ZN, ZN);
480 564ca709 2004-04-19 devnull n->store.u.ival = v;
481 564ca709 2004-04-19 devnull n->store.fmt = 'X';
482 564ca709 2004-04-19 devnull n->type = TINT;
483 564ca709 2004-04-19 devnull return n;
487 564ca709 2004-04-19 devnull fatal(char *fmt, ...)
489 564ca709 2004-04-19 devnull char buf[128];
490 564ca709 2004-04-19 devnull va_list arg;
492 564ca709 2004-04-19 devnull va_start(arg, fmt);
493 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
494 564ca709 2004-04-19 devnull va_end(arg);
495 564ca709 2004-04-19 devnull fprint(2, "%s: %Z (fatal problem) %s\n", argv0, buf);
496 564ca709 2004-04-19 devnull exits(buf);
500 564ca709 2004-04-19 devnull yyerror(char *fmt, ...)
502 564ca709 2004-04-19 devnull char buf[128];
503 564ca709 2004-04-19 devnull va_list arg;
505 564ca709 2004-04-19 devnull if(strcmp(fmt, "syntax error") == 0) {
506 564ca709 2004-04-19 devnull yyerror("syntax error, near symbol '%s'", symbol);
509 564ca709 2004-04-19 devnull va_start(arg, fmt);
510 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
511 564ca709 2004-04-19 devnull va_end(arg);
512 564ca709 2004-04-19 devnull print("%Z: %s\n", buf);
516 564ca709 2004-04-19 devnull marktree(Node *n)
519 564ca709 2004-04-19 devnull if(n == 0)
522 564ca709 2004-04-19 devnull marktree(n->left);
523 564ca709 2004-04-19 devnull marktree(n->right);
525 564ca709 2004-04-19 devnull n->gc.gcmark = 1;
526 564ca709 2004-04-19 devnull if(n->op != OCONST)
529 564ca709 2004-04-19 devnull switch(n->type) {
530 564ca709 2004-04-19 devnull case TSTRING:
531 564ca709 2004-04-19 devnull n->store.u.string->gc.gcmark = 1;
533 564ca709 2004-04-19 devnull case TLIST:
534 564ca709 2004-04-19 devnull marklist(n->store.u.l);
536 564ca709 2004-04-19 devnull case TCODE:
537 564ca709 2004-04-19 devnull marktree(n->store.u.cc);
543 564ca709 2004-04-19 devnull marklist(List *l)
545 564ca709 2004-04-19 devnull while(l) {
546 564ca709 2004-04-19 devnull l->gc.gcmark = 1;
547 564ca709 2004-04-19 devnull switch(l->type) {
548 564ca709 2004-04-19 devnull case TSTRING:
549 564ca709 2004-04-19 devnull l->store.u.string->gc.gcmark = 1;
551 564ca709 2004-04-19 devnull case TLIST:
552 564ca709 2004-04-19 devnull marklist(l->store.u.l);
554 564ca709 2004-04-19 devnull case TCODE:
555 564ca709 2004-04-19 devnull marktree(l->store.u.cc);
558 564ca709 2004-04-19 devnull l = l->next;
563 564ca709 2004-04-19 devnull gc(void)
566 564ca709 2004-04-19 devnull Lsym *f;
567 564ca709 2004-04-19 devnull Value *v;
568 564ca709 2004-04-19 devnull Gc *m, **p, *next;
570 564ca709 2004-04-19 devnull if(dogc < Mempergc)
572 564ca709 2004-04-19 devnull dogc = 0;
574 564ca709 2004-04-19 devnull /* Mark */
575 564ca709 2004-04-19 devnull for(m = gcl; m; m = m->gclink)
576 564ca709 2004-04-19 devnull m->gcmark = 0;
578 564ca709 2004-04-19 devnull /* Scan */
579 564ca709 2004-04-19 devnull for(i = 0; i < Hashsize; i++) {
580 564ca709 2004-04-19 devnull for(f = hash[i]; f; f = f->hash) {
581 564ca709 2004-04-19 devnull marktree(f->proc);
582 564ca709 2004-04-19 devnull if(f->lexval != Tid)
583 564ca709 2004-04-19 devnull continue;
584 564ca709 2004-04-19 devnull for(v = f->v; v; v = v->pop) {
585 564ca709 2004-04-19 devnull switch(v->type) {
586 564ca709 2004-04-19 devnull case TSTRING:
587 564ca709 2004-04-19 devnull v->store.u.string->gc.gcmark = 1;
589 564ca709 2004-04-19 devnull case TLIST:
590 564ca709 2004-04-19 devnull marklist(v->store.u.l);
592 564ca709 2004-04-19 devnull case TCODE:
593 564ca709 2004-04-19 devnull marktree(v->store.u.cc);
595 4f2ac1b7 2005-01-23 devnull case TCON:
596 4f2ac1b7 2005-01-23 devnull marktree(v->store.u.con);
603 564ca709 2004-04-19 devnull /* Free */
604 564ca709 2004-04-19 devnull p = &gcl;
605 564ca709 2004-04-19 devnull for(m = gcl; m; m = next) {
606 564ca709 2004-04-19 devnull next = m->gclink;
607 564ca709 2004-04-19 devnull if(m->gcmark == 0) {
608 564ca709 2004-04-19 devnull *p = next;
609 564ca709 2004-04-19 devnull free(m); /* Sleazy reliance on my malloc */
612 564ca709 2004-04-19 devnull p = &m->gclink;
617 564ca709 2004-04-19 devnull gmalloc(long l)
619 564ca709 2004-04-19 devnull void *p;
621 564ca709 2004-04-19 devnull dogc += l;
622 564ca709 2004-04-19 devnull p = malloc(l);
623 564ca709 2004-04-19 devnull if(p == 0)
624 564ca709 2004-04-19 devnull fatal("out of memory");
625 564ca709 2004-04-19 devnull return p;
629 564ca709 2004-04-19 devnull checkqid(int f1, int pid)
632 564ca709 2004-04-19 devnull Dir *d1, *d2;
633 564ca709 2004-04-19 devnull char buf[128];
635 564ca709 2004-04-19 devnull if(kernel)
638 564ca709 2004-04-19 devnull d1 = dirfstat(f1);
639 564ca709 2004-04-19 devnull if(d1 == nil){
640 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirfstat: %r\n");
644 564ca709 2004-04-19 devnull sprint(buf, "/proc/%d/text", pid);
645 564ca709 2004-04-19 devnull fd = open(buf, OREAD);
646 564ca709 2004-04-19 devnull if(fd < 0 || (d2 = dirfstat(fd)) == nil){
647 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirstat %s: %r\n", buf);
648 564ca709 2004-04-19 devnull free(d1);
649 564ca709 2004-04-19 devnull if(fd >= 0)
650 564ca709 2004-04-19 devnull close(fd);
654 564ca709 2004-04-19 devnull close(fd);
656 564ca709 2004-04-19 devnull if(d1->qid.path != d2->qid.path || d1->qid.vers != d2->qid.vers || d1->qid.type != d2->qid.type){
657 564ca709 2004-04-19 devnull print("path %llux %llux vers %lud %lud type %d %d\n",
658 564ca709 2004-04-19 devnull d1->qid.path, d2->qid.path, d1->qid.vers, d2->qid.vers, d1->qid.type, d2->qid.type);
659 564ca709 2004-04-19 devnull print("warning: image does not match text for pid %d\n", pid);
661 564ca709 2004-04-19 devnull free(d1);
662 564ca709 2004-04-19 devnull free(d2);
666 564ca709 2004-04-19 devnull catcher(void *junk, char *s)
668 564ca709 2004-04-19 devnull USED(junk);
670 564ca709 2004-04-19 devnull if(strstr(s, "interrupt")) {
671 564ca709 2004-04-19 devnull gotint = 1;
672 564ca709 2004-04-19 devnull noted(NCONT);
674 564ca709 2004-04-19 devnull if(strstr(s, "child"))
675 564ca709 2004-04-19 devnull noted(NCONT);
676 564ca709 2004-04-19 devnull fprint(2, "note: %s\n", s);
677 564ca709 2004-04-19 devnull noted(NDFLT);
681 564ca709 2004-04-19 devnull system(void)
683 564ca709 2004-04-19 devnull char *cpu, *p, *q;
684 564ca709 2004-04-19 devnull static char kernel[128];
686 564ca709 2004-04-19 devnull cpu = getenv("cputype");
687 564ca709 2004-04-19 devnull if(cpu == 0) {
688 564ca709 2004-04-19 devnull cpu = "mips";
689 564ca709 2004-04-19 devnull print("$cputype not set; assuming %s\n", cpu);
691 564ca709 2004-04-19 devnull p = getenv("terminal");
692 564ca709 2004-04-19 devnull if(p == 0 || (p=strchr(p, ' ')) == 0 || p[1] == ' ' || p[1] == 0) {
693 564ca709 2004-04-19 devnull p = "9power";
694 564ca709 2004-04-19 devnull print("missing or bad $terminal; assuming %s\n", p);
698 564ca709 2004-04-19 devnull q = strchr(p, ' ');
701 564ca709 2004-04-19 devnull sprint(kernel, "/%s/9%s", cpu, p);
703 564ca709 2004-04-19 devnull return kernel;
707 564ca709 2004-04-19 devnull isnumeric(char *s)
709 564ca709 2004-04-19 devnull while(*s) {
710 564ca709 2004-04-19 devnull if(*s < '0' || *s > '9')
711 564ca709 2004-04-19 devnull return 0;
714 564ca709 2004-04-19 devnull return 1;
718 564ca709 2004-04-19 devnull xfmt(Fmt *f)
720 564ca709 2004-04-19 devnull f->flags ^= FmtSharp;
721 564ca709 2004-04-19 devnull return __ifmt(f);