defn scanpool(pool, addr) { complex Pool pool; a = pool.arenalist; local b; while a != 0 && a < 0xff000000 do { complex Arena a; if (b = scanarena(a, addr)) != {} then return b; a = a.down; } } defn scanarena(arena, addr) { local atail, b, nb; atail = A2TB(arena); complex Bhdr arena; b = arena; while b < atail && b.magic != ARENATAIL_MAGIC do { if b.magic == ALLOC_MAGIC || b.magic == FREE_MAGIC then { if addr >= b && addr < b+b.size then return b; } nb = B2NB(b); if nb == b then { print("B2NB(", b\X, ") = b\n"); b = atail; // end loop } if nb > atail then { b = (Bhdr)(b+4); print("lost at block ", (b-4)\X, ", scanning forward\n"); while b < atail && b.magic != ALLOC_MAGIC && b.magic != FREE_MAGIC do b = (Bhdr)(b+4); print("stopped at ", b\X, " ", *b\X, "\n"); }else b = nb; } if b != atail then print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n"); } defn scanrange(r0, r1, v) { local x; x = {}; while r0 < r1 do { if *r0 == v then append x, r0; r0 = r0 + 4; } return x; } defn scanrangeforblock(r0, r1, b) { complex Bhdr b; local x; x = {}; while r0 < r1 do { if *r0 >= b && *r0 < b+b.size then append x, r0; r0 = r0 + 4; } return x; } defn Bhdr(b) { complex Bhdr b; local s; if b.magic == ALLOC_MAGIC then s = "block"; else s = "free"; print(s, " ", b\X, " ", b.size\X, " "); print(*(b+8)\X, " ", *(b+12)\X, " ", *(b+8)\a, " ", *(b+12)\a); } defn whichblock(addr) { print(scanpool(*mainmem, addr), "\n"); }