From owner-freebsd-bugs@FreeBSD.ORG Sat Dec 4 05:20:10 2010 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CB134106566C for ; Sat, 4 Dec 2010 05:20:10 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 8CC0E8FC0A for ; Sat, 4 Dec 2010 05:20:10 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id oB45KAFf010985 for ; Sat, 4 Dec 2010 05:20:10 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id oB45KAop010984; Sat, 4 Dec 2010 05:20:10 GMT (envelope-from gnats) Resent-Date: Sat, 4 Dec 2010 05:20:10 GMT Resent-Message-Id: <201012040520.oB45KAop010984@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Artem Belevich Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AF2C71065675 for ; Sat, 4 Dec 2010 05:12:53 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (unknown [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id 9D2B48FC23 for ; Sat, 4 Dec 2010 05:12:53 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.4/8.14.4) with ESMTP id oB45CrhZ088507 for ; Sat, 4 Dec 2010 05:12:53 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.4/8.14.4/Submit) id oB45Crae088506; Sat, 4 Dec 2010 05:12:53 GMT (envelope-from nobody) Message-Id: <201012040512.oB45Crae088506@red.freebsd.org> Date: Sat, 4 Dec 2010 05:12:53 GMT From: Artem Belevich To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: kern/152822: [patch] DTrace: syscall provider for compat/freebsd32 X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Dec 2010 05:20:10 -0000 >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 +#include +#include +#include +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 >Release-Note: >Audit-Trail: >Unformatted: