Blame


1 0a61c07d 2004-04-19 devnull include("/sys/src/libc/port/pool.acid");
2 0a61c07d 2004-04-19 devnull
3 0a61c07d 2004-04-19 devnull aggr Byte {
4 0a61c07d 2004-04-19 devnull 'b' 0 byte;
5 0a61c07d 2004-04-19 devnull };
6 0a61c07d 2004-04-19 devnull
7 0a61c07d 2004-04-19 devnull defn
8 0a61c07d 2004-04-19 devnull byteat(addr)
9 0a61c07d 2004-04-19 devnull {
10 0a61c07d 2004-04-19 devnull local x;
11 0a61c07d 2004-04-19 devnull complex Byte addr;
12 0a61c07d 2004-04-19 devnull x = addr.byte;
13 0a61c07d 2004-04-19 devnull return x\d;
14 0a61c07d 2004-04-19 devnull }
15 0a61c07d 2004-04-19 devnull
16 0a61c07d 2004-04-19 devnull defn
17 0a61c07d 2004-04-19 devnull B2T(addr) {
18 0a61c07d 2004-04-19 devnull complex Bhdr addr;
19 0a61c07d 2004-04-19 devnull addr = addr+addr.size-sizeofBtail;
20 0a61c07d 2004-04-19 devnull complex Btail addr;
21 0a61c07d 2004-04-19 devnull return addr;
22 0a61c07d 2004-04-19 devnull }
23 0a61c07d 2004-04-19 devnull
24 0a61c07d 2004-04-19 devnull defn
25 0a61c07d 2004-04-19 devnull B2D(addr) {
26 0a61c07d 2004-04-19 devnull local x;
27 0a61c07d 2004-04-19 devnull x = addr+sizeofBhdr;
28 0a61c07d 2004-04-19 devnull return x\X;
29 0a61c07d 2004-04-19 devnull }
30 0a61c07d 2004-04-19 devnull
31 0a61c07d 2004-04-19 devnull defn
32 0a61c07d 2004-04-19 devnull D2B(addr) {
33 0a61c07d 2004-04-19 devnull local x;
34 0a61c07d 2004-04-19 devnull x = addr-sizeofBhdr;
35 0a61c07d 2004-04-19 devnull complex Bhdr x;
36 0a61c07d 2004-04-19 devnull return x;
37 0a61c07d 2004-04-19 devnull }
38 0a61c07d 2004-04-19 devnull
39 0a61c07d 2004-04-19 devnull defn
40 0a61c07d 2004-04-19 devnull B2NB(addr) {
41 0a61c07d 2004-04-19 devnull complex Bhdr addr;
42 0a61c07d 2004-04-19 devnull addr = addr+addr.size;
43 0a61c07d 2004-04-19 devnull complex Bhdr addr;
44 0a61c07d 2004-04-19 devnull return addr;
45 0a61c07d 2004-04-19 devnull }
46 0a61c07d 2004-04-19 devnull
47 0a61c07d 2004-04-19 devnull defn
48 0a61c07d 2004-04-19 devnull A2TB(addr) {
49 0a61c07d 2004-04-19 devnull local b;
50 0a61c07d 2004-04-19 devnull complex Arena addr;
51 0a61c07d 2004-04-19 devnull b = addr+addr.asize-sizeofBhdr;
52 0a61c07d 2004-04-19 devnull complex Bhdr b;
53 0a61c07d 2004-04-19 devnull return b;
54 0a61c07d 2004-04-19 devnull }
55 0a61c07d 2004-04-19 devnull
56 0a61c07d 2004-04-19 devnull defn
57 0a61c07d 2004-04-19 devnull A2B(addr) {
58 0a61c07d 2004-04-19 devnull return B2NB(addr);
59 0a61c07d 2004-04-19 devnull }
60 0a61c07d 2004-04-19 devnull
61 0a61c07d 2004-04-19 devnull defn
62 0a61c07d 2004-04-19 devnull B2PT(addr) {
63 0a61c07d 2004-04-19 devnull complex Bhdr addr;
64 0a61c07d 2004-04-19 devnull addr = addr-sizeofBtail;
65 0a61c07d 2004-04-19 devnull complex Btail addr;
66 0a61c07d 2004-04-19 devnull return addr;
67 0a61c07d 2004-04-19 devnull }
68 0a61c07d 2004-04-19 devnull
69 0a61c07d 2004-04-19 devnull defn
70 0a61c07d 2004-04-19 devnull SHORT(addr) {
71 0a61c07d 2004-04-19 devnull local hi, lo;
72 0a61c07d 2004-04-19 devnull
73 0a61c07d 2004-04-19 devnull hi = byteat(addr);
74 0a61c07d 2004-04-19 devnull lo = byteat(addr+1);
75 0a61c07d 2004-04-19 devnull return lo+hi*256;
76 0a61c07d 2004-04-19 devnull }
77 0a61c07d 2004-04-19 devnull
78 0a61c07d 2004-04-19 devnull defn
79 0a61c07d 2004-04-19 devnull Btail(addr) {
80 0a61c07d 2004-04-19 devnull complex Btail addr;
81 0a61c07d 2004-04-19 devnull print(" magic0 ", addr.magic0, "\n");
82 0a61c07d 2004-04-19 devnull print(" datadiff ", SHORT(addr.datasize), "\n");
83 0a61c07d 2004-04-19 devnull print(" magic1 ", addr.magic1, "\n");
84 0a61c07d 2004-04-19 devnull print(" size ", addr.size\X, "\n");
85 0a61c07d 2004-04-19 devnull print(" hdr ", addr+sizeofBtail-addr.size\X, "\n");
86 0a61c07d 2004-04-19 devnull };
87 0a61c07d 2004-04-19 devnull
88 0a61c07d 2004-04-19 devnull defn
89 0a61c07d 2004-04-19 devnull Tail(addr)
90 0a61c07d 2004-04-19 devnull {
91 0a61c07d 2004-04-19 devnull print(" ", B2T(addr)\X, "\n");
92 0a61c07d 2004-04-19 devnull Btail(B2T(addr));
93 0a61c07d 2004-04-19 devnull }
94 0a61c07d 2004-04-19 devnull
95 0a61c07d 2004-04-19 devnull defn
96 0a61c07d 2004-04-19 devnull Magic(m)
97 0a61c07d 2004-04-19 devnull {
98 0a61c07d 2004-04-19 devnull if m == FREE_MAGIC then
99 0a61c07d 2004-04-19 devnull return "free";
100 0a61c07d 2004-04-19 devnull if m == ARENA_MAGIC then
101 0a61c07d 2004-04-19 devnull return "arena";
102 0a61c07d 2004-04-19 devnull if m == UNKEMPT_MAGIC then
103 0a61c07d 2004-04-19 devnull return "unkempt";
104 0a61c07d 2004-04-19 devnull if m == KEMPT_MAGIC then
105 0a61c07d 2004-04-19 devnull return "kempt";
106 0a61c07d 2004-04-19 devnull if m == ARENATAIL_MAGIC then
107 0a61c07d 2004-04-19 devnull return "arenatail";
108 0a61c07d 2004-04-19 devnull if m == DEAD_MAGIC then
109 0a61c07d 2004-04-19 devnull return "dead";
110 0a61c07d 2004-04-19 devnull return "unknown magic";
111 0a61c07d 2004-04-19 devnull }
112 0a61c07d 2004-04-19 devnull
113 0a61c07d 2004-04-19 devnull defn
114 0a61c07d 2004-04-19 devnull Block(addr)
115 0a61c07d 2004-04-19 devnull {
116 0a61c07d 2004-04-19 devnull complex Bhdr addr;
117 0a61c07d 2004-04-19 devnull print(" ", Magic(addr.magic), "\n");
118 0a61c07d 2004-04-19 devnull print(" data ", B2D(addr), "\n");
119 0a61c07d 2004-04-19 devnull print(" datasize ", getdsize(addr), "\n");
120 0a61c07d 2004-04-19 devnull Bhdr(addr);
121 0a61c07d 2004-04-19 devnull Tail(addr);
122 0a61c07d 2004-04-19 devnull }
123 0a61c07d 2004-04-19 devnull
124 0a61c07d 2004-04-19 devnull defn
125 0a61c07d 2004-04-19 devnull getdsize(addr)
126 0a61c07d 2004-04-19 devnull {
127 0a61c07d 2004-04-19 devnull complex Bhdr addr;
128 0a61c07d 2004-04-19 devnull local x;
129 0a61c07d 2004-04-19 devnull
130 0a61c07d 2004-04-19 devnull x = addr.size\d;
131 0a61c07d 2004-04-19 devnull x = x-SHORT(B2T(addr).datasize);
132 0a61c07d 2004-04-19 devnull return x\d;
133 0a61c07d 2004-04-19 devnull }
134 0a61c07d 2004-04-19 devnull
135 0a61c07d 2004-04-19 devnull defn
136 0a61c07d 2004-04-19 devnull datamagic(x)
137 0a61c07d 2004-04-19 devnull {
138 0a61c07d 2004-04-19 devnull x = x%4;
139 0a61c07d 2004-04-19 devnull if x == 0 then return 0xFE;
140 0a61c07d 2004-04-19 devnull if x == 1 then return 0xF1;
141 0a61c07d 2004-04-19 devnull if x == 2 then return 0xF0;
142 0a61c07d 2004-04-19 devnull if x == 3 then return 0xFA;
143 0a61c07d 2004-04-19 devnull }
144 0a61c07d 2004-04-19 devnull
145 0a61c07d 2004-04-19 devnull defn
146 0a61c07d 2004-04-19 devnull checkblock(addr)
147 0a61c07d 2004-04-19 devnull {
148 0a61c07d 2004-04-19 devnull local badmagic, datamagic, a, b, t, q, n, dsize, taddr, checked;
149 0a61c07d 2004-04-19 devnull complex Bhdr addr;
150 0a61c07d 2004-04-19 devnull taddr = B2T(addr);
151 0a61c07d 2004-04-19 devnull complex Btail taddr;
152 0a61c07d 2004-04-19 devnull
153 0a61c07d 2004-04-19 devnull if addr.magic == FREE_MAGIC || addr.magic == UNKEMPT_MAGIC then {
154 0a61c07d 2004-04-19 devnull if taddr.magic0 != TAIL_MAGIC0 || taddr.magic1 != TAIL_MAGIC1 then
155 0a61c07d 2004-04-19 devnull print(addr\X, " corrupt tail magic\n");
156 0a61c07d 2004-04-19 devnull if taddr.size != addr.size then
157 0a61c07d 2004-04-19 devnull print(addr\X, " corrupt tail header pointer\n");
158 0a61c07d 2004-04-19 devnull }
159 0a61c07d 2004-04-19 devnull
160 0a61c07d 2004-04-19 devnull if addr.magic == ARENA_MAGIC then {
161 0a61c07d 2004-04-19 devnull taddr = A2TB(addr);
162 0a61c07d 2004-04-19 devnull if taddr.magic != ARENATAIL_MAGIC then
163 0a61c07d 2004-04-19 devnull print(addr\X, " arena with bad tail block\n");
164 0a61c07d 2004-04-19 devnull else
165 0a61c07d 2004-04-19 devnull addr = taddr;
166 0a61c07d 2004-04-19 devnull }
167 0a61c07d 2004-04-19 devnull
168 0a61c07d 2004-04-19 devnull if addr.magic == ARENATAIL_MAGIC then {
169 0a61c07d 2004-04-19 devnull if addr.size != 0 then
170 0a61c07d 2004-04-19 devnull print(addr\X, " bad size in arena tail\n");
171 0a61c07d 2004-04-19 devnull }
172 0a61c07d 2004-04-19 devnull
173 0a61c07d 2004-04-19 devnull if addr.magic == KEMPT_MAGIC then {
174 0a61c07d 2004-04-19 devnull a = addr;
175 0a61c07d 2004-04-19 devnull complex Alloc a;
176 0a61c07d 2004-04-19 devnull if a.size > 1024*1024*1024 then
177 0a61c07d 2004-04-19 devnull print(addr\X, " block ridiculously large\n");
178 0a61c07d 2004-04-19 devnull t = B2T(addr);
179 0a61c07d 2004-04-19 devnull if t.magic0 != TAIL_MAGIC0 || t.magic1 != TAIL_MAGIC1 then
180 0a61c07d 2004-04-19 devnull print(addr\X, " bad tail magic\n");
181 0a61c07d 2004-04-19 devnull if t.size != addr.size then
182 0a61c07d 2004-04-19 devnull print(addr\X, " bad tail pointer\n");
183 0a61c07d 2004-04-19 devnull dsize = getdsize(a);
184 0a61c07d 2004-04-19 devnull if dsize > a.size then
185 0a61c07d 2004-04-19 devnull print(addr\X, " too much data in block\n");
186 0a61c07d 2004-04-19 devnull q = B2D(a)\X+dsize;
187 0a61c07d 2004-04-19 devnull n = 4;
188 0a61c07d 2004-04-19 devnull if q+4 > t then
189 0a61c07d 2004-04-19 devnull n = t-q;
190 0a61c07d 2004-04-19 devnull badmagic = 0;
191 0a61c07d 2004-04-19 devnull loop 0,n-1 do {
192 0a61c07d 2004-04-19 devnull if byteat(q) != datamagic(q) then {
193 0a61c07d 2004-04-19 devnull badmagic=1;
194 0a61c07d 2004-04-19 devnull }
195 0a61c07d 2004-04-19 devnull q = q+1;
196 0a61c07d 2004-04-19 devnull }
197 0a61c07d 2004-04-19 devnull if badmagic then
198 0a61c07d 2004-04-19 devnull print(addr\X, " size ", dsize, " user has overwritten boundary\n");
199 0a61c07d 2004-04-19 devnull }
200 0a61c07d 2004-04-19 devnull }
201 0a61c07d 2004-04-19 devnull
202 0a61c07d 2004-04-19 devnull defn
203 0a61c07d 2004-04-19 devnull checkarena(arena)
204 0a61c07d 2004-04-19 devnull {
205 0a61c07d 2004-04-19 devnull local atail, b;
206 0a61c07d 2004-04-19 devnull
207 0a61c07d 2004-04-19 devnull atail = A2TB(arena);
208 0a61c07d 2004-04-19 devnull complex Bhdr arena;
209 0a61c07d 2004-04-19 devnull b = arena;
210 0a61c07d 2004-04-19 devnull while b.magic != ARENATAIL_MAGIC && b < atail do {
211 0a61c07d 2004-04-19 devnull checkblock(b);
212 0a61c07d 2004-04-19 devnull if B2NB(b) == b then {
213 0a61c07d 2004-04-19 devnull print("B2NB(", b\X, ") = b\n");
214 0a61c07d 2004-04-19 devnull b = atail; // end loop
215 0a61c07d 2004-04-19 devnull }
216 0a61c07d 2004-04-19 devnull b = B2NB(b);
217 0a61c07d 2004-04-19 devnull }
218 0a61c07d 2004-04-19 devnull
219 0a61c07d 2004-04-19 devnull checkblock(b);
220 0a61c07d 2004-04-19 devnull if b != atail then
221 0a61c07d 2004-04-19 devnull print("found wrong tail to arena ", arena\X, "\n");
222 0a61c07d 2004-04-19 devnull }
223 0a61c07d 2004-04-19 devnull
224 0a61c07d 2004-04-19 devnull defn
225 0a61c07d 2004-04-19 devnull checkpool(p)
226 0a61c07d 2004-04-19 devnull {
227 0a61c07d 2004-04-19 devnull complex Pool p;
228 0a61c07d 2004-04-19 devnull local a;
229 0a61c07d 2004-04-19 devnull a = p.arenalist;
230 0a61c07d 2004-04-19 devnull
231 0a61c07d 2004-04-19 devnull while a != 0 do {
232 0a61c07d 2004-04-19 devnull complex Arena a;
233 0a61c07d 2004-04-19 devnull checkarena(a);
234 0a61c07d 2004-04-19 devnull a = a.down;
235 0a61c07d 2004-04-19 devnull }
236 0a61c07d 2004-04-19 devnull }
237 0a61c07d 2004-04-19 devnull
238 0a61c07d 2004-04-19 devnull defn
239 0a61c07d 2004-04-19 devnull gendumptree(f, in, s)
240 0a61c07d 2004-04-19 devnull {
241 0a61c07d 2004-04-19 devnull complex Free f;
242 0a61c07d 2004-04-19 devnull
243 0a61c07d 2004-04-19 devnull loop 1,in do {print(" ");}
244 0a61c07d 2004-04-19 devnull print(s, " size ", f.size\D, " left ", f.left\X, " right ", f.right\X, "\n");
245 0a61c07d 2004-04-19 devnull if f.left != 0 && f.left < 0x7FFFFFFF then
246 0a61c07d 2004-04-19 devnull gendumptree(f.left, in+1, "l");
247 0a61c07d 2004-04-19 devnull if f.right != 0 && f.right < 0x7FFFFFFF then
248 0a61c07d 2004-04-19 devnull gendumptree(f.right, in+1, "r");
249 0a61c07d 2004-04-19 devnull }
250 0a61c07d 2004-04-19 devnull
251 0a61c07d 2004-04-19 devnull defn
252 0a61c07d 2004-04-19 devnull dumptree(f)
253 0a61c07d 2004-04-19 devnull {
254 0a61c07d 2004-04-19 devnull gendumptree(f, 0, "*");
255 0a61c07d 2004-04-19 devnull }
256 0a61c07d 2004-04-19 devnull
257 0a61c07d 2004-04-19 devnull defn
258 0a61c07d 2004-04-19 devnull poolwhopointsat(p, addr)
259 0a61c07d 2004-04-19 devnull {
260 0a61c07d 2004-04-19 devnull complex Pool p;
261 0a61c07d 2004-04-19 devnull local a;
262 0a61c07d 2004-04-19 devnull
263 0a61c07d 2004-04-19 devnull a = p.arenalist;
264 0a61c07d 2004-04-19 devnull while a != 0 do {
265 0a61c07d 2004-04-19 devnull complex Arena a;
266 0a61c07d 2004-04-19 devnull arenawhopointsat(a, addr);
267 0a61c07d 2004-04-19 devnull a = a.down;
268 0a61c07d 2004-04-19 devnull }
269 0a61c07d 2004-04-19 devnull }
270 0a61c07d 2004-04-19 devnull
271 0a61c07d 2004-04-19 devnull defn
272 0a61c07d 2004-04-19 devnull arenawhopointsat(arena, addr)
273 0a61c07d 2004-04-19 devnull {
274 0a61c07d 2004-04-19 devnull local atail, b;
275 0a61c07d 2004-04-19 devnull
276 0a61c07d 2004-04-19 devnull atail = A2TB(arena);
277 0a61c07d 2004-04-19 devnull complex Bhdr arena;
278 0a61c07d 2004-04-19 devnull b = arena;
279 0a61c07d 2004-04-19 devnull while b < atail do {
280 0a61c07d 2004-04-19 devnull if *b == addr then
281 0a61c07d 2004-04-19 devnull print(b\X, "\n");
282 0a61c07d 2004-04-19 devnull b = b+4;
283 0a61c07d 2004-04-19 devnull }
284 0a61c07d 2004-04-19 devnull }
285 0a61c07d 2004-04-19 devnull
286 0a61c07d 2004-04-19 devnull defn
287 0a61c07d 2004-04-19 devnull whopointsat(addr)
288 0a61c07d 2004-04-19 devnull {
289 0a61c07d 2004-04-19 devnull poolwhopointsat(*mainmem, addr);
290 0a61c07d 2004-04-19 devnull }
291 0a61c07d 2004-04-19 devnull
292 0a61c07d 2004-04-19 devnull defn
293 0a61c07d 2004-04-19 devnull blockhdr(addr)
294 0a61c07d 2004-04-19 devnull {
295 0a61c07d 2004-04-19 devnull addr = addr & ~3;
296 0a61c07d 2004-04-19 devnull
297 0a61c07d 2004-04-19 devnull while *addr != FREE_MAGIC
298 0a61c07d 2004-04-19 devnull && *addr != ARENA_MAGIC
299 0a61c07d 2004-04-19 devnull && *addr != UNKEMPT_MAGIC
300 0a61c07d 2004-04-19 devnull && *addr != KEMPT_MAGIC
301 0a61c07d 2004-04-19 devnull && *addr != ARENATAIL_MAGIC
302 0a61c07d 2004-04-19 devnull do
303 0a61c07d 2004-04-19 devnull addr = addr-4;
304 0a61c07d 2004-04-19 devnull return addr;
305 0a61c07d 2004-04-19 devnull }
306 0a61c07d 2004-04-19 devnull