19a747e4fSDavid du Colombierinclude("/sys/lib/acid/syscall"); 27dd7cddfSDavid du Colombier 359cc4ca5SDavid du Colombier// print various /proc files 47dd7cddfSDavid du Colombierdefn fd() { 57dd7cddfSDavid du Colombier rc("cat /proc/"+itoa(pid)+"/fd"); 67dd7cddfSDavid du Colombier} 77dd7cddfSDavid du Colombier 87dd7cddfSDavid du Colombierdefn segment() { 97dd7cddfSDavid du Colombier rc("cat /proc/"+itoa(pid)+"/segment"); 107dd7cddfSDavid du Colombier} 117dd7cddfSDavid du Colombier 127dd7cddfSDavid du Colombierdefn ns() { 137dd7cddfSDavid du Colombier rc("cat /proc/"+itoa(pid)+"/ns"); 147dd7cddfSDavid du Colombier} 1559cc4ca5SDavid du Colombier 1659cc4ca5SDavid du Colombierdefn qid(qid) { 1759cc4ca5SDavid du Colombier complex Qid qid; 1859cc4ca5SDavid du Colombier return itoa(qid.path\X)+"."+itoa(qid.vers\X); 1959cc4ca5SDavid du Colombier} 2059cc4ca5SDavid du Colombier 21ef88ccc9SDavid du Colombierdefn path(p) { 22ef88ccc9SDavid du Colombier complex Path p; 23ef88ccc9SDavid du Colombier if p != 0 then { 24ef88ccc9SDavid du Colombier return *(p.s\s); 2559cc4ca5SDavid du Colombier } else 2659cc4ca5SDavid du Colombier return "<null>"; 2759cc4ca5SDavid du Colombier} 2859cc4ca5SDavid du Colombier 2959cc4ca5SDavid du Colombier// print Image cache contents 3059cc4ca5SDavid du Colombier// requires include("/sys/src/9/xxx/segment.acid") 3159cc4ca5SDavid du ColombierIHASHSIZE = 64; 3259cc4ca5SDavid du Colombierdefn imagecacheline(h) { 3359cc4ca5SDavid du Colombier while h != 0 do { 3459cc4ca5SDavid du Colombier complex Image h; 35*b94bb474SDavid du Colombier print (h\X, " ", qid(h.qid), " type ", h.type\D, " ref ", h.ref, " next ", h.next\X, " ", path(h.c.path), "\n"); 3659cc4ca5SDavid du Colombier h = h.hash; 3759cc4ca5SDavid du Colombier } 3859cc4ca5SDavid du Colombier} 3959cc4ca5SDavid du Colombier 4059cc4ca5SDavid du Colombierdefn imagecache() { 4159cc4ca5SDavid du Colombier local i; 4259cc4ca5SDavid du Colombier 4359cc4ca5SDavid du Colombier i=0; loop 1,IHASHSIZE do { 4459cc4ca5SDavid du Colombier imagecacheline(imagealloc.free[i]); 4559cc4ca5SDavid du Colombier i = i+1; 4659cc4ca5SDavid du Colombier } 4759cc4ca5SDavid du Colombier} 4859cc4ca5SDavid du Colombier 499a747e4fSDavid du Colombier// dump channels 509a747e4fSDavid du Colombierdefn chan(c) { 519a747e4fSDavid du Colombier local d, q; 529a747e4fSDavid du Colombier 539a747e4fSDavid du Colombier c = (Chan)c; 549a747e4fSDavid du Colombier d=(Dev)(*(devtab+4*c.type)); 559a747e4fSDavid du Colombier q=c.qid; 56ef88ccc9SDavid du Colombier print("chan(", c\X, "): ref=", c.ref\D, " #", d.dc\r, c.dev\D, " (", q.path, " ", q.vers\D, " ", q.type\X, ")"); 579a747e4fSDavid du Colombier print(" fid=", c.fid\D, " iounit=", c.iounit\D); 589a747e4fSDavid du Colombier if c.ref != 0 then { 59*b94bb474SDavid du Colombier print(" ", path(c.path), " mchan=", c.mchan\X); 609a747e4fSDavid du Colombier if c.mchan != 0 then { 61*b94bb474SDavid du Colombier print(" ", path(c.mchan.path)); 629a747e4fSDavid du Colombier } 639a747e4fSDavid du Colombier } 649a747e4fSDavid du Colombier print("\n"); 659a747e4fSDavid du Colombier} 669a747e4fSDavid du Colombier 679a747e4fSDavid du Colombierdefn chans() { 689a747e4fSDavid du Colombier local c; 699a747e4fSDavid du Colombier 709a747e4fSDavid du Colombier c = (Chan)chanalloc.list; 719a747e4fSDavid du Colombier while c != 0 do { 72ef88ccc9SDavid du Colombier if c.ref != 0 then 739a747e4fSDavid du Colombier chan(c); 749a747e4fSDavid du Colombier c=(Chan)c.link; 759a747e4fSDavid du Colombier } 769a747e4fSDavid du Colombier} 779a747e4fSDavid du Colombier 78ef88ccc9SDavid du Colombierdefn nchans() { 79ef88ccc9SDavid du Colombier local c, n; 80ef88ccc9SDavid du Colombier 81ef88ccc9SDavid du Colombier n = 0; 82ef88ccc9SDavid du Colombier c = (Chan)chanalloc.list; 83ef88ccc9SDavid du Colombier while c != 0 do { 84ef88ccc9SDavid du Colombier if c.ref != 0 then 85ef88ccc9SDavid du Colombier n++; 86ef88ccc9SDavid du Colombier c = (Chan)c.link; 87ef88ccc9SDavid du Colombier } 88ef88ccc9SDavid du Colombier return n; 89ef88ccc9SDavid du Colombier} 90ef88ccc9SDavid du Colombier 91ef88ccc9SDavid du Colombierdefn activechanlist() { 92ef88ccc9SDavid du Colombier local l, n; 93ef88ccc9SDavid du Colombier 94ef88ccc9SDavid du Colombier l = {}; 95ef88ccc9SDavid du Colombier c = (Chan)chanalloc.list; 96ef88ccc9SDavid du Colombier while c != 0 do { 97ef88ccc9SDavid du Colombier if c.ref != 0 then 98ef88ccc9SDavid du Colombier l = append l,c; 99ef88ccc9SDavid du Colombier c = (Chan)c.link; 100ef88ccc9SDavid du Colombier } 101ef88ccc9SDavid du Colombier return l; 102ef88ccc9SDavid du Colombier} 103ef88ccc9SDavid du Colombier 104ef88ccc9SDavid du Colombierdefn difflist(a, b) { 105ef88ccc9SDavid du Colombier local l, x; 106ef88ccc9SDavid du Colombier 107ef88ccc9SDavid du Colombier l = {}; 108ef88ccc9SDavid du Colombier while a != {} do { 109ef88ccc9SDavid du Colombier x = head a; 110ef88ccc9SDavid du Colombier if match(x, b) == -1 then 111ef88ccc9SDavid du Colombier l = append l, x; 112ef88ccc9SDavid du Colombier a = tail a; 113ef88ccc9SDavid du Colombier } 114ef88ccc9SDavid du Colombier return l; 115ef88ccc9SDavid du Colombier} 116ef88ccc9SDavid du Colombier 117ef88ccc9SDavid du Colombier_active_chan_list = {}; 118ef88ccc9SDavid du Colombierdefn newchans() { 119ef88ccc9SDavid du Colombier local l, new; 120ef88ccc9SDavid du Colombier 121ef88ccc9SDavid du Colombier l = activechanlist(); 122ef88ccc9SDavid du Colombier if _active_chan_list != {} then 123ef88ccc9SDavid du Colombier newerchans(_active_chan_list); 124ef88ccc9SDavid du Colombier _active_chan_list = l; 125ef88ccc9SDavid du Colombier} 126ef88ccc9SDavid du Colombier 127ef88ccc9SDavid du Colombierdefn newerchans(oldlist){ 128ef88ccc9SDavid du Colombier local new; 129ef88ccc9SDavid du Colombier 130ef88ccc9SDavid du Colombier new = difflist(activechanlist(), oldlist); 131ef88ccc9SDavid du Colombier while new != {} do { 132ef88ccc9SDavid du Colombier chan(head new); 133ef88ccc9SDavid du Colombier new = tail new; 134ef88ccc9SDavid du Colombier } 135ef88ccc9SDavid du Colombier} 136ef88ccc9SDavid du Colombier 137ef88ccc9SDavid du Colombier// look for channels that refer to themselves 138ef88ccc9SDavid du Colombierdefn badchans() { 139ef88ccc9SDavid du Colombier local bad, c, i, len, mtpt, p; 140ef88ccc9SDavid du Colombier 141ef88ccc9SDavid du Colombier c = (Chan)chanalloc.list; 142ef88ccc9SDavid du Colombier while c != 0 do { 143ef88ccc9SDavid du Colombier if c.ref != 0 then { 144ef88ccc9SDavid du Colombier bad = ""; 145ef88ccc9SDavid du Colombier p = (Path)c.path; 146ef88ccc9SDavid du Colombier if p != 0 then { 147ef88ccc9SDavid du Colombier path(p); 148ef88ccc9SDavid du Colombier mtpt = p.mtpt; 149ef88ccc9SDavid du Colombier len = p.mlen; 150ef88ccc9SDavid du Colombier i=0; loop 1,len do { 151ef88ccc9SDavid du Colombier if mtpt[i] == c then 152ef88ccc9SDavid du Colombier bad = bad+" mtpt self-ref"; 153ef88ccc9SDavid du Colombier i = i+1; 154ef88ccc9SDavid du Colombier } 155ef88ccc9SDavid du Colombier } 156ef88ccc9SDavid du Colombier if bad != "" then 157ef88ccc9SDavid du Colombier print("chan(", c\X, "):", bad, "\n"); 158ef88ccc9SDavid du Colombier } 159ef88ccc9SDavid du Colombier c = (Chan)c.link; 160ef88ccc9SDavid du Colombier } 161ef88ccc9SDavid du Colombier} 162ef88ccc9SDavid du Colombier 16359cc4ca5SDavid du Colombier// manipulate processes 16459cc4ca5SDavid du Colombierdefn proctab(x) { 16559cc4ca5SDavid du Colombier return procalloc.arena+sizeofProc*x; 16659cc4ca5SDavid du Colombier} 16759cc4ca5SDavid du Colombier 16859cc4ca5SDavid du Colombierdefn proc(p) { 16959cc4ca5SDavid du Colombier complex Proc p; 17059cc4ca5SDavid du Colombier local s, i; 17159cc4ca5SDavid du Colombier 172eb2d877eSDavid du Colombier if p.state != 0 && p.pid != 0 && p.text != 0 then { // 0 is Dead 17359cc4ca5SDavid du Colombier s = p.psstate; 17459cc4ca5SDavid du Colombier if s == 0 then { 17559cc4ca5SDavid du Colombier s = "kproc"; 17659cc4ca5SDavid du Colombier } else { 17759cc4ca5SDavid du Colombier s = *(s\s); 17859cc4ca5SDavid du Colombier } 17959cc4ca5SDavid du Colombier print(p\X, " ", p.pid, ": ", *(p.text\s), " ", *(p.user\s), " pc ", p.pc\X, " ", s, " (", *(statename[p.state]\s), ") ut ", p.time[0]\D, " st ", p.time[1]\D, " qpc ", p.qpc\X, "\n"); 18059cc4ca5SDavid du Colombier } 18159cc4ca5SDavid du Colombier} 18259cc4ca5SDavid du Colombier 1839a747e4fSDavid du Colombierdefn procenv(p) { 1849a747e4fSDavid du Colombier complex Proc p; 1859a747e4fSDavid du Colombier local e, v; 1869a747e4fSDavid du Colombier 1879a747e4fSDavid du Colombier e = p.egrp; 1889a747e4fSDavid du Colombier complex Egrp e; 189*b94bb474SDavid du Colombier v = e.ent; 1909a747e4fSDavid du Colombier while v != 0 do { 1919a747e4fSDavid du Colombier complex Evalue v; 1929a747e4fSDavid du Colombier print(*(v.name\s), "="); 1939a747e4fSDavid du Colombier printstringn(v.value, v.len); 1949a747e4fSDavid du Colombier print("\n"); 1959a747e4fSDavid du Colombier v = v.link; 1969a747e4fSDavid du Colombier } 1979a747e4fSDavid du Colombier} 1989a747e4fSDavid du Colombier 1999a747e4fSDavid du ColombierKSTACK=4096; 2009a747e4fSDavid du Colombier 2019a747e4fSDavid du Colombierdefn procstksize(p) { 2029a747e4fSDavid du Colombier complex Proc p; 2039a747e4fSDavid du Colombier local top, sp; 2049a747e4fSDavid du Colombier 2059a747e4fSDavid du Colombier if p.state != 0 then { // 0 is Dead 2069a747e4fSDavid du Colombier top = p.kstack+KSTACK; 2079a747e4fSDavid du Colombier sp = *p.sched; 2089a747e4fSDavid du Colombier print(top-sp\D, "\n"); 2099a747e4fSDavid du Colombier } 2109a747e4fSDavid du Colombier} 2119a747e4fSDavid du Colombier 2129a747e4fSDavid du Colombierdefn procstk(p) { 2139a747e4fSDavid du Colombier complex Proc p; 2149a747e4fSDavid du Colombier local l; 2159a747e4fSDavid du Colombier 2169a747e4fSDavid du Colombier if p.state != 0 then { // 0 is Dead 2179a747e4fSDavid du Colombier l = p.sched; 2189a747e4fSDavid du Colombier if objtype=="386" then 2199a747e4fSDavid du Colombier _stk(gotolabel, *l, linkreg(0), 0); 2209a747e4fSDavid du Colombier else 2219a747e4fSDavid du Colombier _stk(*(l+4), *l, linkreg(0), 0); 2229a747e4fSDavid du Colombier } 2239a747e4fSDavid du Colombier} 2249a747e4fSDavid du Colombier 22559cc4ca5SDavid du Colombierdefn procs() { 22659cc4ca5SDavid du Colombier local i; 22759cc4ca5SDavid du Colombier 22859cc4ca5SDavid du Colombier i=0; loop 1,conf.nproc do { 22959cc4ca5SDavid du Colombier proc(proctab(i)); 23059cc4ca5SDavid du Colombier i = i+1; 23159cc4ca5SDavid du Colombier } 23259cc4ca5SDavid du Colombier} 23359cc4ca5SDavid du Colombier 2349a747e4fSDavid du Colombierdefn stacks() { 2359a747e4fSDavid du Colombier local i, p; 2369a747e4fSDavid du Colombier 2379a747e4fSDavid du Colombier i=0; loop 1,conf.nproc do { 2389a747e4fSDavid du Colombier p = (Proc)proctab(i); 2399a747e4fSDavid du Colombier if p.state != 0 then { 2409a747e4fSDavid du Colombier print("=========================================================\n"); 2419a747e4fSDavid du Colombier proc(p); 2429a747e4fSDavid du Colombier procstk(p); 2439a747e4fSDavid du Colombier } 2449a747e4fSDavid du Colombier i = i+1; 2459a747e4fSDavid du Colombier } 2469a747e4fSDavid du Colombier} 2479a747e4fSDavid du Colombier 2489a747e4fSDavid du Colombierdefn stacksizes() { 2499a747e4fSDavid du Colombier local i; 2509a747e4fSDavid du Colombier 2519a747e4fSDavid du Colombier i=0; loop 1,conf.nproc do { 2529a747e4fSDavid du Colombier procstksize(proctab(i)); 2539a747e4fSDavid du Colombier i = i+1; 2549a747e4fSDavid du Colombier } 2559a747e4fSDavid du Colombier} 2569a747e4fSDavid du Colombier 25759cc4ca5SDavid du Colombier// segment-related 25859cc4ca5SDavid du Colombierdefn procsegs(p) { 25959cc4ca5SDavid du Colombier complex Proc p; 26059cc4ca5SDavid du Colombier local i; 26159cc4ca5SDavid du Colombier 26259cc4ca5SDavid du Colombier i=0; loop 1,NSEG do { 2639a747e4fSDavid du Colombier psegment(p.seg[i]); 26459cc4ca5SDavid du Colombier i = i+1; 26559cc4ca5SDavid du Colombier } 26659cc4ca5SDavid du Colombier} 26759cc4ca5SDavid du Colombier 26859cc4ca5SDavid du Colombiersegtypes = { "text", "data", "bss", "stack", "shared", "physical", "shdata", "map" }; 2699a747e4fSDavid du Colombierdefn psegment(s) { 27059cc4ca5SDavid du Colombier complex Segment s; 27159cc4ca5SDavid du Colombier 27259cc4ca5SDavid du Colombier if s != 0 then { 27359cc4ca5SDavid du Colombier print(s\X, " ", segtypes[s.type&SG_TYPE], " ", s.base\X, "-", s.top\X, " image ", s.image\X, "\n"); 27459cc4ca5SDavid du Colombier } 27559cc4ca5SDavid du Colombier} 27659cc4ca5SDavid du Colombier 27759cc4ca5SDavid du Colombier// find physical address for an address in a given process 27859cc4ca5SDavid du Colombierdefn procaddr(p, a) { 27959cc4ca5SDavid du Colombier complex Proc p; 28059cc4ca5SDavid du Colombier local i, s, r; 28159cc4ca5SDavid du Colombier 28259cc4ca5SDavid du Colombier r = 0; 28359cc4ca5SDavid du Colombier i=0; loop 1,NSEG do { 28459cc4ca5SDavid du Colombier s = p.seg[i]; 28559cc4ca5SDavid du Colombier if s != 0 then { 28659cc4ca5SDavid du Colombier complex Segment s; 28759cc4ca5SDavid du Colombier if s.base <= a && a < s.top then { 28859cc4ca5SDavid du Colombier r = segaddr(s, a); 28959cc4ca5SDavid du Colombier } 29059cc4ca5SDavid du Colombier } 29159cc4ca5SDavid du Colombier i = i+1; 29259cc4ca5SDavid du Colombier } 29359cc4ca5SDavid du Colombier return r; 29459cc4ca5SDavid du Colombier} 29559cc4ca5SDavid du Colombier 29659cc4ca5SDavid du Colombier// find an address in a given segment 29759cc4ca5SDavid du Colombierdefn segaddr(s, a) { 29859cc4ca5SDavid du Colombier complex Segment s; 29959cc4ca5SDavid du Colombier local pte, pg; 30059cc4ca5SDavid du Colombier 30159cc4ca5SDavid du Colombier a = a - s.base; 30259cc4ca5SDavid du Colombier if s.map == 0 || s.mapsize < a/PTEMAPMEM then { 30359cc4ca5SDavid du Colombier return 0; 30459cc4ca5SDavid du Colombier } 30559cc4ca5SDavid du Colombier 30659cc4ca5SDavid du Colombier pte = s.map[a/PTEMAPMEM]; 30759cc4ca5SDavid du Colombier if pte == 0 then { 30859cc4ca5SDavid du Colombier return 0; 30959cc4ca5SDavid du Colombier } 31059cc4ca5SDavid du Colombier 31159cc4ca5SDavid du Colombier complex Pte pte; 31259cc4ca5SDavid du Colombier pg = pte.pages[(a%PTEMAPMEM)/BY2PG]; 31359cc4ca5SDavid du Colombier if pg == 0 then { 31459cc4ca5SDavid du Colombier return 0; 31559cc4ca5SDavid du Colombier } 31659cc4ca5SDavid du Colombier 31759cc4ca5SDavid du Colombier if pg & 1 then { // swapped out, return disk address 31859cc4ca5SDavid du Colombier return pg&~1; 31959cc4ca5SDavid du Colombier } 32059cc4ca5SDavid du Colombier 32159cc4ca5SDavid du Colombier complex Page pg; 322e862f8a5SDavid du Colombier return (KZERO|(pg.pa+(a%BY2PG)))\X; 323e862f8a5SDavid du Colombier} 324e862f8a5SDavid du Colombier 325e862f8a5SDavid du Colombierdefn kzero() { 326e862f8a5SDavid du Colombier return main - (main & 0x0FFFFFFF); 32759cc4ca5SDavid du Colombier} 32859cc4ca5SDavid du Colombier 32959cc4ca5SDavid du Colombier// PC only 33059cc4ca5SDavid du ColombierPTEMAPMEM = (1024*1024); 33159cc4ca5SDavid du ColombierBY2PG = 4096; 33259cc4ca5SDavid du ColombierPTEPERTAB = (PTEMAPMEM/BY2PG); 33359cc4ca5SDavid du Colombierdefn up() { 33459cc4ca5SDavid du Colombier local mach; 33559cc4ca5SDavid du Colombier 336*b94bb474SDavid du Colombier MACHADDR = KZERO+0x15000; 33759cc4ca5SDavid du Colombier mach = MACHADDR; 33859cc4ca5SDavid du Colombier complex Mach mach; 33959cc4ca5SDavid du Colombier return mach.externup; 34059cc4ca5SDavid du Colombier} 34159cc4ca5SDavid du Colombier 34267031067SDavid du Colombierdefn intrcount() { 34367031067SDavid du Colombier local p, pp, t, i, j; 34467031067SDavid du Colombier 34567031067SDavid du Colombier p = intrtimes; 34667031067SDavid du Colombier i=0; 34767031067SDavid du Colombier loop 1,256 do { 34867031067SDavid du Colombier pp = p[i]; 34967031067SDavid du Colombier i=i+1; 35067031067SDavid du Colombier if pp != 0 then { 35167031067SDavid du Colombier j=0; 35267031067SDavid du Colombier t=0; 35367031067SDavid du Colombier loop 1,1000 do { 35467031067SDavid du Colombier t = t+pp[j]; 35567031067SDavid du Colombier j=j+1; 35667031067SDavid du Colombier } 35767031067SDavid du Colombier print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n"); 35867031067SDavid du Colombier } 35967031067SDavid du Colombier } 36067031067SDavid du Colombier} 36167031067SDavid du Colombier 3627dd7cddfSDavid du Colombierprint("/sys/lib/acid/kernel"); 3639a747e4fSDavid du Colombier 364b7b24591SDavid du Colombierdefn needacid(s){ 365b7b24591SDavid du Colombier print("\trc(\"cd /sys/src/9/", kdir, "; mk ", s, ".acid\")\n"); 366b7b24591SDavid du Colombier print("\tinclude(\"/sys/src/9/", kdir, "/", s, ".acid\")\n"); 3679a747e4fSDavid du Colombier} 3689a747e4fSDavid du Colombier 369e862f8a5SDavid du Colombierdefn kinit() { 370b7b24591SDavid du Colombierif (map()[2]) != {} then { // map has more than two elements -> active proc 371b7b24591SDavid du Colombier kdir = "unknown"; 372e862f8a5SDavid du Colombier KZERO = kzero(); 373b7b24591SDavid du Colombier 374b7b24591SDavid du Colombier if objtype == "386" then { 375e862f8a5SDavid du Colombier map({"*data", KZERO, 0xffffffff, KZERO}); 376b7b24591SDavid du Colombier kdir="pc"; 377b7b24591SDavid du Colombier } 3789a747e4fSDavid du Colombier if (objtype == "mips" || objtype == "mips2") then { 379b7b24591SDavid du Colombier kdir = "ch"; 3809a747e4fSDavid du Colombier } 3819a747e4fSDavid du Colombier if objtype == "alpha" then { 382e862f8a5SDavid du Colombier map({"*data", KZERO, 0xffffffff, KZERO}); 383b7b24591SDavid du Colombier kdir = "alpha"; 3849a747e4fSDavid du Colombier } 385b7b24591SDavid du Colombier needacid("proc"); 3869a747e4fSDavid du Colombier} 387e862f8a5SDavid du Colombier} 388