Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Mar 2011 09:09:25 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r219561 - in head/sys: cddl/dev/systrace modules/dtrace modules/dtrace/dtraceall modules/dtrace/systrace_freebsd32 modules/dtrace/systrace_linux32
Message-ID:  <201103120909.p2C99P2j010783@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Sat Mar 12 09:09:25 2011
New Revision: 219561
URL: http://svn.freebsd.org/changeset/base/219561

Log:
  add DTrace systrace support for linux32 and freebsd32 on amd64 syscalls
  
  Add systrace_linux32 and systrace_freebsd32 modules which provide
  support for tracing compat system calls in addition to native system
  call tracing provided by systrace module.
  
  Provided that all the systrace modules are loaded now you can select
  what syscalls to trace in the following manner:
  
  syscall::xxx:yyy - work on all system calls that match the specification
  syscall:freebsd:xxx:yyy - only native system calls
  syscall:linux32:xxx:yyy - linux32 compat system calls
  syscall:freebsd32:xxx:yyy - freebsd32 compat system calls on amd64
  
  PR:		kern/152822
  Submitted by:	Artem Belevich <fbsdlist@src.cx>
  Reviewed by:	jhb (earlier version)
  MFC after:	3 weeks

Added:
  head/sys/modules/dtrace/systrace_freebsd32/
  head/sys/modules/dtrace/systrace_freebsd32/Makefile   (contents, props changed)
  head/sys/modules/dtrace/systrace_linux32/
  head/sys/modules/dtrace/systrace_linux32/Makefile   (contents, props changed)
Modified:
  head/sys/cddl/dev/systrace/systrace.c
  head/sys/modules/dtrace/Makefile
  head/sys/modules/dtrace/dtraceall/Makefile
  head/sys/modules/dtrace/dtraceall/dtraceall.c

Modified: head/sys/cddl/dev/systrace/systrace.c
==============================================================================
--- head/sys/cddl/dev/systrace/systrace.c	Sat Mar 12 08:58:19 2011	(r219560)
+++ head/sys/cddl/dev/systrace/systrace.c	Sat Mar 12 09:09:25 2011	(r219561)
@@ -59,17 +59,38 @@
 #include <sys/dtrace.h>
 
 #ifdef LINUX_SYSTRACE
-#include <linux.h>
-#include <linux_syscall.h>
-#include <linux_proto.h>
-#include <linux_syscallnames.c>
-#include <linux_systrace.c>
+#if defined(__amd64__)
+#include <amd64/linux32/linux.h>
+#include <amd64/linux32/linux32_proto.h>
+#include <amd64/linux32/linux32_syscalls.c>
+#include <amd64/linux32/linux32_systrace_args.c>
+#elif defined(__i386__)
+#include <i386/linux/linux.h>
+#include <i386/linux/linux_proto.h>
+#include <i386/linux/linux_syscalls.c>
+#include <i386/linux/linux_systrace_args.c>
+#else
+#error Only i386 and amd64 are supported.
+#endif
 extern struct sysent linux_sysent[];
-#define	DEVNAME		"dtrace/linsystrace"
-#define	PROVNAME	"linsyscall"
+#define	MODNAME		"linux32"
 #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	MODNAME		"freebsd32"
+#define	MAXSYSCALL	FREEBSD32_SYS_MAXSYSCALL
+#define	SYSCALLNAMES	freebsd32_syscallnames
+#define	SYSENT		freebsd32_sysent
 #else
 /*
  * The syscall arguments are processed into a DTrace argument array
@@ -77,13 +98,15 @@ extern struct sysent linux_sysent[];
  */
 #include <sys/syscall.h>
 #include <kern/systrace_args.c>
-#define	DEVNAME		"dtrace/systrace"
-#define	PROVNAME	"syscall"
+#define	MODNAME		"freebsd"
 #define	MAXSYSCALL	SYS_MAXSYSCALL
 #define	SYSCALLNAMES	syscallnames
 #define	SYSENT		sysent
 #endif
 
+#define	PROVNAME	"syscall"
+#define	DEVNAME	        "dtrace/systrace/" MODNAME
+
 #define	SYSTRACE_ARTIFICIAL_FRAMES	1
 
 #define	SYSTRACE_SHIFT			16
@@ -214,14 +237,14 @@ systrace_provide(void *arg, dtrace_probe
 		return;
 
 	for (i = 0; i < MAXSYSCALL; i++) {
-		if (dtrace_probe_lookup(systrace_id, NULL,
+		if (dtrace_probe_lookup(systrace_id, MODNAME,
 		    uglyhack.pp_syscallnames[i], "entry") != 0)
 			continue;
 
-		(void) dtrace_probe_create(systrace_id, NULL, uglyhack.pp_syscallnames[i],
+		(void) dtrace_probe_create(systrace_id, MODNAME, uglyhack.pp_syscallnames[i],
 		    "entry", SYSTRACE_ARTIFICIAL_FRAMES,
 		    (void *)((uintptr_t)SYSTRACE_ENTRY(i)));
-		(void) dtrace_probe_create(systrace_id, NULL, uglyhack.pp_syscallnames[i],
+		(void) dtrace_probe_create(systrace_id, MODNAME, uglyhack.pp_syscallnames[i],
 		    "return", SYSTRACE_ARTIFICIAL_FRAMES,
 		    (void *)((uintptr_t)SYSTRACE_RETURN(i)));
 	}
@@ -335,12 +358,16 @@ SYSINIT(systrace_load, SI_SUB_DTRACE_PRO
 SYSUNINIT(systrace_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, systrace_unload, NULL);
 
 #ifdef LINUX_SYSTRACE
-DEV_MODULE(linsystrace, systrace_modevent, NULL);
-MODULE_VERSION(linsystrace, 1);
-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);
+DEV_MODULE(systrace_linux32, systrace_modevent, NULL);
+MODULE_VERSION(systrace_linux32, 1);
+MODULE_DEPEND(systrace_linux32, linux, 1, 1, 1);
+MODULE_DEPEND(systrace_linux32, dtrace, 1, 1, 1);
+MODULE_DEPEND(systrace_linux32, opensolaris, 1, 1, 1);
+#elif defined(FREEBSD32_SYSTRACE)
+DEV_MODULE(systrace_freebsd32, systrace_modevent, NULL);
+MODULE_VERSION(systrace_freebsd32, 1);
+MODULE_DEPEND(systrace_freebsd32, dtrace, 1, 1, 1);
+MODULE_DEPEND(systrace_freebsd32, opensolaris, 1, 1, 1);
 #else
 DEV_MODULE(systrace, systrace_modevent, NULL);
 MODULE_VERSION(systrace, 1);

Modified: head/sys/modules/dtrace/Makefile
==============================================================================
--- head/sys/modules/dtrace/Makefile	Sat Mar 12 08:58:19 2011	(r219560)
+++ head/sys/modules/dtrace/Makefile	Sat Mar 12 09:09:25 2011	(r219561)
@@ -15,7 +15,10 @@ SUBDIR=		dtmalloc	\
 		systrace
 
 .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
-SUBDIR+=	fasttrap fbt
+SUBDIR+=	fasttrap fbt systrace_linux32
+.endif
+.if ${MACHINE_CPUARCH} == "amd64"
+SUBDIR+=	systrace_freebsd32
 .endif
 
 .include <bsd.subdir.mk>

Modified: head/sys/modules/dtrace/dtraceall/Makefile
==============================================================================
--- head/sys/modules/dtrace/dtraceall/Makefile	Sat Mar 12 08:58:19 2011	(r219560)
+++ head/sys/modules/dtrace/dtraceall/Makefile	Sat Mar 12 09:09:25 2011	(r219561)
@@ -1,8 +1,15 @@
 # $FreeBSD$
 
 KMOD=		dtraceall
-SRCS=		dtraceall.c
+SRCS=		dtraceall.c opt_compat.h
 
 CFLAGS+=	-I${.CURDIR}/../../..
 
+.if !defined(KERNBUILDDIR)
+opt_compat.h:
+.if ${MACHINE_ARCH} == "amd64"
+	echo "#define COMPAT_FREEBSD32 1" >> ${.TARGET}
+.endif
+.endif
+
 .include <bsd.kmod.mk>

Modified: head/sys/modules/dtrace/dtraceall/dtraceall.c
==============================================================================
--- head/sys/modules/dtrace/dtraceall/dtraceall.c	Sat Mar 12 08:58:19 2011	(r219560)
+++ head/sys/modules/dtrace/dtraceall/dtraceall.c	Sat Mar 12 09:09:25 2011	(r219561)
@@ -32,6 +32,7 @@
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/errno.h>
+#include "opt_compat.h"
 
 static int
 dtraceall_modevent(module_t mod __unused, int type, void *data __unused)
@@ -73,4 +74,7 @@ MODULE_DEPEND(dtraceall, fasttrap, 1, 1,
 MODULE_DEPEND(dtraceall, lockstat, 1, 1, 1);
 MODULE_DEPEND(dtraceall, sdt, 1, 1, 1);
 MODULE_DEPEND(dtraceall, systrace, 1, 1, 1);
+#if defined(COMPAT_FREEBSD32)
+MODULE_DEPEND(dtraceall, systrace_freebsd32, 1, 1, 1);
+#endif
 MODULE_DEPEND(dtraceall, profile, 1, 1, 1);

Added: head/sys/modules/dtrace/systrace_freebsd32/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/dtrace/systrace_freebsd32/Makefile	Sat Mar 12 09:09:25 2011	(r219561)
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../../../cddl/dev/systrace
+
+KMOD=		systrace_freebsd32
+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>

Added: head/sys/modules/dtrace/systrace_linux32/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/dtrace/systrace_linux32/Makefile	Sat Mar 12 09:09:25 2011	(r219561)
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../../../cddl/dev/systrace
+
+KMOD=		systrace_linux32
+SRCS=		systrace.c
+SRCS+=		vnode_if.h
+
+CFLAGS+=	-I${.CURDIR}/../../../cddl/compat/opensolaris \
+		-I${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common \
+		-I${.CURDIR}/../../.. -DLINUX_SYSTRACE
+
+.include <bsd.kmod.mk>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103120909.p2C99P2j010783>