git: 37a29946b91b - stable/14 - dtrace tests: Add a test case which validates FBT probe arguments

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Fri, 04 Oct 2024 15:57:03 UTC
The branch stable/14 has been updated by markj:

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

commit 37a29946b91b1360102ff9cc33eaf352a2f17726
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-09-19 09:22:03 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-10-04 15:56:42 +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
    
    (cherry picked from commit d439598dd0d341b0c0b77151ba904e09c42f8421)
---
 .../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 4aaf2013d59f..14394f9681eb 100644
--- a/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile
+++ b/cddl/usr.sbin/dtrace/tests/common/fbtprovider/Makefile
@@ -7,6 +7,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 6c4fcc8d4080..ee9c63034ed9 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_PROBE7(test, , , sdttest, 1, 2, 3, 4, 5, 6, 7);
+	if (arg2 == ARGTEST_SDT)
+		SDT_PROBE7(test, , , sdttest, 1, 2, 3, 4, 5, 6, 7);
+	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)