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); }
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); }