1 include("/sys/src/libc/port/pool.acid");
19 addr = addr+addr.size-sizeofBtail;
42 addr = addr+addr.size;
51 b = addr+addr.asize-sizeofBhdr;
64 addr = addr-sizeofBtail;
81 print(" magic0 ", addr.magic0, "\n");
82 print(" datadiff ", SHORT(addr.datasize), "\n");
83 print(" magic1 ", addr.magic1, "\n");
84 print(" size ", addr.size\X, "\n");
85 print(" hdr ", addr+sizeofBtail-addr.size\X, "\n");
91 print(" ", B2T(addr)\X, "\n");
98 if m == FREE_MAGIC then
100 if m == ARENA_MAGIC then
102 if m == UNKEMPT_MAGIC then
104 if m == KEMPT_MAGIC then
106 if m == ARENATAIL_MAGIC then
108 if m == DEAD_MAGIC then
110 return "unknown magic";
117 print(" ", Magic(addr.magic), "\n");
118 print(" data ", B2D(addr), "\n");
119 print(" datasize ", getdsize(addr), "\n");
131 x = x-SHORT(B2T(addr).datasize);
139 if x == 0 then return 0xFE;
140 if x == 1 then return 0xF1;
141 if x == 2 then return 0xF0;
142 if x == 3 then return 0xFA;
148 local badmagic, datamagic, a, b, t, q, n, dsize, taddr, checked;
153 if addr.magic == FREE_MAGIC || addr.magic == UNKEMPT_MAGIC then {
154 if taddr.magic0 != TAIL_MAGIC0 || taddr.magic1 != TAIL_MAGIC1 then
155 print(addr\X, " corrupt tail magic\n");
156 if taddr.size != addr.size then
157 print(addr\X, " corrupt tail header pointer\n");
160 if addr.magic == ARENA_MAGIC then {
162 if taddr.magic != ARENATAIL_MAGIC then
163 print(addr\X, " arena with bad tail block\n");
168 if addr.magic == ARENATAIL_MAGIC then {
169 if addr.size != 0 then
170 print(addr\X, " bad size in arena tail\n");
173 if addr.magic == KEMPT_MAGIC then {
176 if a.size > 1024*1024*1024 then
177 print(addr\X, " block ridiculously large\n");
179 if t.magic0 != TAIL_MAGIC0 || t.magic1 != TAIL_MAGIC1 then
180 print(addr\X, " bad tail magic\n");
181 if t.size != addr.size then
182 print(addr\X, " bad tail pointer\n");
184 if dsize > a.size then
185 print(addr\X, " too much data in block\n");
192 if byteat(q) != datamagic(q) then {
198 print(addr\X, " size ", dsize, " user has overwritten boundary\n");
210 while b.magic != ARENATAIL_MAGIC && b < atail do {
212 if B2NB(b) == b then {
213 print("B2NB(", b\X, ") = b\n");
214 b = atail; // end loop
221 print("found wrong tail to arena ", arena\X, "\n");
239 gendumptree(f, in, s)
243 loop 1,in do {print(" ");}
244 print(s, " size ", f.size\D, " left ", f.left\X, " right ", f.right\X, "\n");
245 if f.left != 0 && f.left < 0x7FFFFFFF then
246 gendumptree(f.left, in+1, "l");
247 if f.right != 0 && f.right < 0x7FFFFFFF then
248 gendumptree(f.right, in+1, "r");
254 gendumptree(f, 0, "*");
258 poolwhopointsat(p, addr)
266 arenawhopointsat(a, addr);
272 arenawhopointsat(arena, addr)
289 poolwhopointsat(*mainmem, addr);
297 while *addr != FREE_MAGIC
298 && *addr != ARENA_MAGIC
299 && *addr != UNKEMPT_MAGIC
300 && *addr != KEMPT_MAGIC
301 && *addr != ARENATAIL_MAGIC