>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: _______________________________________________ freebsd-bugs@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-bugs To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"