1 0a61c07d 2004-04-19 devnull include("/sys/src/libc/port/pool.acid");
3 0a61c07d 2004-04-19 devnull aggr Byte {
4 0a61c07d 2004-04-19 devnull 'b' 0 byte;
8 0a61c07d 2004-04-19 devnull byteat(addr)
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;
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;
25 0a61c07d 2004-04-19 devnull B2D(addr) {
27 0a61c07d 2004-04-19 devnull x = addr+sizeofBhdr;
28 0a61c07d 2004-04-19 devnull return x\X;
32 0a61c07d 2004-04-19 devnull D2B(addr) {
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;
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;
48 0a61c07d 2004-04-19 devnull A2TB(addr) {
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;
57 0a61c07d 2004-04-19 devnull A2B(addr) {
58 0a61c07d 2004-04-19 devnull return B2NB(addr);
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;
70 0a61c07d 2004-04-19 devnull SHORT(addr) {
71 0a61c07d 2004-04-19 devnull local hi, lo;
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;
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");
89 0a61c07d 2004-04-19 devnull Tail(addr)
91 0a61c07d 2004-04-19 devnull print(" ", B2T(addr)\X, "\n");
92 0a61c07d 2004-04-19 devnull Btail(B2T(addr));
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";
114 0a61c07d 2004-04-19 devnull Block(addr)
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);
125 0a61c07d 2004-04-19 devnull getdsize(addr)
127 0a61c07d 2004-04-19 devnull complex Bhdr addr;
128 0a61c07d 2004-04-19 devnull local x;
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;
136 0a61c07d 2004-04-19 devnull datamagic(x)
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;
146 0a61c07d 2004-04-19 devnull checkblock(addr)
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;
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");
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");
165 0a61c07d 2004-04-19 devnull addr = taddr;
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");
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;
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;
195 0a61c07d 2004-04-19 devnull q = q+1;
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");
203 0a61c07d 2004-04-19 devnull checkarena(arena)
205 0a61c07d 2004-04-19 devnull local atail, b;
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
216 0a61c07d 2004-04-19 devnull b = B2NB(b);
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");
225 0a61c07d 2004-04-19 devnull checkpool(p)
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;
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;
239 0a61c07d 2004-04-19 devnull gendumptree(f, in, s)
241 0a61c07d 2004-04-19 devnull complex Free f;
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");
252 0a61c07d 2004-04-19 devnull dumptree(f)
254 0a61c07d 2004-04-19 devnull gendumptree(f, 0, "*");
258 0a61c07d 2004-04-19 devnull poolwhopointsat(p, addr)
260 0a61c07d 2004-04-19 devnull complex Pool p;
261 0a61c07d 2004-04-19 devnull local a;
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;
272 0a61c07d 2004-04-19 devnull arenawhopointsat(arena, addr)
274 0a61c07d 2004-04-19 devnull local atail, b;
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;
287 0a61c07d 2004-04-19 devnull whopointsat(addr)
289 0a61c07d 2004-04-19 devnull poolwhopointsat(*mainmem, addr);
293 0a61c07d 2004-04-19 devnull blockhdr(addr)
295 0a61c07d 2004-04-19 devnull addr = addr & ~3;
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
303 0a61c07d 2004-04-19 devnull addr = addr-4;
304 0a61c07d 2004-04-19 devnull return addr;