Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea39b8ce32 |
4 changed files with 213 additions and 1 deletions
42
PR23879-PR24875.patch
Normal file
42
PR23879-PR24875.patch
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
From 4ae4592f1106e941023a5768d34c2381cc869631 Mon Sep 17 00:00:00 2001
|
||||
From: "Frank Ch. Eigler" <fche@redhat.com>
|
||||
Date: Wed, 21 Aug 2019 19:29:45 -0400
|
||||
Subject: [PATCH] PR23879, PR24875: fix task-finder-vma on f29+
|
||||
|
||||
It was reported & rediscovered that some vma-dependent runtime
|
||||
facilities have been broken: @vma() and *ubacktrace(). It turns out
|
||||
that modern gcc/ld.so links/loads binaries in slightly different ways
|
||||
than older toolchains. Specifically, the first page of ELF files is
|
||||
now loaded only r--p instead of r-xp protection flags. The
|
||||
_stp_vma_mmap_cb() routine now accepts the r--p case too. It now
|
||||
ignores the flags entirely.
|
||||
---
|
||||
runtime/vma.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/runtime/vma.c b/runtime/vma.c
|
||||
index 7021725d6..02f9bf849 100644
|
||||
--- a/runtime/vma.c
|
||||
+++ b/runtime/vma.c
|
||||
@@ -157,10 +157,15 @@ static int _stp_vma_mmap_cb(struct stap_task_finder_target *tgt,
|
||||
dbug_task_vma(1,
|
||||
"mmap_cb: tsk %d:%d path %s, addr 0x%08lx, length 0x%08lx, offset 0x%lx, flags 0x%lx\n",
|
||||
tsk->pid, tsk->tgid, path, addr, length, offset, vm_flags);
|
||||
- // We are only interested in the first load of the whole module that
|
||||
- // is executable. We register whether or not we know the module,
|
||||
+
|
||||
+ // We used to be only interested in the first load of the whole module that
|
||||
+ // is executable. But with modern enough gcc/ld.so, executables are mapped
|
||||
+ // in more small pieces (r--p,r-xp,rw-p, instead of r-xp, rw-p). To establish
|
||||
+ // the virtual base address, we initially look for an offset=0 mapping.
|
||||
+ //
|
||||
+ // We register whether or not we know the module,
|
||||
// so we can later lookup the name given an address for this task.
|
||||
- if (path != NULL && offset == 0 && (vm_flags & VM_EXEC)
|
||||
+ if (path != NULL && offset == 0
|
||||
&& stap_find_vma_map_info(tsk, addr, NULL, NULL, NULL, NULL) != 0) {
|
||||
for (i = 0; i < _stp_num_modules; i++) {
|
||||
// PR20433: papering over possibility of NULL pointers
|
||||
--
|
||||
2.21.0
|
||||
|
||||
26
PR24904-changes-wit.patch
Normal file
26
PR24904-changes-wit.patch
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
From f4f0da6db3be523472b25a219ea245fd6d3489f9 Mon Sep 17 00:00:00 2001
|
||||
From: "Frank Ch. Eigler" <fche@redhat.com>
|
||||
Date: Tue, 20 Aug 2019 22:17:02 -0400
|
||||
Subject: [PATCH] PR24904: support linux 5.2's stacktrace.c changes with
|
||||
-DDEBUG_UNWIND too
|
||||
|
||||
---
|
||||
runtime/stack.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/runtime/stack.c b/runtime/stack.c
|
||||
index bf59b2909..6ec7b2602 100644
|
||||
--- a/runtime/stack.c
|
||||
+++ b/runtime/stack.c
|
||||
@@ -56,7 +56,7 @@ _stp_init_stack(void)
|
||||
{
|
||||
stack_trace_save_regs_fn = (void*) kallsyms_lookup_name("stack_trace_save_regs");
|
||||
dbug_unwind(1, "stack_trace_saves_regs_fn=%lx for _stp_stack_print_fallback().\n",
|
||||
- (unsigned long) save_trace_save_regs_fn);
|
||||
+ (unsigned long) stack_trace_save_regs_fn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.21.0
|
||||
|
||||
130
PR24904-changes.patch
Normal file
130
PR24904-changes.patch
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
From 49fa913a61e7f2941bb59c11d72a1aafa6930162 Mon Sep 17 00:00:00 2001
|
||||
From: "Frank Ch. Eigler" <fche@redhat.com>
|
||||
Date: Tue, 20 Aug 2019 21:20:40 -0400
|
||||
Subject: [PATCH] PR24904: support linux 5.2's stacktrace.c changes
|
||||
|
||||
The following kernel commit disabled the older struct stack_trace APIs
|
||||
on architectures that support the newer stackwalk APIs. Provide an
|
||||
adaptation layer to stack_trace_save_regs().
|
||||
|
||||
commit 214d8ca6ee854f696f75e75511fe66b409e656db
|
||||
Author: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu Apr 25 11:45:21 2019 +0200
|
||||
|
||||
stacktrace: Provide common infrastructure
|
||||
---
|
||||
buildrun.cxx | 2 +
|
||||
.../linux/autoconf-stack-trace-save-regs.c | 8 ++++
|
||||
runtime/stack.c | 37 +++++++++++++++++--
|
||||
3 files changed, 44 insertions(+), 3 deletions(-)
|
||||
create mode 100644 runtime/linux/autoconf-stack-trace-save-regs.c
|
||||
|
||||
diff --git a/buildrun.cxx b/buildrun.cxx
|
||||
index 5e8d3b961..6ed744707 100644
|
||||
--- a/buildrun.cxx
|
||||
+++ b/buildrun.cxx
|
||||
@@ -485,6 +485,8 @@ compile_pass (systemtap_session& s)
|
||||
output_autoconf(s, o, "autoconf-bio-bi_opf.c", "STAPCONF_BIO_BI_OPF", NULL);
|
||||
output_autoconf(s, o, "autoconf-linux-sched_headers.c",
|
||||
"STAPCONF_LINUX_SCHED_HEADERS", NULL);
|
||||
+ output_autoconf(s, o, "autoconf-stack-trace-save-regs.c",
|
||||
+ "STAPCONF_STACK_TRACE_SAVE_REGS", NULL);
|
||||
|
||||
// used by runtime/linux/netfilter.c
|
||||
output_exportconf(s, o, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK");
|
||||
diff --git a/runtime/linux/autoconf-stack-trace-save-regs.c b/runtime/linux/autoconf-stack-trace-save-regs.c
|
||||
new file mode 100644
|
||||
index 000000000..8bf33391f
|
||||
--- /dev/null
|
||||
+++ b/runtime/linux/autoconf-stack-trace-save-regs.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+#include <linux/stacktrace.h>
|
||||
+
|
||||
+unsigned int foo ()
|
||||
+{
|
||||
+ unsigned long e[10];
|
||||
+ struct pt_regs* r = 0;
|
||||
+ return stack_trace_save_regs (r, & e[0], 10, 0);
|
||||
+}
|
||||
diff --git a/runtime/stack.c b/runtime/stack.c
|
||||
index 0f649e8da..bf59b2909 100644
|
||||
--- a/runtime/stack.c
|
||||
+++ b/runtime/stack.c
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "linux/uprobes-inc.h"
|
||||
|
||||
#include <linux/stacktrace.h>
|
||||
+
|
||||
#if defined(STAPCONF_KERNEL_STACKTRACE) || defined(STAPCONF_KERNEL_STACKTRACE_NO_BP)
|
||||
#include <asm/stacktrace.h>
|
||||
#endif
|
||||
@@ -47,6 +48,20 @@
|
||||
#include <asm/unwind.h>
|
||||
#endif
|
||||
|
||||
+#if defined(STAPCONF_STACK_TRACE_SAVE_REGS) /* linux 5.2+ apprx. */
|
||||
+static __typeof__(stack_trace_save_regs) (*stack_trace_save_regs_fn); /* not exported */
|
||||
+
|
||||
+static int
|
||||
+_stp_init_stack(void)
|
||||
+{
|
||||
+ stack_trace_save_regs_fn = (void*) kallsyms_lookup_name("stack_trace_save_regs");
|
||||
+ dbug_unwind(1, "stack_trace_saves_regs_fn=%lx for _stp_stack_print_fallback().\n",
|
||||
+ (unsigned long) save_trace_save_regs_fn);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#else /* ! STAPCONF_STACK_TRACE_SAVE_REGS */
|
||||
+
|
||||
static void (*(save_stack_trace_regs_fn))(struct pt_regs *regs,
|
||||
struct stack_trace *trace);
|
||||
|
||||
@@ -60,6 +75,10 @@ _stp_init_stack(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#endif /* STAPCONF_STACK_TRACE_SAVE_REGS */
|
||||
+
|
||||
+
|
||||
+
|
||||
static void _stp_stack_print_fallback(unsigned long, struct pt_regs*, int, int, int);
|
||||
|
||||
#ifdef STP_USE_DWARF_UNWINDER
|
||||
@@ -168,9 +187,19 @@ static void _stp_stack_print_fallback(unsigned long sp, struct pt_regs *regs,
|
||||
int sym_flags,
|
||||
int levels, int skip) {
|
||||
unsigned long entries[MAXBACKTRACE];
|
||||
- struct stack_trace trace;
|
||||
- int i;
|
||||
+ unsigned i;
|
||||
+ unsigned num_entries;
|
||||
+
|
||||
+#if defined(STAPCONF_STACK_TRACE_SAVE_REGS) /* linux 5.2+ apprx. */
|
||||
+ if (!stack_trace_save_regs_fn) {
|
||||
+ dbug_unwind(1, "no fallback kernel stacktrace (giving up)\n");
|
||||
+ _stp_print_addr(0, sym_flags | _STP_SYM_INEXACT, NULL);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
+ num_entries = (*stack_trace_save_regs_fn)(regs, &entries[0], MAXBACKTRACE, skip);
|
||||
+#else
|
||||
+ struct stack_trace trace;
|
||||
/* If don't have save_stack_trace_regs unwinder, just give up. */
|
||||
if (!save_stack_trace_regs_fn) {
|
||||
dbug_unwind(1, "no fallback kernel stacktrace (giving up)\n");
|
||||
@@ -189,9 +218,11 @@ static void _stp_stack_print_fallback(unsigned long sp, struct pt_regs *regs,
|
||||
dbug_unwind(1, "trace.nr_entries: %d\n", trace.nr_entries);
|
||||
dbug_unwind(1, "trace.max_entries: %d\n", trace.max_entries);
|
||||
dbug_unwind(1, "trace.skip %d\n", trace.skip);
|
||||
+ num_entries = trace.nr_entries;
|
||||
+#endif
|
||||
|
||||
/* save_stack_trace_reg() adds a ULONG_MAX after last valid entry. Ignore it. */
|
||||
- for (i=0; i<MAXBACKTRACE && i<trace.nr_entries && entries[i]!=ULONG_MAX; ++i) {
|
||||
+ for (i=0; i<MAXBACKTRACE && i<num_entries && entries[i]!=ULONG_MAX; ++i) {
|
||||
/* When we have frame pointers, the unwind addresses can be
|
||||
(mostly) trusted, otherwise it is all guesswork. */
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
|
||||
Name: systemtap
|
||||
Version: 4.1
|
||||
Release: 1%{?release_override}%{?dist}
|
||||
Release: 2%{?release_override}%{?dist}
|
||||
# for version, see also configure.ac
|
||||
|
||||
|
||||
|
|
@ -123,6 +123,11 @@ License: GPLv2+
|
|||
URL: http://sourceware.org/systemtap/
|
||||
Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz
|
||||
|
||||
Patch10: PR23879-PR24875.patch
|
||||
Patch11: PR24904-changes.patch
|
||||
Patch12: PR24904-changes-wit.patch
|
||||
|
||||
|
||||
# Build*
|
||||
BuildRequires: gcc-c++
|
||||
BuildRequires: cpio
|
||||
|
|
@ -521,6 +526,10 @@ find . \( -name configure -o -name config.h.in \) -print | xargs touch
|
|||
cd ..
|
||||
%endif
|
||||
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
|
||||
%build
|
||||
|
||||
%if %{with_bundled_elfutils}
|
||||
|
|
@ -1256,6 +1265,11 @@ done
|
|||
|
||||
# PRERELEASE
|
||||
%changelog
|
||||
* Tue Aug 27 2019 Aaron Merey <amerey@redhat.com> - 4.2-0.20190827
|
||||
- PR23879,PR24875 - fix task finder vma on f29
|
||||
- PR24904 - support linux 5.2 stacktrace.c changes
|
||||
- PR24904 - support linux 5.2 stacktrace.c changes with -DDEBUG_UNWIND too
|
||||
|
||||
* Tue May 07 2019 Serguei Makarov <smakarov@redhat.com> - 4.1-1
|
||||
- Upstream release.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue