Ejemplo n.º 1
0
int
sysdecode_utrace(FILE *fp, void *p, size_t len)
{
#ifdef __LP64__
	struct utrace_rtld ur;
	struct utrace_rtld32 *pr;
	struct utrace_malloc um;
	struct utrace_malloc32 *pm;
#endif
	static const char rtld_utrace_sig[RTLD_UTRACE_SIG_SZ] = RTLD_UTRACE_SIG;

	if (len == sizeof(struct utrace_rtld) && bcmp(p, rtld_utrace_sig,
	    sizeof(rtld_utrace_sig)) == 0)
		return (print_utrace_rtld(fp, p));

	if (len == sizeof(struct utrace_malloc)) {
		print_utrace_malloc(fp, p);
		return (1);
	}

#ifdef __LP64__
	if (len == sizeof(struct utrace_rtld32) && bcmp(p, rtld_utrace_sig,
	    sizeof(rtld_utrace_sig)) == 0) {
		pr = p;
		memset(&ur, 0, sizeof(ur));
		memcpy(ur.sig, pr->sig, sizeof(ur.sig));
		ur.event = pr->event;
		ur.handle = (void *)(uintptr_t)pr->handle;
		ur.mapbase = (void *)(uintptr_t)pr->mapbase;
		ur.mapsize = pr->mapsize;
		ur.refcnt = pr->refcnt;
		memcpy(ur.name, pr->name, sizeof(ur.name));
		return (print_utrace_rtld(fp, &ur));
	}

	if (len == sizeof(struct utrace_malloc32)) {
		pm = p;
		memset(&um, 0, sizeof(um));
		um.p = pm->p == (uint32_t)-1 ? (void *)(intptr_t)-1 :
		    (void *)(uintptr_t)pm->p;
		um.s = pm->s;
		um.r = (void *)(uintptr_t)pm->r;
		print_utrace_malloc(fp, &um);
		return (1);
	}
#endif

	return (0);
}
Ejemplo n.º 2
0
int
kdump_print_utrace(FILE *fp, void *p, size_t len, int decimal)
{

	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
		print_utrace_rtld(fp, p, len, decimal);
		return (1);
	}

	if (len == sizeof(struct utrace_malloc)) {
		print_utrace_malloc(fp, p);
		return (1);
	}
	
	return (0);
}