1 include("/sys/lib/acid/syscall");
3 // print various /proc files
5 rc("cat /proc/"+itoa(pid)+"/fd");
9 rc("cat /proc/"+itoa(pid)+"/segment");
13 rc("cat /proc/"+itoa(pid)+"/ns");
18 return itoa(qid.path\X)+"."+itoa(qid.vers\X);
29 // print Image cache contents
32 defn imagecacheline(h) {
38 d=(Dev)devtab[h.type];
43 print (h\A, " ref=", h.ref, " pgref=", h.pgref, "\t#", d.dc\r, h.dev\D, " (",
44 q.path, " ", q.vers\D, " ", q.type\X, ") ", p, "\n");
52 i=0; loop 1,IHASHSIZE do {
53 imagecacheline(imagealloc.hash[i]);
59 print ("padblockcnt=", *padblockcnt\D, "\n");
60 print ("concatblockcnt=", *concatblockcnt\D, "\n");
61 print ("pullupblockcnt=", *pullupblockcnt\D, "\n");
62 print ("copyblockcnt=", *copyblockcnt\D, "\n");
63 print ("consumecnt=", *consumecnt\D, "\n");
64 print ("producecnt=", *producecnt\D, "\n");
72 d= (Dev)devtab[c.type];
74 print("chan(", c\A, "): ref=", c.ref\D, " #", d.dc\r, c.dev\D, " (", q.path, " ", q.vers\D, " ", q.type\X, ")");
75 print(" fid=", c.fid\D, " iounit=", c.iounit\D);
77 print(" ", path(c.path), " mchan=", c.mchan\A);
78 if c.mchan != 0 then {
79 print(" ", path(c.mchan.path));
88 c = (Chan)chanalloc.list;
96 defn findchan(dev,type,path) {
99 c = (Chan)chanalloc.list;
102 if c.dev == dev && c.type == type && c.qid.path == path then
114 c = (Chan)chanalloc.list;
123 defn activechanlist() {
127 c = (Chan)chanalloc.list;
136 defn difflist(a, b) {
142 if match(x, b) == -1 then
149 _active_chan_list = {};
153 l = activechanlist();
154 if _active_chan_list != {} then
155 newerchans(_active_chan_list);
156 _active_chan_list = l;
159 defn newerchans(oldlist){
162 new = difflist(activechanlist(), oldlist);
169 // look for channels that refer to themselves
171 local bad, c, i, len, mtpt, p;
173 c = (Chan)chanalloc.list;
184 bad = bad+" mtpt self-ref";
189 print("chan(", c\A, "):", bad, "\n");
199 i=0; loop 1,NHASH do {
203 print(m\A, " dev ", m.dev\D, " type ", m.type, " qid (",
204 m.qid.path, " ", m.qid.vers\D, ")\n");
205 c = findchan(m.dev, m.type, m.qid.path);
216 // manipulate processes
218 return procalloc.arena+sizeofProc*x;
225 if p.state != 0 && p.pid != 0 && p.text != 0 then { // 0 is Dead
232 print(p\A, " ", p.pid, ": ", *(p.text\s), " ", *(p.user\s), " pc ", p.pc, " ", s, " (", *(statename[p.state]\s), ") ut ", p.time[0]\D, " st ", p.time[1]\D, " qpc ", p.qpc, "\n");
242 i=0; loop 1,e.nent do {
246 print(*(v.name\s), "=");
247 printstringn(v.value, v.len);
253 if objtype=="amd64" then {
256 if objtype=="arm64" then {
261 defn procstksize(p) {
265 if p.state != 0 then { // 0 is Dead
266 top = p.kstack+KSTACK;
268 print(top-sp\D, "\n");
276 if p.state != 0 then { // 0 is Dead
277 if p.mach == 0 then {
284 l = p.errlab + (n-1)*sizeofLabel;
287 if objtype=="386" || objtype=="amd64" then
288 _stk(gotolabel, l.sp, linkreg(0), 0);
290 _stk(l.pc, l.sp, linkreg(0), 0);
297 i=0; loop 1,conf.nproc do {
306 i=0; loop 1,conf.nproc do {
307 p = (Proc)proctab(i);
308 if p.state != 0 then {
309 print("=========================================================\n");
320 i=0; loop 1,conf.nproc do {
321 procstksize(proctab(i));
331 i=0; loop 1,NSEG do {
337 segtypes = { "text", "data", "bss", "stack", "shared", "physical", "shdata", "map" };
342 print(s\A, " ", segtypes[s.type&SG_TYPE], " ", s.base, "-", s.top, " image ", s.image, "\n");
346 // find physical address for an address in a given process
347 defn procaddr(p, a) {
352 i=0; loop 1,NSEG do {
356 if s.base <= a && a < s.top then {
365 // find an address in a given segment
371 if s.map == 0 || s.mapsize < a/PTEMAPMEM then {
375 pte = s.map[a/PTEMAPMEM];
381 pg = pte.pages[(a%PTEMAPMEM)/BY2PG];
386 if pg & 1 then { // swapped out, return disk address
391 return (KZERO|(pg.pa+(a%BY2PG)))\A;
395 return main - (main & 0x0FFFFFFF);
398 PTEMAPMEM = (1024*1024);
399 PTEPERTAB = (PTEMAPMEM/BY2PG);
401 if objtype == "386" then {
404 MACHADDR = KZERO+0x15000;
407 return mach.externup;
409 if objtype == "amd64" then {
416 if objtype == "arm64" then {
423 print("up() not implemented for", objtype, "\n");
438 print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n");
445 print("\trc(\"cd /sys/src/9/", kdir, "; mk ", s, ".acid\")\n");
446 print("\tinclude(\"/sys/src/9/", kdir, "/", s, ".acid\")\n");
450 if (map()[2]) != {} then { // map has more than two elements -> active proc
454 if objtype == "386" then {
455 map({"*data", KZERO, 0xffffffff, KZERO});
458 if objtype == "amd64" then {
459 map({"*data", KZERO, 0xffffffffffffffff, KZERO});
462 if (objtype == "mips" || objtype == "mips2") then {
465 if objtype == "arm" then {
468 if objtype == "arm64" then {