xref: /plan9/sys/lib/acid/kernel (revision b94bb474148e9d24a82a427863d9c9eb4c20f4ae)
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