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