kern/152822: [patch] DTrace: syscall provider for compat/freebsd32

Artem Belevich fbsdlist at src.cx
Sat Dec 4 05:20:10 UTC 2010


>Number:         152822
>Category:       kern
>Synopsis:       [patch] DTrace: syscall provider for compat/freebsd32
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 04 05:20:10 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Artem Belevich
>Release:        stable/8
>Organization:
>Environment:
>Description:
syscall provider on amd64 does not allow probing of compat/freebsd32 apps.
>How-To-Repeat:
## use amd64 box
## run some 32-bit apps
#sudo dtrace -n 'syscall:::entry { @num[execname] = count(); }';

None of 32-bit apps show up in the output.
>Fix:
Dtrace's syscall provider only probes syscalls delivered via sysent.
32-bit emulation uses freebsd32_sysent and thus is not served by regular syscall provider.

Patch attached with submission follows:

commit bc5cab1e413c97c1001c4dc545cfe544dac53fba
Author: Artem Belevich 
Date:   Fri Dec 3 13:31:45 2010 -0800

    Dtrace syscall provider for freebsd32 layer

diff --git a/sys/cddl/dev/systrace/systrace.c b/sys/cddl/dev/systrace/systrace.c
index 72c25e4..23ec11a 100644
--- a/sys/cddl/dev/systrace/systrace.c
+++ b/sys/cddl/dev/systrace/systrace.c
@@ -70,6 +70,21 @@ extern struct sysent linux_sysent[];
 #define	MAXSYSCALL	LINUX_SYS_MAXSYSCALL
 #define	SYSCALLNAMES	linux_syscallnames
 #define	SYSENT		linux_sysent
+#elif defined(FREEBSD32_SYSTRACE)
+/*
+ * The syscall arguments are processed into a DTrace argument array
+ * using a generated function. See sys/kern/makesyscalls.sh.
+ */
+#include <compat/freebsd32/freebsd32_proto.h>
+#include <compat/freebsd32/freebsd32_util.h>
+#include <compat/freebsd32/freebsd32_syscall.h>
+#include <compat/freebsd32/freebsd32_systrace_args.c>
+extern const char *freebsd32_syscallnames[];
+#define	DEVNAME		"dtrace/systrace32"
+#define	PROVNAME	"syscall32"
+#define	MAXSYSCALL	FREEBSD32_SYS_MAXSYSCALL
+#define	SYSCALLNAMES	freebsd32_syscallnames
+#define	SYSENT		freebsd32_sysent
 #else
 /*
  * The syscall arguments are processed into a DTrace argument array
@@ -332,6 +347,11 @@ MODULE_DEPEND(linsystrace, linux, 1, 1, 1);
 MODULE_DEPEND(linsystrace, systrace, 1, 1, 1);
 MODULE_DEPEND(linsystrace, dtrace, 1, 1, 1);
 MODULE_DEPEND(linsystrace, opensolaris, 1, 1, 1);
+#elif defined(FREEBSD32_SYSTRACE)
+DEV_MODULE(systrace32, systrace_modevent, NULL);
+MODULE_VERSION(systrace32, 1);
+MODULE_DEPEND(systrace32, dtrace, 1, 1, 1);
+MODULE_DEPEND(systrace32, opensolaris, 1, 1, 1);
 #else
 DEV_MODULE(systrace, systrace_modevent, NULL);
 MODULE_VERSION(systrace, 1);
diff --git a/sys/compat/freebsd32/Makefile b/sys/compat/freebsd32/Makefile
index d9131f2..34d3e81 100644
--- a/sys/compat/freebsd32/Makefile
+++ b/sys/compat/freebsd32/Makefile
@@ -5,15 +5,17 @@
 all:
 	@echo "make sysent only"
 
-sysent:  freebsd32_sysent.c freebsd32_syscall.h freebsd32_proto.h
+sysent:  freebsd32_sysent.c freebsd32_syscall.h freebsd32_proto.h freebsd32_systrace_args.c
 
-freebsd32_sysent.c freebsd32_syscalls.c freebsd32_syscall.h freebsd32_proto.h: \
+freebsd32_sysent.c freebsd32_syscalls.c freebsd32_syscall.h freebsd32_proto.h freebsd32_systrace_args.c : \
 	    ../../kern/makesyscalls.sh syscalls.master syscalls.conf
 	-mv -f freebsd32_sysent.c freebsd32_sysent.c.bak
 	-mv -f freebsd32_syscalls.c freebsd32_syscalls.c.bak
 	-mv -f freebsd32_syscall.h freebsd32_syscall.h.bak
 	-mv -f freebsd32_proto.h freebsd32_proto.h.bak
+	-mv -f freebsd32_systrace_args.c  freebsd32_systrace_args.c.bak
 	sh ../../kern/makesyscalls.sh syscalls.master syscalls.conf
 
 clean:
 	rm -f freebsd32_sysent.c freebsd32_syscalls.c freebsd32_syscall.h freebsd32_proto.h
+	rm -f freebsd32_systrace_args.c 
diff --git a/sys/compat/freebsd32/syscalls.conf b/sys/compat/freebsd32/syscalls.conf
index f163597..3715400 100644
--- a/sys/compat/freebsd32/syscalls.conf
+++ b/sys/compat/freebsd32/syscalls.conf
@@ -8,4 +8,4 @@ sysmk="/dev/null"
 syscallprefix="FREEBSD32_SYS_"
 switchname="freebsd32_sysent"
 namesname="freebsd32_syscallnames"
-systrace="/dev/null"
+systrace="freebsd32_systrace_args.c"
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index 41a89c6..6a0e938 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -190,6 +190,8 @@ s/\$//g
 		print > syscompat6
 		print > syscompat7
 		print > sysnames
+		print > systrace
+		print > systracetmp
 		savesyscall = syscall
 		next
 	}
@@ -202,6 +204,8 @@ s/\$//g
 		print > syscompat6
 		print > syscompat7
 		print > sysnames
+		print > systrace
+		print > systracetmp
 		syscall = savesyscall
 		next
 	}
@@ -214,6 +218,8 @@ s/\$//g
 		print > syscompat6
 		print > syscompat7
 		print > sysnames
+		print > systrace
+		print > systracetmp
 		next
 	}
 	syscall != $1 {
diff --git a/sys/modules/dtrace/systrace32/Makefile b/sys/modules/dtrace/systrace32/Makefile
new file mode 100644
index 0000000..7d66fa3
--- /dev/null
+++ b/sys/modules/dtrace/systrace32/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../../../cddl/dev/systrace
+
+KMOD=		systrace32
+SRCS=		systrace.c
+SRCS+=		vnode_if.h
+
+CFLAGS+=	-I${.CURDIR}/../../../cddl/compat/opensolaris \
+		-I${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common \
+		-I${.CURDIR}/../../.. -DFREEBSD32_SYSTRACE
+
+.include <bsd.kmod.mk>


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list