@include ns = c32le; @define decodeid(id) { @local pid, tid; pid = id>>32; tid = (id<<32)>>32; return [pid,tid]; } @define test1(addr, pid) { @local ctl, mux, as, dom, libs, threads, tid, octl; mux = mkctlmux_remote(addr); foreach(@lambda(p){ @local pid; pid = p[0]; cmd = p[1]; printf("%5d %s\n", pid, cmd); }, mux.ps()); ctl = mux.attach(pid); octl = ctl; [pid,tid] = decodeid(ctl.id); printf("attached to [ %d, %d ]\n", pid, tid); ctl.trace(ctlmux`Eload, @lambda(ctl, path, base){ printf("%a -> load %s @%08x\n", decodeid(ctl.id), path, base); }); ctl.trace(ctlmux`Eunload, @lambda(ctl, path, base){ printf("%a -> unload %s @%08x\n", decodeid(ctl.id), path, base); }); ctl.trace(ctlmux`Eclone, @lambda(ctl, spwn){ printf("%a -> spawn %a\n", decodeid(ctl.id), decodeid(spwn.id)); }); ctl.trace(ctlmux`Eexit, @lambda(ctl){ @local p, t; [p,t] = decodeid(ctl.id); printf("%a -> exit\n", decodeid(ctl.id)); }); if(0)ctl.trace(ctlmux`Esignal, @lambda(ctl, sig){ @local p, t, r; [p,t] = decodeid(ctl.id); printf("%a -> exception %d\n", decodeid(ctl.id), sig); }); ctl.xtrap(0x00400000+2*4096, @lambda(ctl){ printf("trap!\n"); }); [libs, threads] = ctl.statwin(); printf("libs for %d:\n", pid); foreach(@lambda(l){ printf("\t%08x\t%s\n", l.base, l.path); }, libs); printf("threads for %d:\n", pid); if(1)foreach(@lambda(t){ printf("\t%a\n", decodeid(t.id)); if(t.id != ctl.id) t.xtrap(0x00400000+2*4096, @lambda(ctl){ printf("trap!\n"); }); printf("\t%a (trapped)\n", decodeid(t.id)); }, threads); ctl.xcont(); mux.run(); } if(length(args) != 3) error("usage: %s
", args[0]); test1(args[1], strton(args[2]));