1219b2ee8SDavid du Colombier// support for acme; acid must be run with /acme/acid/$cputype/Acid 2219b2ee8SDavid du Colombier 37dd7cddfSDavid du Colombier 4219b2ee8SDavid du Colombierdefn w(*code) 5219b2ee8SDavid du Colombier{ 6219b2ee8SDavid du Colombier local dir; 7219b2ee8SDavid du Colombier 87dd7cddfSDavid du Colombier printto("/tmp/acme.acid", eval code); 97dd7cddfSDavid du Colombier rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'"); 10219b2ee8SDavid du Colombier} 11219b2ee8SDavid du Colombier 12219b2ee8SDavid du Colombierdefn procstk(pid, name) 13219b2ee8SDavid du Colombier{ 14219b2ee8SDavid du Colombier local dir; 15219b2ee8SDavid du Colombier 167dd7cddfSDavid du Colombier printto("/tmp/acme.acid", stk()); 17*59cc4ca5SDavid du Colombier rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'"); 18219b2ee8SDavid du Colombier} 19219b2ee8SDavid du Colombier 20219b2ee8SDavid du Colombierdefn taskstk(tid, name) 21219b2ee8SDavid du Colombier{ 22219b2ee8SDavid du Colombier local dir; 23219b2ee8SDavid du Colombier 24*59cc4ca5SDavid du Colombier printto("/tmp/acme.acid", threadstk(tid)); 257dd7cddfSDavid du Colombier rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'"); 26219b2ee8SDavid du Colombier} 27219b2ee8SDavid du Colombier 28219b2ee8SDavid du Colombierdefn _stk(pc, sp, link, dolocals) 29219b2ee8SDavid du Colombier{ 30219b2ee8SDavid du Colombier local stk; 31219b2ee8SDavid du Colombier 32219b2ee8SDavid du Colombier print("At pc:", pc, ":", fmt(pc, 'a'), " "); 33219b2ee8SDavid du Colombier pfl(pc); 34219b2ee8SDavid du Colombier 35219b2ee8SDavid du Colombier stk = strace(pc, sp, link); 36219b2ee8SDavid du Colombier 37219b2ee8SDavid du Colombier while stk do { 38219b2ee8SDavid du Colombier frame = head stk; 39219b2ee8SDavid du Colombier print(fmt(frame[0], 'a'), "("); 40219b2ee8SDavid du Colombier params(frame[2], frame[0]); 41219b2ee8SDavid du Colombier print(") "); 42219b2ee8SDavid du Colombier print("\n\tcalled from ", fmt(frame[1], 'a'), " "); 43219b2ee8SDavid du Colombier pfl(frame[1]); 44219b2ee8SDavid du Colombier stk = tail stk; 45219b2ee8SDavid du Colombier if dolocals then 46219b2ee8SDavid du Colombier locals(frame[3], frame[0]); 47219b2ee8SDavid du Colombier } 48219b2ee8SDavid du Colombier} 49219b2ee8SDavid du Colombier 50219b2ee8SDavid du Colombier//defn _stk(pc, sp, dolocals) 51219b2ee8SDavid du Colombier//{ 52219b2ee8SDavid du Colombier// w(__stk(pc, sp, dolocals)); 53219b2ee8SDavid du Colombier//} 54219b2ee8SDavid du Colombier 55219b2ee8SDavid du Colombier 56219b2ee8SDavid du Colombierdefn params(param, name) 57219b2ee8SDavid du Colombier{ 58219b2ee8SDavid du Colombier while param do { 59219b2ee8SDavid du Colombier sym = head param; 60219b2ee8SDavid du Colombier print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]); 61219b2ee8SDavid du Colombier param = tail param; 62219b2ee8SDavid du Colombier if param then 63219b2ee8SDavid du Colombier print (","); 64219b2ee8SDavid du Colombier } 65219b2ee8SDavid du Colombier} 66219b2ee8SDavid du Colombier 67219b2ee8SDavid du Colombierdefn locals(l, name) 68219b2ee8SDavid du Colombier{ 69219b2ee8SDavid du Colombier local sym; 70219b2ee8SDavid du Colombier 71219b2ee8SDavid du Colombier while l do { 72219b2ee8SDavid du Colombier sym = head l; 73219b2ee8SDavid du Colombier print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n"); 74219b2ee8SDavid du Colombier l = tail l; 75219b2ee8SDavid du Colombier } 76219b2ee8SDavid du Colombier} 77219b2ee8SDavid du Colombier 78219b2ee8SDavid du Colombierdefn bptab() // print a table of breakpoints 79219b2ee8SDavid du Colombier{ 80219b2ee8SDavid du Colombier local lst, addr; 81219b2ee8SDavid du Colombier 82219b2ee8SDavid du Colombier lst = bplist; 83219b2ee8SDavid du Colombier while lst do { 84219b2ee8SDavid du Colombier addr = head lst; 85219b2ee8SDavid du Colombier print("\tbpdel(", fmt(addr, 'a'), ")\n"); 86219b2ee8SDavid du Colombier lst = tail lst; 87219b2ee8SDavid du Colombier } 88219b2ee8SDavid du Colombier} 89219b2ee8SDavid du Colombier 90219b2ee8SDavid du Colombierdefn procs() // print status of processes 91219b2ee8SDavid du Colombier{ 92219b2ee8SDavid du Colombier local c, lst, cpid; 93219b2ee8SDavid du Colombier 94219b2ee8SDavid du Colombier cpid = pid; 95219b2ee8SDavid du Colombier lst = proclist; 96219b2ee8SDavid du Colombier while lst do { 97219b2ee8SDavid du Colombier np = head lst; 98219b2ee8SDavid du Colombier setproc(np); 99219b2ee8SDavid du Colombier if np == cpid then 100219b2ee8SDavid du Colombier print(">"); 101219b2ee8SDavid du Colombier print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n"); 102219b2ee8SDavid du Colombier lst = tail lst; 103219b2ee8SDavid du Colombier } 104219b2ee8SDavid du Colombier pid = cpid; 105219b2ee8SDavid du Colombier if pid != 0 then 106219b2ee8SDavid du Colombier setproc(pid); 107219b2ee8SDavid du Colombier} 108219b2ee8SDavid du Colombier 109*59cc4ca5SDavid du Colombierdefn allstacks() // print stacks of processes and threads 110*59cc4ca5SDavid du Colombier{ 111*59cc4ca5SDavid du Colombier complex Proc P; 112*59cc4ca5SDavid du Colombier local T, Tq; 113*59cc4ca5SDavid du Colombier local c, lst, cpid; 114*59cc4ca5SDavid du Colombier 115*59cc4ca5SDavid du Colombier cpid = pid; 116*59cc4ca5SDavid du Colombier P = (Proc)pq.$head; 117*59cc4ca5SDavid du Colombier while P != 0 do{ 118*59cc4ca5SDavid du Colombier Tq = (Tqueue)P.threads; 119*59cc4ca5SDavid du Colombier T = (Thread)Tq.$head; 120*59cc4ca5SDavid du Colombier setproc(P.pid); 121*59cc4ca5SDavid du Colombier while T != 0 do{ 122*59cc4ca5SDavid du Colombier if(T.cmdname == 0) then taskstk(T, "unknown"); 123*59cc4ca5SDavid du Colombier else taskstk(T, *(T.cmdname\s)); 124*59cc4ca5SDavid du Colombier T = T.nextt; 125*59cc4ca5SDavid du Colombier } 126*59cc4ca5SDavid du Colombier P = P.next; 127*59cc4ca5SDavid du Colombier } 128*59cc4ca5SDavid du Colombier pid = cpid; 129*59cc4ca5SDavid du Colombier if pid != 0 then 130*59cc4ca5SDavid du Colombier setproc(pid); 131*59cc4ca5SDavid du Colombier} 132*59cc4ca5SDavid du Colombier 133219b2ee8SDavid du Colombierprint("/sys/lib/acid/acme"); 134