summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2013-06-02 00:33:36 +0000
committermarkj <markj@FreeBSD.org>2013-06-02 00:33:36 +0000
commitf492c31639eaf495f9f716a99298e803ce0bf00a (patch)
treebd10fe39d58ea76d935a08e5dab37edac08f352b
parent9e2431c34dc087e0ff7bb1a5ae076865b37fd54e (diff)
downloadFreeBSD-src-f492c31639eaf495f9f716a99298e803ce0bf00a.zip
FreeBSD-src-f492c31639eaf495f9f716a99298e803ce0bf00a.tar.gz
Port the SDT test now that it's possible to create SDT probes that take
seven arguments. The original test uses Solaris' uadmin system call to trigger the test probe; this change adds a sysctl to the dtrace_test module and gets the test program to trigger the test probe via the sysctl handler. The test is currently failing on amd64 because of some bugs in the way that probe arguments beyond the first five are obtained - these bugs will be fixed in a separate change.
-rw-r--r--cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.c20
-rw-r--r--cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.d4
-rw-r--r--sys/cddl/dev/dtrace/dtrace_test.c37
-rw-r--r--sys/modules/dtrace/dtrace_test/Makefile3
4 files changed, 50 insertions, 14 deletions
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.c b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.c
index e2e9505..013a9e7 100644
--- a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.c
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.c
@@ -26,26 +26,24 @@
#pragma ident "%Z%%M% %I% %E% SMI"
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#include <err.h>
#include <unistd.h>
-#ifndef __FreeBSD__
-#include <sys/uadmin.h>
-#endif
int
main(int argc, char **argv)
{
-#ifdef __FreeBSD__
- return (1);
-#else
+ int val = 1;
+
while (1) {
- if (uadmin(A_SDTTEST, 0, 0) < 0) {
- perror("uadmin");
- return (1);
- }
+ if (sysctlbyname("debug.dtracetest.sdttest", NULL, NULL, &val,
+ sizeof(val)))
+ err(1, "sysctlbyname");
sleep(1);
}
return (0);
-#endif
}
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.d
index 0523de0..e965b05 100644
--- a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.d
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/sdt/tst.sdtargs.d
@@ -43,7 +43,7 @@ ERROR
exit(1);
}
-sdt:::test
+test:::sdttest
/arg0 != 1 || arg1 != 2 || arg2 != 3 || arg3 != 4 || arg4 != 5 || arg5 != 6 ||
arg6 != 7/
{
@@ -54,7 +54,7 @@ sdt:::test
exit(1);
}
-sdt:::test
+test:::sdttest
{
exit(0);
}
diff --git a/sys/cddl/dev/dtrace/dtrace_test.c b/sys/cddl/dev/dtrace/dtrace_test.c
index d484fb2..f50ad89 100644
--- a/sys/cddl/dev/dtrace/dtrace_test.c
+++ b/sys/cddl/dev/dtrace/dtrace_test.c
@@ -25,15 +25,25 @@
* $FreeBSD$
*
*/
+#include "opt_kdtrace.h"
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/param.h>
+#include <sys/systm.h>
+
#include <sys/conf.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/sdt.h>
+#include <sys/sysctl.h>
#include <sys/vnode.h>
+SDT_PROVIDER_DEFINE(test);
+
+SDT_PROBE_DEFINE7(test, , , sdttest, sdttest, "int", "int", "int", "int", "int",
+ "int", "int");
+
/*
* These are variables that the DTrace test suite references in the
* Solaris kernel. We define them here so that the tests function
@@ -45,6 +55,33 @@ typedef struct vnode vnode_t;
vnode_t dummy;
vnode_t *rootvp = &dummy;
+/*
+ * Test SDT probes with more than 5 arguments. On amd64, such probes require
+ * special handling since only the first 5 arguments will be passed to
+ * dtrace_probe() in registers; the rest must be fetched off the stack.
+ */
+static int
+dtrace_test_sdttest(SYSCTL_HANDLER_ARGS)
+{
+ int val, error;
+
+ val = 0;
+ error = sysctl_handle_int(oidp, &val, 0, req);
+ if (error || req->newptr == NULL)
+ return (error);
+ else if (val == 0)
+ return (0);
+
+ SDT_PROBE7(test, , , sdttest, 1, 2, 3, 4, 5, 6, 7);
+
+ return (error);
+}
+
+static SYSCTL_NODE(_debug, OID_AUTO, dtracetest, CTLFLAG_RD, 0, "");
+
+SYSCTL_PROC(_debug_dtracetest, OID_AUTO, sdttest, CTLTYPE_INT | CTLFLAG_RW,
+ NULL, 0, dtrace_test_sdttest, "I", "Trigger the SDT test probe");
+
static int
dtrace_test_modevent(module_t mod, int type, void *data)
{
diff --git a/sys/modules/dtrace/dtrace_test/Makefile b/sys/modules/dtrace/dtrace_test/Makefile
index bc096f3..b03fe17 100644
--- a/sys/modules/dtrace/dtrace_test/Makefile
+++ b/sys/modules/dtrace/dtrace_test/Makefile
@@ -5,8 +5,9 @@
KMOD= dtrace_test
SRCS= dtrace_test.c
+SRCS+= opt_kdtrace.h
SRCS+= vnode_if.h
-
+
CFLAGS+= -I${.CURDIR}/../../..
CFLAGS+= -D_KERNEL
OpenPOWER on IntegriCloud