1 0a61c07d 2004-04-19 devnull include("/sys/lib/acid/syscall");
3 0a61c07d 2004-04-19 devnull // print various /proc files
4 0a61c07d 2004-04-19 devnull defn fd() {
5 0a61c07d 2004-04-19 devnull rc("cat /proc/"+itoa(pid)+"/fd");
8 0a61c07d 2004-04-19 devnull defn segment() {
9 0a61c07d 2004-04-19 devnull rc("cat /proc/"+itoa(pid)+"/segment");
12 0a61c07d 2004-04-19 devnull defn ns() {
13 0a61c07d 2004-04-19 devnull rc("cat /proc/"+itoa(pid)+"/ns");
16 0a61c07d 2004-04-19 devnull defn qid(qid) {
17 0a61c07d 2004-04-19 devnull complex Qid qid;
18 0a61c07d 2004-04-19 devnull return itoa(qid.path\X)+"."+itoa(qid.vers\X);
21 0a61c07d 2004-04-19 devnull defn cname(c) {
22 0a61c07d 2004-04-19 devnull complex Cname c;
23 0a61c07d 2004-04-19 devnull if c != 0 then {
24 0a61c07d 2004-04-19 devnull return *(c.s\s);
26 0a61c07d 2004-04-19 devnull return "<null>";
29 0a61c07d 2004-04-19 devnull // print Image cache contents
30 0a61c07d 2004-04-19 devnull // requires include("/sys/src/9/xxx/segment.acid")
31 0a61c07d 2004-04-19 devnull IHASHSIZE = 64;
32 0a61c07d 2004-04-19 devnull defn imagecacheline(h) {
33 0a61c07d 2004-04-19 devnull while h != 0 do {
34 0a61c07d 2004-04-19 devnull complex Image h;
35 0a61c07d 2004-04-19 devnull print (h\X, " ", qid(h.qid), " type ", h.type\D, " ref ", h.ref, " next ", h.next\X, " ", cname(h.c.name), "\n");
36 0a61c07d 2004-04-19 devnull h = h.hash;
40 0a61c07d 2004-04-19 devnull defn imagecache() {
43 0a61c07d 2004-04-19 devnull i=0; loop 1,IHASHSIZE do {
44 0a61c07d 2004-04-19 devnull imagecacheline(imagealloc.free[i]);
49 0a61c07d 2004-04-19 devnull // dump channels
50 0a61c07d 2004-04-19 devnull defn chan(c) {
51 0a61c07d 2004-04-19 devnull local d, q;
53 0a61c07d 2004-04-19 devnull c = (Chan)c;
54 0a61c07d 2004-04-19 devnull d=(Dev)(*(devtab+4*c.type));
56 0a61c07d 2004-04-19 devnull print(c\X, " ref=", c.ref\D, " #", d.dc\r, c.dev\D, " (", q.path, " ", q.vers\D, " ", q.type\X, ")");
57 0a61c07d 2004-04-19 devnull print(" fid=", c.fid\D, " iounit=", c.iounit\D);
58 0a61c07d 2004-04-19 devnull if c.ref != 0 then {
59 0a61c07d 2004-04-19 devnull print(" ", cname(c.name), " mchan=", c.mchan\X);
60 0a61c07d 2004-04-19 devnull if c.mchan != 0 then {
61 0a61c07d 2004-04-19 devnull print(" ", cname(c.mchan.name));
64 0a61c07d 2004-04-19 devnull print("\n");
67 0a61c07d 2004-04-19 devnull defn chans() {
70 0a61c07d 2004-04-19 devnull c = (Chan)chanalloc.list;
71 0a61c07d 2004-04-19 devnull while c != 0 do {
73 0a61c07d 2004-04-19 devnull c=(Chan)c.link;
77 0a61c07d 2004-04-19 devnull // manipulate processes
78 0a61c07d 2004-04-19 devnull defn proctab(x) {
79 0a61c07d 2004-04-19 devnull return procalloc.arena+sizeofProc*x;
82 0a61c07d 2004-04-19 devnull defn proc(p) {
83 0a61c07d 2004-04-19 devnull complex Proc p;
84 0a61c07d 2004-04-19 devnull local s, i;
86 0a61c07d 2004-04-19 devnull if p.state != 0 then { // 0 is Dead
87 0a61c07d 2004-04-19 devnull s = p.psstate;
88 0a61c07d 2004-04-19 devnull if s == 0 then {
89 0a61c07d 2004-04-19 devnull s = "kproc";
91 0a61c07d 2004-04-19 devnull s = *(s\s);
93 0a61c07d 2004-04-19 devnull 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");
97 0a61c07d 2004-04-19 devnull defn procenv(p) {
98 0a61c07d 2004-04-19 devnull complex Proc p;
99 0a61c07d 2004-04-19 devnull local e, v;
101 0a61c07d 2004-04-19 devnull e = p.egrp;
102 0a61c07d 2004-04-19 devnull complex Egrp e;
103 0a61c07d 2004-04-19 devnull v = e.entries;
104 0a61c07d 2004-04-19 devnull while v != 0 do {
105 0a61c07d 2004-04-19 devnull complex Evalue v;
106 0a61c07d 2004-04-19 devnull print(*(v.name\s), "=");
107 0a61c07d 2004-04-19 devnull printstringn(v.value, v.len);
108 0a61c07d 2004-04-19 devnull print("\n");
109 0a61c07d 2004-04-19 devnull v = v.link;
113 0a61c07d 2004-04-19 devnull KSTACK=4096;
115 0a61c07d 2004-04-19 devnull defn procstksize(p) {
116 0a61c07d 2004-04-19 devnull complex Proc p;
117 0a61c07d 2004-04-19 devnull local top, sp;
119 0a61c07d 2004-04-19 devnull if p.state != 0 then { // 0 is Dead
120 0a61c07d 2004-04-19 devnull top = p.kstack+KSTACK;
121 0a61c07d 2004-04-19 devnull sp = *p.sched;
122 0a61c07d 2004-04-19 devnull print(top-sp\D, "\n");
126 0a61c07d 2004-04-19 devnull defn procstk(p) {
127 0a61c07d 2004-04-19 devnull complex Proc p;
128 0a61c07d 2004-04-19 devnull local l;
130 0a61c07d 2004-04-19 devnull if p.state != 0 then { // 0 is Dead
131 0a61c07d 2004-04-19 devnull l = p.sched;
132 0a61c07d 2004-04-19 devnull if objtype=="386" then
133 0a61c07d 2004-04-19 devnull _stk(gotolabel, *l, linkreg(0), 0);
135 0a61c07d 2004-04-19 devnull _stk(*(l+4), *l, linkreg(0), 0);
139 0a61c07d 2004-04-19 devnull defn procs() {
140 0a61c07d 2004-04-19 devnull local i;
142 0a61c07d 2004-04-19 devnull i=0; loop 1,conf.nproc do {
143 0a61c07d 2004-04-19 devnull proc(proctab(i));
144 0a61c07d 2004-04-19 devnull i = i+1;
148 0a61c07d 2004-04-19 devnull defn stacks() {
149 0a61c07d 2004-04-19 devnull local i, p;
151 0a61c07d 2004-04-19 devnull i=0; loop 1,conf.nproc do {
152 0a61c07d 2004-04-19 devnull p = (Proc)proctab(i);
153 0a61c07d 2004-04-19 devnull if p.state != 0 then {
154 0a61c07d 2004-04-19 devnull print("=========================================================\n");
155 0a61c07d 2004-04-19 devnull proc(p);
156 0a61c07d 2004-04-19 devnull procstk(p);
158 0a61c07d 2004-04-19 devnull i = i+1;
162 0a61c07d 2004-04-19 devnull defn stacksizes() {
163 0a61c07d 2004-04-19 devnull local i;
165 0a61c07d 2004-04-19 devnull i=0; loop 1,conf.nproc do {
166 0a61c07d 2004-04-19 devnull procstksize(proctab(i));
167 0a61c07d 2004-04-19 devnull i = i+1;
171 0a61c07d 2004-04-19 devnull // segment-related
172 0a61c07d 2004-04-19 devnull defn procsegs(p) {
173 0a61c07d 2004-04-19 devnull complex Proc p;
174 0a61c07d 2004-04-19 devnull local i;
176 0a61c07d 2004-04-19 devnull i=0; loop 1,NSEG do {
177 0a61c07d 2004-04-19 devnull psegment(p.seg[i]);
178 0a61c07d 2004-04-19 devnull i = i+1;
182 0a61c07d 2004-04-19 devnull segtypes = { "text", "data", "bss", "stack", "shared", "physical", "shdata", "map" };
183 0a61c07d 2004-04-19 devnull defn psegment(s) {
184 0a61c07d 2004-04-19 devnull complex Segment s;
186 0a61c07d 2004-04-19 devnull if s != 0 then {
187 0a61c07d 2004-04-19 devnull print(s\X, " ", segtypes[s.type&SG_TYPE], " ", s.base\X, "-", s.top\X, " image ", s.image\X, "\n");
191 0a61c07d 2004-04-19 devnull // find physical address for an address in a given process
192 0a61c07d 2004-04-19 devnull defn procaddr(p, a) {
193 0a61c07d 2004-04-19 devnull complex Proc p;
194 0a61c07d 2004-04-19 devnull local i, s, r;
197 0a61c07d 2004-04-19 devnull i=0; loop 1,NSEG do {
198 0a61c07d 2004-04-19 devnull s = p.seg[i];
199 0a61c07d 2004-04-19 devnull if s != 0 then {
200 0a61c07d 2004-04-19 devnull complex Segment s;
201 0a61c07d 2004-04-19 devnull if s.base <= a && a < s.top then {
202 0a61c07d 2004-04-19 devnull r = segaddr(s, a);
205 0a61c07d 2004-04-19 devnull i = i+1;
207 0a61c07d 2004-04-19 devnull return r;
210 0a61c07d 2004-04-19 devnull // find an address in a given segment
211 0a61c07d 2004-04-19 devnull defn segaddr(s, a) {
212 0a61c07d 2004-04-19 devnull complex Segment s;
213 0a61c07d 2004-04-19 devnull local pte, pg;
215 0a61c07d 2004-04-19 devnull a = a - s.base;
216 0a61c07d 2004-04-19 devnull if s.map == 0 || s.mapsize < a/PTEMAPMEM then {
217 0a61c07d 2004-04-19 devnull return 0;
220 0a61c07d 2004-04-19 devnull pte = s.map[a/PTEMAPMEM];
221 0a61c07d 2004-04-19 devnull if pte == 0 then {
222 0a61c07d 2004-04-19 devnull return 0;
225 0a61c07d 2004-04-19 devnull complex Pte pte;
226 0a61c07d 2004-04-19 devnull pg = pte.pages[(a%PTEMAPMEM)/BY2PG];
227 0a61c07d 2004-04-19 devnull if pg == 0 then {
228 0a61c07d 2004-04-19 devnull return 0;
231 0a61c07d 2004-04-19 devnull if pg & 1 then { // swapped out, return disk address
232 0a61c07d 2004-04-19 devnull return pg&~1;
235 0a61c07d 2004-04-19 devnull complex Page pg;
236 0a61c07d 2004-04-19 devnull return (0x80000000|(pg.pa+(a%BY2PG)))\X;
239 0a61c07d 2004-04-19 devnull // PC only
240 0a61c07d 2004-04-19 devnull MACHADDR = 0x80004000;
241 0a61c07d 2004-04-19 devnull PTEMAPMEM = (1024*1024);
242 0a61c07d 2004-04-19 devnull BY2PG = 4096;
243 0a61c07d 2004-04-19 devnull PTEPERTAB = (PTEMAPMEM/BY2PG);
244 0a61c07d 2004-04-19 devnull defn up() {
245 0a61c07d 2004-04-19 devnull local mach;
247 0a61c07d 2004-04-19 devnull mach = MACHADDR;
248 0a61c07d 2004-04-19 devnull complex Mach mach;
249 0a61c07d 2004-04-19 devnull return mach.externup;
252 0a61c07d 2004-04-19 devnull defn intrcount() {
253 0a61c07d 2004-04-19 devnull local p, pp, t, i, j;
255 0a61c07d 2004-04-19 devnull p = intrtimes;
257 0a61c07d 2004-04-19 devnull loop 1,256 do {
258 0a61c07d 2004-04-19 devnull pp = p[i];
260 0a61c07d 2004-04-19 devnull if pp != 0 then {
263 0a61c07d 2004-04-19 devnull loop 1,1000 do {
264 0a61c07d 2004-04-19 devnull t = t+pp[j];
267 0a61c07d 2004-04-19 devnull print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n");
272 0a61c07d 2004-04-19 devnull print(acidfile);
274 0a61c07d 2004-04-19 devnull defn needacid(s){
275 0a61c07d 2004-04-19 devnull print("\trc(\"cd /sys/src/9/", kdir, "; mk ", s, ".acid\")\n");
276 0a61c07d 2004-04-19 devnull print("\tinclude(\"/sys/src/9/", kdir, "/", s, ".acid\")\n");
279 0a61c07d 2004-04-19 devnull if (map()[2]) != {} then { // map has more than two elements -> active proc
280 0a61c07d 2004-04-19 devnull kdir = "unknown";
282 0a61c07d 2004-04-19 devnull if objtype == "386" then {
283 0a61c07d 2004-04-19 devnull map({"*data", 0x80000000, 0xffffffff, 0x80000000});
284 0a61c07d 2004-04-19 devnull kdir="pc";
286 0a61c07d 2004-04-19 devnull if (objtype == "mips" || objtype == "mips2") then {
287 0a61c07d 2004-04-19 devnull kdir = "ch";
289 0a61c07d 2004-04-19 devnull if objtype == "alpha" then {
290 0a61c07d 2004-04-19 devnull map({"*data", 0x80000000, 0xffffffff, 0x80000000});
291 0a61c07d 2004-04-19 devnull kdir = "alpha";
293 0a61c07d 2004-04-19 devnull needacid("proc");