Blame


1 0a61c07d 2004-04-19 devnull include("/sys/lib/acid/syscall");
2 0a61c07d 2004-04-19 devnull
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");
6 0a61c07d 2004-04-19 devnull }
7 0a61c07d 2004-04-19 devnull
8 0a61c07d 2004-04-19 devnull defn segment() {
9 0a61c07d 2004-04-19 devnull rc("cat /proc/"+itoa(pid)+"/segment");
10 0a61c07d 2004-04-19 devnull }
11 0a61c07d 2004-04-19 devnull
12 0a61c07d 2004-04-19 devnull defn ns() {
13 0a61c07d 2004-04-19 devnull rc("cat /proc/"+itoa(pid)+"/ns");
14 0a61c07d 2004-04-19 devnull }
15 0a61c07d 2004-04-19 devnull
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);
19 0a61c07d 2004-04-19 devnull }
20 0a61c07d 2004-04-19 devnull
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);
25 0a61c07d 2004-04-19 devnull } else
26 0a61c07d 2004-04-19 devnull return "<null>";
27 0a61c07d 2004-04-19 devnull }
28 0a61c07d 2004-04-19 devnull
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;
37 0a61c07d 2004-04-19 devnull }
38 0a61c07d 2004-04-19 devnull }
39 0a61c07d 2004-04-19 devnull
40 0a61c07d 2004-04-19 devnull defn imagecache() {
41 0a61c07d 2004-04-19 devnull local i;
42 0a61c07d 2004-04-19 devnull
43 0a61c07d 2004-04-19 devnull i=0; loop 1,IHASHSIZE do {
44 0a61c07d 2004-04-19 devnull imagecacheline(imagealloc.free[i]);
45 0a61c07d 2004-04-19 devnull i = i+1;
46 0a61c07d 2004-04-19 devnull }
47 0a61c07d 2004-04-19 devnull }
48 0a61c07d 2004-04-19 devnull
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;
52 0a61c07d 2004-04-19 devnull
53 0a61c07d 2004-04-19 devnull c = (Chan)c;
54 0a61c07d 2004-04-19 devnull d=(Dev)(*(devtab+4*c.type));
55 0a61c07d 2004-04-19 devnull q=c.qid;
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));
62 0a61c07d 2004-04-19 devnull }
63 0a61c07d 2004-04-19 devnull }
64 0a61c07d 2004-04-19 devnull print("\n");
65 0a61c07d 2004-04-19 devnull }
66 0a61c07d 2004-04-19 devnull
67 0a61c07d 2004-04-19 devnull defn chans() {
68 0a61c07d 2004-04-19 devnull local c;
69 0a61c07d 2004-04-19 devnull
70 0a61c07d 2004-04-19 devnull c = (Chan)chanalloc.list;
71 0a61c07d 2004-04-19 devnull while c != 0 do {
72 0a61c07d 2004-04-19 devnull chan(c);
73 0a61c07d 2004-04-19 devnull c=(Chan)c.link;
74 0a61c07d 2004-04-19 devnull }
75 0a61c07d 2004-04-19 devnull }
76 0a61c07d 2004-04-19 devnull
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;
80 0a61c07d 2004-04-19 devnull }
81 0a61c07d 2004-04-19 devnull
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;
85 0a61c07d 2004-04-19 devnull
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";
90 0a61c07d 2004-04-19 devnull } else {
91 0a61c07d 2004-04-19 devnull s = *(s\s);
92 0a61c07d 2004-04-19 devnull }
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");
94 0a61c07d 2004-04-19 devnull }
95 0a61c07d 2004-04-19 devnull }
96 0a61c07d 2004-04-19 devnull
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;
100 0a61c07d 2004-04-19 devnull
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;
110 0a61c07d 2004-04-19 devnull }
111 0a61c07d 2004-04-19 devnull }
112 0a61c07d 2004-04-19 devnull
113 0a61c07d 2004-04-19 devnull KSTACK=4096;
114 0a61c07d 2004-04-19 devnull
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;
118 0a61c07d 2004-04-19 devnull
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");
123 0a61c07d 2004-04-19 devnull }
124 0a61c07d 2004-04-19 devnull }
125 0a61c07d 2004-04-19 devnull
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;
129 0a61c07d 2004-04-19 devnull
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);
134 0a61c07d 2004-04-19 devnull else
135 0a61c07d 2004-04-19 devnull _stk(*(l+4), *l, linkreg(0), 0);
136 0a61c07d 2004-04-19 devnull }
137 0a61c07d 2004-04-19 devnull }
138 0a61c07d 2004-04-19 devnull
139 0a61c07d 2004-04-19 devnull defn procs() {
140 0a61c07d 2004-04-19 devnull local i;
141 0a61c07d 2004-04-19 devnull
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;
145 0a61c07d 2004-04-19 devnull }
146 0a61c07d 2004-04-19 devnull }
147 0a61c07d 2004-04-19 devnull
148 0a61c07d 2004-04-19 devnull defn stacks() {
149 0a61c07d 2004-04-19 devnull local i, p;
150 0a61c07d 2004-04-19 devnull
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);
157 0a61c07d 2004-04-19 devnull }
158 0a61c07d 2004-04-19 devnull i = i+1;
159 0a61c07d 2004-04-19 devnull }
160 0a61c07d 2004-04-19 devnull }
161 0a61c07d 2004-04-19 devnull
162 0a61c07d 2004-04-19 devnull defn stacksizes() {
163 0a61c07d 2004-04-19 devnull local i;
164 0a61c07d 2004-04-19 devnull
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;
168 0a61c07d 2004-04-19 devnull }
169 0a61c07d 2004-04-19 devnull }
170 0a61c07d 2004-04-19 devnull
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;
175 0a61c07d 2004-04-19 devnull
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;
179 0a61c07d 2004-04-19 devnull }
180 0a61c07d 2004-04-19 devnull }
181 0a61c07d 2004-04-19 devnull
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;
185 0a61c07d 2004-04-19 devnull
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");
188 0a61c07d 2004-04-19 devnull }
189 0a61c07d 2004-04-19 devnull }
190 0a61c07d 2004-04-19 devnull
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;
195 0a61c07d 2004-04-19 devnull
196 0a61c07d 2004-04-19 devnull r = 0;
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);
203 0a61c07d 2004-04-19 devnull }
204 0a61c07d 2004-04-19 devnull }
205 0a61c07d 2004-04-19 devnull i = i+1;
206 0a61c07d 2004-04-19 devnull }
207 0a61c07d 2004-04-19 devnull return r;
208 0a61c07d 2004-04-19 devnull }
209 0a61c07d 2004-04-19 devnull
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;
214 0a61c07d 2004-04-19 devnull
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;
218 0a61c07d 2004-04-19 devnull }
219 0a61c07d 2004-04-19 devnull
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;
223 0a61c07d 2004-04-19 devnull }
224 0a61c07d 2004-04-19 devnull
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;
229 0a61c07d 2004-04-19 devnull }
230 0a61c07d 2004-04-19 devnull
231 0a61c07d 2004-04-19 devnull if pg & 1 then { // swapped out, return disk address
232 0a61c07d 2004-04-19 devnull return pg&~1;
233 0a61c07d 2004-04-19 devnull }
234 0a61c07d 2004-04-19 devnull
235 0a61c07d 2004-04-19 devnull complex Page pg;
236 0a61c07d 2004-04-19 devnull return (0x80000000|(pg.pa+(a%BY2PG)))\X;
237 0a61c07d 2004-04-19 devnull }
238 0a61c07d 2004-04-19 devnull
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;
246 0a61c07d 2004-04-19 devnull
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;
250 0a61c07d 2004-04-19 devnull }
251 0a61c07d 2004-04-19 devnull
252 0a61c07d 2004-04-19 devnull defn intrcount() {
253 0a61c07d 2004-04-19 devnull local p, pp, t, i, j;
254 0a61c07d 2004-04-19 devnull
255 0a61c07d 2004-04-19 devnull p = intrtimes;
256 0a61c07d 2004-04-19 devnull i=0;
257 0a61c07d 2004-04-19 devnull loop 1,256 do {
258 0a61c07d 2004-04-19 devnull pp = p[i];
259 0a61c07d 2004-04-19 devnull i=i+1;
260 0a61c07d 2004-04-19 devnull if pp != 0 then {
261 0a61c07d 2004-04-19 devnull j=0;
262 0a61c07d 2004-04-19 devnull t=0;
263 0a61c07d 2004-04-19 devnull loop 1,1000 do {
264 0a61c07d 2004-04-19 devnull t = t+pp[j];
265 0a61c07d 2004-04-19 devnull j=j+1;
266 0a61c07d 2004-04-19 devnull }
267 0a61c07d 2004-04-19 devnull print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n");
268 0a61c07d 2004-04-19 devnull }
269 0a61c07d 2004-04-19 devnull }
270 0a61c07d 2004-04-19 devnull }
271 0a61c07d 2004-04-19 devnull
272 0a61c07d 2004-04-19 devnull print(acidfile);
273 0a61c07d 2004-04-19 devnull
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");
277 0a61c07d 2004-04-19 devnull }
278 0a61c07d 2004-04-19 devnull
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";
281 0a61c07d 2004-04-19 devnull
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";
285 0a61c07d 2004-04-19 devnull }
286 0a61c07d 2004-04-19 devnull if (objtype == "mips" || objtype == "mips2") then {
287 0a61c07d 2004-04-19 devnull kdir = "ch";
288 0a61c07d 2004-04-19 devnull }
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";
292 0a61c07d 2004-04-19 devnull }
293 0a61c07d 2004-04-19 devnull needacid("proc");
294 0a61c07d 2004-04-19 devnull }
295 0a61c07d 2004-04-19 devnull