Exemple #1
0
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;
		}
	}
}