svn commit: r303991 - head/lib/libsysdecode

Konstantin Belousov kib at FreeBSD.org
Fri Aug 12 07:55:00 UTC 2016


Author: kib
Date: Fri Aug 12 07:54:59 2016
New Revision: 303991
URL: https://svnweb.freebsd.org/changeset/base/303991

Log:
  Decode 32bit utrace records on the 64bit host.
  
  Suppose that ktrace is performed on 32bit binary running on 64bit
  host.  In this case, the kernel records are 64bit, while utrace
  records from rtld and malloc are 32bit.  Make kdump useful to see
  decoded utrace data in that case.
  
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/lib/libsysdecode/utrace.c

Modified: head/lib/libsysdecode/utrace.c
==============================================================================
--- head/lib/libsysdecode/utrace.c	Fri Aug 12 07:52:13 2016	(r303990)
+++ head/lib/libsysdecode/utrace.c	Fri Aug 12 07:54:59 2016	(r303991)
@@ -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
 		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);
 }


More information about the svn-src-head mailing list