From 2b5617f1737f0eb451bddd0bba5f12f34a596504 Mon Sep 17 00:00:00 2001
From: "Frank Ch. Eigler" <fche@redhat.com>
Date: Thu, 2 Dec 2021 13:00:09 -0500
Subject: [PATCH] Resolves: rhbz1972798

---
 rhbz1972798.patch   |  19 +++++++
 sdt-asm-glibc.patch | 118 ++++++++++++++++++++++++++++++++++++++++++++
 systemtap.spec      |  10 +++-
 3 files changed, 146 insertions(+), 1 deletion(-)
 create mode 100644 rhbz1972798.patch
 create mode 100644 sdt-asm-glibc.patch

diff --git a/rhbz1972798.patch b/rhbz1972798.patch
new file mode 100644
index 0000000..e93607c
--- /dev/null
+++ b/rhbz1972798.patch
@@ -0,0 +1,19 @@
+commit 2c11a115bdbe41a7f064ccd32b41c76c5b7c516d
+Author: Martin Cermak <mcermak@redhat.com>
+Date:   Wed Dec 1 14:04:57 2021 +0100
+
+    tapset/linux/nfs.stp:  Fix rhbz1972798
+
+diff --git a/tapset/linux/nfs.stp b/tapset/linux/nfs.stp
+index 28f0b90ed..232289e3b 100644
+--- a/tapset/linux/nfs.stp
++++ b/tapset/linux/nfs.stp
+@@ -979,7 +979,7 @@ probe nfs.aop.readpages = kernel.function ("nfs_readpages") !,
+         ino = $mapping->host->i_ino
+ 
+         nr_pages = $nr_pages
+-        file = $filp
++        file = @choose_defined($filp, $file)
+ 
+         rpages = __nfs_rpages($mapping->host)
+         rsize  = __nfs_server_rsize($mapping->host)
diff --git a/sdt-asm-glibc.patch b/sdt-asm-glibc.patch
new file mode 100644
index 0000000..c8d1a46
--- /dev/null
+++ b/sdt-asm-glibc.patch
@@ -0,0 +1,118 @@
+commit ecab2afea46099b4e7dfd551462689224afdbe3a
+Author: Stan Cox <scox@redhat.com>
+Date:   Wed Dec 1 16:19:22 2021 -0500
+
+    Handle user supplied sdt probe argument template
+    
+    User supplied templates were erroneously removed by commit eaa15b047,
+    which complicated the template expansion. To do the above the
+    expansion of STAP_PROBE_ASM(provider, fooprobe,
+    STAP_PROBE_ASM_TEMPLATE(3)) adds an unused argument:
+    STAP_PROBE_ASM(provider, fooprobe, /*template expansion*/ "%[SDT..]..",
+    "use _SDT_ASM_TEMPLATE") A supplied template
+    STAP_PROBE_ASM(provider, fooprobe, "4@%rdx 8@%rax") is left alone.  If
+    the varargs has 2 args (the fake "use ..") then macro expansion
+    inserts the expanded string, otherwise "4@.." becomes an ascii op.
+
+diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h
+index 28d236d91..24d5e01c3 100644
+--- a/includes/sys/sdt.h
++++ b/includes/sys/sdt.h
+@@ -290,7 +290,7 @@ __extension__ extern unsigned long long __sdt_unsp;
+   _SDT_ASM_1(.purgem _SDT_TYPE_)					      \
+   _SDT_ASM_1(.purgem _SDT_TYPE)
+ 
+-#define _SDT_ASM_BODY(provider, name, pack_args, args)			      \
++#define _SDT_ASM_BODY(provider, name, pack_args, args, ...)		      \
+   _SDT_DEF_MACROS							      \
+   _SDT_ASM_1(990:	_SDT_NOP)					      \
+   _SDT_ASM_3(		.pushsection .note.stapsdt,_SDT_ASM_AUTOGROUP,"note") \
+@@ -417,9 +417,9 @@ __extension__ extern unsigned long long __sdt_unsp;
+    counted, so we don't have to worry about the behavior of macros
+    called without any arguments.  */
+ 
+-#ifdef SDT_USE_VARIADIC
+ #define _SDT_NARG(...) __SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
+ #define __SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
++#ifdef SDT_USE_VARIADIC
+ #define _SDT_PROBE_N(provider, name, N, ...) \
+   _SDT_PROBE(provider, name, N, (__VA_ARGS__))
+ #define STAP_PROBEV(provider, name, ...) \
+@@ -468,9 +468,15 @@ __extension__ extern unsigned long long __sdt_unsp;
+     Note that these can use operand templates like %0 or %[name],
+     and likewise they must write %%reg for a literal operand of %reg.  */
+ 
++#define _SDT_ASM_BODY_1(p,n,...) _SDT_ASM_BODY(p,n,_SDT_ASM_SUBSTR,(__VA_ARGS__))
++#define _SDT_ASM_BODY_2(p,n,...) _SDT_ASM_BODY(p,n,/*_SDT_ASM_STRING */,__VA_ARGS__)
++#define _SDT_ASM_BODY_N2(p,n,no,...) _SDT_ASM_BODY_ ## no(p,n,__VA_ARGS__)
++#define _SDT_ASM_BODY_N1(p,n,no,...) _SDT_ASM_BODY_N2(p,n,no,__VA_ARGS__)
++#define _SDT_ASM_BODY_N(p,n,...) _SDT_ASM_BODY_N1(p,n,_SDT_NARG(0, __VA_ARGS__),__VA_ARGS__)
++
+ #if __STDC_VERSION__ >= 199901L
+ # define STAP_PROBE_ASM(provider, name, ...)		\
+-  _SDT_ASM_BODY(provider, name, /*_SDT_ASM_STRING */, __VA_ARGS__)	\
++  _SDT_ASM_BODY_N(provider, name, __VA_ARGS__)					\
+   _SDT_ASM_BASE
+ # define STAP_PROBE_ASM_OPERANDS(n, ...) _SDT_ASM_OPERANDS_##n(__VA_ARGS__)
+ #else
+@@ -478,7 +484,7 @@ __extension__ extern unsigned long long __sdt_unsp;
+   _SDT_ASM_BODY(provider, name, /* _SDT_ASM_STRING */, (args))	\
+   _SDT_ASM_BASE
+ #endif
+-#define STAP_PROBE_ASM_TEMPLATE(n)	_SDT_ASM_TEMPLATE_##n
++#define STAP_PROBE_ASM_TEMPLATE(n) _SDT_ASM_TEMPLATE_##n,"use _SDT_ASM_TEMPLATE_"
+ 
+ 
+ /* DTrace compatible macro names.  */
+diff --git a/testsuite/systemtap.base/sdt_casm.c b/testsuite/systemtap.base/sdt_casm.c
+index 1cff23c5f..9b357086c 100644
+--- a/testsuite/systemtap.base/sdt_casm.c
++++ b/testsuite/systemtap.base/sdt_casm.c
+@@ -3,6 +3,7 @@
+ int main()
+ {
+     int x = 42;
++    int y = 43;
+     __asm__ __volatile__ (
+             STAP_PROBE_ASM(testsuite, probe0, STAP_PROBE_ASM_TEMPLATE(0))
+             );
+@@ -10,5 +11,9 @@ int main()
+             STAP_PROBE_ASM(testsuite, probe1, STAP_PROBE_ASM_TEMPLATE(1))
+             :: STAP_PROBE_ASM_OPERANDS(1, x)
+             );
++    // Create a template to test explicit template support
++    __asm__ __volatile__ (
++			  STAP_PROBE_ASM(testsuite, probe2, -4@%[ARG1] -4@%[ARG2])
++			  :: [ARG1] "rm" (x), [ARG2] "rm" (y));
+     return 0;
+ }
+diff --git a/testsuite/systemtap.base/sdt_casm.exp b/testsuite/systemtap.base/sdt_casm.exp
+index 5791cb2b9..0cd1cb517 100644
+--- a/testsuite/systemtap.base/sdt_casm.exp
++++ b/testsuite/systemtap.base/sdt_casm.exp
+@@ -18,7 +18,8 @@ proc cleanup_handler { verbose } {
+ 
+ set script $srcdir/$subdir/$test.stp
+ set ::result_string {PASS: probe0
+-PASS: probe1}
++PASS: probe1
++PASS: probe2}
+ 
+ set asm_flags [sdt_includes]
+ set asm_flags "$asm_flags additional_flags=-std=c99"
+diff --git a/testsuite/systemtap.base/sdt_casm.stp b/testsuite/systemtap.base/sdt_casm.stp
+index 4f2539c93..530a79175 100644
+--- a/testsuite/systemtap.base/sdt_casm.stp
++++ b/testsuite/systemtap.base/sdt_casm.stp
+@@ -10,3 +10,11 @@ probe process.mark("probe1")
+     else
+         printf("FAIL: %s (%d != 42)\n", $$name, $arg1)
+ }
++
++probe process.mark("probe2") 
++{
++    if ($arg1 == 42 && $arg2 == 43)
++        printf("PASS: %s\n", $$name)
++    else
++        printf("FAIL: %s (%d/%d != 42/43)\n", $$name, $arg1, $arg2)
++}
diff --git a/systemtap.spec b/systemtap.spec
index 14f2a6c..6820423 100644
--- a/systemtap.spec
+++ b/systemtap.spec
@@ -118,7 +118,7 @@ m     stapdev  stapdev
 
 Name: systemtap
 Version: 4.6
-Release: 2%{?release_override}%{?dist}
+Release: 3%{?release_override}%{?dist}
 # for version, see also configure.ac
 
 
@@ -155,6 +155,8 @@ URL: http://sourceware.org/systemtap/
 Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz
 
 Patch1: rhbz2025054python3.patch
+Patch2: rhbz1972798.patch
+Patch3: sdt-asm-glibc.patch
 
 # Build*
 BuildRequires: make
@@ -577,6 +579,8 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
 %setup -q
 
 %patch1 -p1
+%patch2 -p1
+%patch3 -p1
 
 %build
 
@@ -1273,6 +1277,10 @@ exit 0
 
 # PRERELEASE
 %changelog
+* Thu Dec 02 2021 Frank Ch. Eigler <fche@redhat.com> - 4.6.3
+- rhbz2972798 - nfs tapset tweaks
+- sys/sdt.h fixes for glibc ftbfs
+
 * Thu Nov 25 2021 Martin Cermak <mcermak@redhat.com> - 4.6.2
 - rhbz2012907: Fix use of sysuser.d/* for user/group management