summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-08-19 07:56:07 +0000
committerkib <kib@FreeBSD.org>2016-08-19 07:56:07 +0000
commit114511e92fb02568c64b3d93e882375b385b8ca3 (patch)
treede3d47ed84f86a6741d157e1260a2e72e9e84cf4 /lib
parentc15ff8645834501c0f317e54caa31fde69fd2bb4 (diff)
downloadFreeBSD-src-114511e92fb02568c64b3d93e882375b385b8ca3.zip
FreeBSD-src-114511e92fb02568c64b3d93e882375b385b8ca3.tar.gz
MFC r303991:
Decode 32bit utrace records on the 64bit host.
Diffstat (limited to 'lib')
-rw-r--r--lib/libsysdecode/utrace.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/lib/libsysdecode/utrace.c b/lib/libsysdecode/utrace.c
index 6a25139..28e52c3 100644
--- a/lib/libsysdecode/utrace.c
+++ b/lib/libsysdecode/utrace.c
@@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <dlfcn.h>
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
#include <sysdecode.h>
#define UTRACE_DLOPEN_START 1
@@ -59,6 +59,18 @@ struct utrace_rtld {
char name[MAXPATHLEN];
};
+#ifdef __LP64__
+struct utrace_rtld32 {
+ char sig[4]; /* 'RTLD' */
+ int event;
+ uint32_t handle;
+ uint32_t mapbase;
+ uint32_t mapsize;
+ int refcnt;
+ char name[MAXPATHLEN];
+};
+#endif
+
static int
print_utrace_rtld(FILE *fp, void *p)
{
@@ -145,6 +157,14 @@ struct utrace_malloc {
void *r;
};
+#ifdef __LP64__
+struct utrace_malloc32 {
+ uint32_t p;
+ uint32_t s;
+ uint32_t r;
+};
+#endif
+
static void
print_utrace_malloc(FILE *fp, void *p)
{
@@ -163,6 +183,12 @@ print_utrace_malloc(FILE *fp, void *p)
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
if (len == sizeof(struct utrace_rtld) && bcmp(p, "RTLD", 4) == 0) {
return (print_utrace_rtld(fp, p));
@@ -172,6 +198,32 @@ sysdecode_utrace(FILE *fp, void *p, size_t len)
print_utrace_malloc(fp, p);
return (1);
}
-
+
+#ifdef __LP64__
+ if (len == sizeof(struct utrace_rtld32) && bcmp(p, "RTLD", 4) == 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);
}
OpenPOWER on IntegriCloud