plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

kernel (4980B)


      1 include("/sys/lib/acid/syscall");
      2 
      3 // print various /proc files
      4 defn fd() {
      5 	rc("cat /proc/"+itoa(pid)+"/fd");
      6 }
      7 
      8 defn segment() {
      9 	rc("cat /proc/"+itoa(pid)+"/segment");
     10 }
     11 
     12 defn ns() {
     13 	rc("cat /proc/"+itoa(pid)+"/ns");
     14 }
     15 
     16 defn qid(qid) {
     17 	complex Qid qid;
     18 	return itoa(qid.path\X)+"."+itoa(qid.vers\X);
     19 }
     20 
     21 defn cname(c) {
     22 	complex Cname c;
     23 	if c != 0 then {
     24 		return *(c.s\s);
     25 	} else
     26 		return "<null>";
     27 }
     28 
     29 // print Image cache contents
     30 // requires include("/sys/src/9/xxx/segment.acid")
     31 IHASHSIZE = 64;
     32 defn imagecacheline(h) {
     33 	while h != 0 do {
     34 		complex Image h;
     35 		print (h\X, " ", qid(h.qid), " type ", h.type\D, " ref ", h.ref, " next ", h.next\X, " ", cname(h.c.name), "\n");
     36 		h = h.hash;
     37 	}
     38 }
     39 
     40 defn imagecache() {
     41 	local i;
     42 
     43 	i=0; loop 1,IHASHSIZE do {
     44 		imagecacheline(imagealloc.free[i]);
     45 		i = i+1;
     46 	}
     47 }
     48 
     49 // dump channels
     50 defn chan(c) {
     51 	local d, q;
     52 
     53 	c = (Chan)c;
     54 	d=(Dev)(*(devtab+4*c.type));
     55 	q=c.qid;
     56 	print(c\X, " ref=", c.ref\D, " #", d.dc\r, c.dev\D, " (", q.path, " ", q.vers\D, " ", q.type\X, ")");
     57 	print(" fid=", c.fid\D, " iounit=", c.iounit\D);
     58 	if c.ref != 0 then {
     59 		print(" ", cname(c.name), " mchan=", c.mchan\X);
     60 		if c.mchan != 0 then {
     61 			print(" ", cname(c.mchan.name));
     62 		}
     63 	}
     64 	print("\n");
     65 }
     66 
     67 defn chans() {
     68 	local c;
     69 
     70 	c = (Chan)chanalloc.list;
     71 	while c != 0 do {
     72 		chan(c);
     73 		c=(Chan)c.link;
     74 	}
     75 }
     76 
     77 // manipulate processes
     78 defn proctab(x) {
     79 	return procalloc.arena+sizeofProc*x;
     80 }
     81 
     82 defn proc(p) {
     83 	complex Proc p;
     84 	local s, i;
     85 
     86 	if p.state != 0 then {	// 0 is Dead
     87 		s = p.psstate;
     88 		if s == 0 then {
     89 			s = "kproc";
     90 		} else {
     91 			s = *(s\s);
     92 		}
     93 		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");
     94 	}
     95 }
     96 
     97 defn procenv(p) {
     98 	complex Proc p;
     99 	local e, v;
    100 
    101 	e = p.egrp;
    102 	complex Egrp e;
    103 	v = e.entries;
    104 	while v != 0 do {
    105 		complex Evalue v;
    106 		print(*(v.name\s), "=");
    107 		printstringn(v.value, v.len);
    108 		print("\n");
    109 		v = v.link;
    110 	}
    111 }
    112 
    113 KSTACK=4096;
    114 
    115 defn procstksize(p) {
    116 	complex Proc p;
    117 	local top, sp;
    118 
    119 	if p.state != 0 then {	// 0 is Dead
    120 		top = p.kstack+KSTACK;
    121 		sp = *p.sched;
    122 		print(top-sp\D, "\n");
    123 	}
    124 }
    125 
    126 defn procstk(p) {
    127 	complex Proc p;
    128 	local l;
    129 
    130 	if p.state != 0 then {	// 0 is Dead
    131 		l = p.sched;
    132 		if objtype=="386" then
    133 			_stk(gotolabel, *l, linkreg(0), 0);
    134 		else
    135 			_stk(*(l+4), *l, linkreg(0), 0);
    136 	}
    137 }
    138 
    139 defn procs() {
    140 	local i;
    141 
    142 	i=0; loop 1,conf.nproc do {
    143 		proc(proctab(i));
    144 		i = i+1;
    145 	}
    146 }
    147 
    148 defn stacks() {
    149 	local i, p;
    150 
    151 	i=0; loop 1,conf.nproc do {
    152 		p = (Proc)proctab(i);
    153 		if p.state != 0 then {
    154 			print("=========================================================\n");
    155 			proc(p);
    156 			procstk(p);
    157 		}
    158 		i = i+1;
    159 	}
    160 }
    161 
    162 defn stacksizes() {
    163 	local i;
    164 
    165 	i=0; loop 1,conf.nproc do {
    166 		procstksize(proctab(i));
    167 		i = i+1;
    168 	}
    169 }
    170 
    171 // segment-related
    172 defn procsegs(p) {
    173 	complex Proc p;
    174 	local i;
    175 
    176 	i=0; loop 1,NSEG do {
    177 		psegment(p.seg[i]);
    178 		i = i+1;
    179 	}
    180 }
    181 
    182 segtypes = { "text", "data", "bss", "stack", "shared", "physical", "shdata", "map" };
    183 defn psegment(s) {
    184 	complex Segment s;
    185 
    186 	if s != 0 then {
    187 		print(s\X, " ", segtypes[s.type&SG_TYPE], " ", s.base\X, "-", s.top\X, " image ", s.image\X, "\n");
    188 	}
    189 }
    190 
    191 // find physical address for an address in a given process
    192 defn procaddr(p, a) {
    193 	complex Proc p;
    194 	local i, s, r;
    195 
    196 	r = 0;
    197 	i=0; loop 1,NSEG do {
    198 		s = p.seg[i];
    199 		if s != 0 then {
    200 			complex Segment s;
    201 			if s.base <= a && a < s.top then {
    202 				r = segaddr(s, a);
    203 			}
    204 		}
    205 		i = i+1;
    206 	}
    207 	return r;
    208 }
    209 
    210 // find an address in a given segment
    211 defn segaddr(s, a) {
    212 	complex Segment s;
    213 	local pte, pg;
    214 
    215 	a = a - s.base;
    216 	if s.map == 0 || s.mapsize < a/PTEMAPMEM then {
    217 		return 0;
    218 	}
    219 
    220 	pte = s.map[a/PTEMAPMEM];
    221 	if pte == 0 then {
    222 		return 0;
    223 	}
    224 
    225 	complex Pte pte;
    226 	pg = pte.pages[(a%PTEMAPMEM)/BY2PG];
    227 	if pg == 0 then {
    228 		return 0;
    229 	}
    230 
    231 	if pg & 1 then {	// swapped out, return disk address
    232 		return pg&~1;
    233 	}
    234 
    235 	complex Page pg;
    236 	return (0x80000000|(pg.pa+(a%BY2PG)))\X;
    237 }
    238 
    239 // PC only
    240 MACHADDR = 0x80004000;
    241 PTEMAPMEM = (1024*1024);
    242 BY2PG = 4096;
    243 PTEPERTAB = (PTEMAPMEM/BY2PG);
    244 defn up() {
    245 	local mach;
    246 
    247 	mach = MACHADDR;
    248 	complex Mach mach;
    249 	return mach.externup;
    250 }
    251 
    252 defn intrcount() {
    253 	local p, pp, t, i, j;
    254 
    255 	p = intrtimes;
    256 	i=0;
    257 	loop 1,256 do {
    258 		pp = p[i];
    259 		i=i+1;
    260 		if pp != 0 then {
    261 			j=0;
    262 			t=0;
    263 			loop 1,1000 do {
    264 				t = t+pp[j];
    265 				j=j+1;
    266 			}
    267 			print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n");
    268 		}
    269 	}
    270 }
    271 
    272 print(acidfile);
    273 
    274 defn needacid(s){
    275 	print("\trc(\"cd /sys/src/9/", kdir, "; mk ", s, ".acid\")\n");
    276 	print("\tinclude(\"/sys/src/9/", kdir, "/", s, ".acid\")\n");
    277 }
    278 
    279 if (map()[2]) != {} then {	// map has more than two elements -> active proc
    280 	kdir = "unknown";
    281 
    282 	if objtype == "386" then {
    283 		map({"*data", 0x80000000, 0xffffffff, 0x80000000});
    284 		kdir="pc";
    285 	}
    286 	if (objtype == "mips" || objtype == "mips2") then {
    287 		kdir = "ch";
    288 	}
    289 	if objtype == "alpha" then {
    290 		map({"*data", 0x80000000, 0xffffffff, 0x80000000});
    291 		kdir = "alpha";
    292 	}
    293 	needacid("proc");
    294 }
    295