git: d439598dd0d3 - main - dtrace tests: Add a test case which validates FBT probe arguments

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Thu, 19 Sep 2024 09:53:38 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=d439598dd0d341b0c0b77151ba904e09c42f8421

commit d439598dd0d341b0c0b77151ba904e09c42f8421
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-09-19 09:22:03 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-09-19 09:22:03 +0000

    dtrace tests: Add a test case which validates FBT probe arguments
    
    Reviewed by:    avg
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D46674
---
 .../test/tst/common/fbtprovider/tst.argtest.ksh    | 34 ++++++++++++++++++++++
 .../tst/common/fbtprovider/tst.argtest.ksh.out     |  3 ++
 .../dtrace/tests/common/fbtprovider/Makefile       |  2 ++
 sys/cddl/dev/dtrace/dtrace_test.c                  | 28 ++++++++++++++++--
 4 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh
new file mode 100644
index 000000000000..dc3641b01101
--- /dev/null
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh
@@ -0,0 +1,34 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2024 Mark Johnston <markj@FreeBSD.org>
+#
+
+dtrace=$1
+
+$dtrace -q -s /dev/stdin -c "sysctl debug.dtracetest.fbttest=1" <<__EOF__
+fbt:dtrace_test:fbttest:entry
+{
+    printf("%d %d %d %d %d %d %d %d %d %d\n", args[0], args[1], args[2],
+        args[3], args[4], args[5], args[6], args[7], args[8], args[9]);
+}
+__EOF__
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh.out
new file mode 100644
index 000000000000..301e154b3339
--- /dev/null
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/fbtprovider/tst.argtest.ksh.out
@@ -0,0 +1,3 @@
+debug.dtracetest.fbttest: 0 -> 0
+1 2 3 4 5 6 7 8 9 10
+
diff --git a/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile b/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile
index 3ca540fd77f1..0dee8f807065 100644
--- a/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile
+++ b/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile
@@ -6,6 +6,8 @@ PACKAGE=	tests
 
 ${PACKAGE}FILES= \
      err.D_PDESC_ZERO.notreturn.d  \
+     tst.argtest.ksh  \
+     tst.argtest.ksh.out  \
      tst.basic.d  \
      tst.functionentry.d  \
      tst.functionreturnvalue.d  \
diff --git a/sys/cddl/dev/dtrace/dtrace_test.c b/sys/cddl/dev/dtrace/dtrace_test.c
index e36debc27a49..a61958d9184a 100644
--- a/sys/cddl/dev/dtrace/dtrace_test.c
+++ b/sys/cddl/dev/dtrace/dtrace_test.c
@@ -51,13 +51,27 @@ typedef struct vnode vnode_t;
 vnode_t dummy;
 vnode_t *rootvp = &dummy;
 
+enum argtest {
+	ARGTEST_SDT,
+	ARGTEST_FBT,
+};
+
+extern void fbttest(int, int, int, int, int, int, int, int, int, int);
+
+void __noinline
+fbttest(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
+{
+	printf("fbttest(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\n",
+	    a, b, c, d, e, f, g, h, i, j);
+}
+
 /*
  * 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)
+dtrace_test_argtest(SYSCTL_HANDLER_ARGS)
 {
 	int val, error;
 
@@ -68,7 +82,10 @@ dtrace_test_sdttest(SYSCTL_HANDLER_ARGS)
 	else if (val == 0)
 		return (0);
 
-	SDT_PROBE6(test, , , sdttest, 1, 2, 3, 4, 5, 6);
+	if (arg2 == ARGTEST_SDT)
+		SDT_PROBE6(test, , , sdttest, 1, 2, 3, 4, 5, 6);
+	else
+		fbttest(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
 
 	return (error);
 }
@@ -78,8 +95,13 @@ static SYSCTL_NODE(_debug, OID_AUTO, dtracetest,
     "");
 
 SYSCTL_PROC(_debug_dtracetest, OID_AUTO, sdttest,
-    CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RW, NULL, 0, dtrace_test_sdttest,
+    CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RW, NULL, ARGTEST_SDT,
+    dtrace_test_argtest,
     "I", "Trigger the SDT test probe");
+SYSCTL_PROC(_debug_dtracetest, OID_AUTO, fbttest,
+    CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RW, NULL, ARGTEST_FBT,
+    dtrace_test_argtest,
+    "I", "Trigger the FBT test probe");
 
 static int
 dtrace_test_modevent(module_t mod, int type, void *data)