void mem_validate_block(void *p){ mheader_t *h; if (! p) return; /* Make the header pointer. */ h = H_OF( p ); assert((size_t)h == MEM_ALIGN(h)); mem_pool_t *m = h->pool; assert(uos_valid_memory_address(m)); assert( (size_t)h >= (size_t)m->store ); assert( ((size_t)h + h->size) <= ((size_t)m->store)+m->size ); assert(h->magic == MEMORY_BLOCK_MAGIC); //, "mem block $%x have bad magic\n", p); }
__WEAK void debug_dump_stack (const char *caption, void *sp, void *frame, void *callee) { unsigned char *from, *to, *p; unsigned int len; char c; bool_t flag; to = (unsigned char *)frame; from = (unsigned char *)sp; if (! uos_valid_memory_address (to) && uos_valid_memory_address (from)) to = from; if (uos_valid_memory_address (to) && ! uos_valid_memory_address (from)) from = to; to -= 16 * sizeof (void*); if ((from - to) > (int)(128 * sizeof (void *))) from = to + 128 * sizeof (void*); from = (unsigned char*) ((size_t) from & ~(sizeof (void *) - 1)); to = (unsigned char*) ((size_t) to & ~(sizeof (void *) - 1)); if (to > from) { p = to; to = from; from = p; } if ( (from - to) < (int)(64 * sizeof (void*)) ) from = to + 64 * sizeof (void*); debug_printf ("%S.stack {%p/%p..%p/%p, %p, %p}\n", caption, sp, from, frame, to, callee, __builtin_frame_address (0)); /* Stack always grows down. */ for (p = from-1, flag = 0, len = 0; ; ) { p--; if (len == 0) { if (sizeof (p) == 1) debug_printf ("[%8S.%02X]", caption, (size_t) p); else if (sizeof (p) == 2) debug_printf ("[%8S.%04X]", caption, (size_t) p); else if (sizeof (p) == 4) debug_printf ("[%8S.%08X]", caption, (size_t) p); else if (sizeof (p) == 8) debug_printf ("[%8S.%016X]", caption, (size_t) p); else debug_printf ("[%8S.%0p]", caption, (size_t) p); } c = ' '; if (p == frame) c = '='; if (p == sp) c = '>'; if (uos_valid_memory_address (p)) { if (callee && (flag & 1) == 0 && ((size_t) p & (sizeof(void*)-1)) == 0 && /* aligned */ *(void**)p == callee) { c = '*'; flag |= 1; } debug_printf ("%c%02X", c, *p); } else debug_printf ("%c__", c); if (p == to) flag |= 2; if (++len == 16) { debug_putc('\n'); if (flag & 2) break; len = 0; } } }
/* * Print stack backtrace. * Usage: * debug_dump_stack (task_current->name, arch_get_stack_pointer (), * __builtin_frame_address (1), * __builtin_return_address (0)); */ void debug_dump_stack (const char *caption, void *sp, void *frame, void *callee) { unsigned int *from, *to, *p, len; char c; bool_t callee_seen; from = sp; to = frame; if (! uos_valid_memory_address (to) && uos_valid_memory_address (from)) to = from; if (uos_valid_memory_address (to) && ! uos_valid_memory_address (from)) from = to; to -= 16; if ((from - to) > 128) from = to + 128; from = (unsigned*) ((size_t) from & ~(sizeof (void*) - 1)); to = (unsigned*) ((size_t) to & ~(sizeof (void*) - 1)); if (to > from) { p = to; to = from; from = p; } if (from - to < 64) from = to + 64; debug_printf ("%S.stack {%p/%p..%p/%p, %p, %p}\n", caption, sp, from, frame, to, callee, __builtin_frame_address (0)); /* Stack always grows down. */ p = from; callee_seen = 0; len = 0; for (;;) { p--; if (len == 0) debug_printf ("[%8S.%08x]", caption, (size_t) p); c = ' '; if (p == frame) c = '='; if (p == sp) c = '>'; if (uos_valid_memory_address (p)) { if (callee && ! callee_seen && *p == (unsigned) callee) { c = '*'; callee_seen = 1; } debug_printf (" %c%08x", c, *p); } else debug_printf (" %c________", c); if (++len == 4) { debug_putc('\n'); if (p <= to) break; len = 0; } } }