Compare commits

..

6 Commits
master ... f28

Author SHA1 Message Date
Mark Wielaard 9cae14be56 3.2-11 spec update. 2018-04-19 00:56:03 +02:00
Mark Wielaard f4d16bbfd4 3.2-11
- Add rhbz1549063.patch (/bin/env -> /usr/bin/env)
- Add rhbz1566745.patch (4.15 kernel tapset updates)
- Enable accidentially disabled Suggests: kernel-devel again.
2018-04-19 00:53:27 +02:00
Mark Wielaard b091a8808e 3.2-10
- Add unwind-fallback.patch
- rhbz1566422.patch
2018-04-18 16:57:44 +02:00
Mark Wielaard ac1f9cc510 3.2-9 - Add unwind-fallback.patch. 2018-04-17 17:13:18 +02:00
Björn Esser 2500eea295
Rebuilt for libjson-c.so.4 (json-c v0.13.1) on fc28 2018-03-27 10:34:50 +02:00
Frank Ch. Eigler 0384025141 Merge remote-tracking branch 'origin/f27' into f28
* origin/f27:
  Backport fix for removed timers in kernel 4.15 (#1546563)
2018-02-22 10:39:08 -05:00
15 changed files with 1171 additions and 293 deletions

35
.gitignore vendored
View File

@ -4,38 +4,3 @@
/systemtap-3.2-0.20170410gitcbf2583808d6.tar.gz
/systemtap-3.2-0.20170512gitc67d8f274b21.tar.gz
/systemtap-3.2.tar.gz
/systemtap-3.3-0.20180222git5ef0c24456e3.tar.gz
/systemtap-3.3-0.20180315gitc2585f2b58cd.tar.gz
/systemtap-3.3-0.20180420gitd4a446c.tar.gz
/systemtap-3.3-0.20180508git9c6ac6cda49e.tar.gz
/systemtap-3.3.tar.gz
/systemtap-4.0-0.20180810git.tar.gz
/systemtap-4.0-0.20180906git37598c4fee7c.tar.gz
/systemtap-4.0-0.20180914gitc51d4e55d285.tar.gz
/systemtap-4.0-0.20180914gitc1befcceae01.tar.gz
/systemtap-4.0-0.20180914git11a0a7aea387.tar.gz
/systemtap-4.0-0.20180914gitfe4e14f4af16.tar.gz
/systemtap-4.0-0.20180914gitfe4e14f4af16.1.tar.gz
/systemtap-4.0-0.20181003git4ad1e11de831.tar.gz
/systemtap-4.0.tar.gz
/systemtap-4.1-0.20181126gitf082df49dd91.tar.gz
/systemtap-4.1-0.20181126git47ce37a149b6.tar.gz
/systemtap-4.1-0.20181203gitec3b46eb9b19.tar.gz
/systemtap-4.1-0.20181204git891810c246d6.tar.gz
/systemtap-4.1-0.20190123gitc8084763b75f.tar.gz
/systemtap-4.1-0.20190125git905865da1024.tar.gz
/systemtap-4.1-0.20190207git4e76869512d2.tar.gz
/systemtap-4.1-0.20190307gitf7fb9c9182dc.tar.gz
/systemtap-4.1-0.20190308gitb3627d9aa037.tar.gz
/systemtap-4.1-0.20190327git2ede4cecb20c.tar.gz
/systemtap-4.1-0.20190502git446e7c358247.tar.gz
/systemtap-4.1.tar.gz
/systemtap-4.2-0.20190513git8b868f3dd030.tar.gz
/systemtap-4.2-0.20190613git2d77f531a5d1.tar.gz
/systemtap-4.2-0.20190618git47c3f6c60174.tar.gz
/systemtap-4.2-0.20190807gitebfc300ec2ad.tar.gz
/systemtap-4.2-0.20190827git8ffab23ff.tar.gz
/systemtap-4.2.tar.gz
/systemtap-4.3-0.20200112gitb1e6a6645bba.tar.gz
/systemtap-4.3-0.20200203git6c0b74f5910a.tar.gz
/systemtap-4.3-0.20200211git91ffb97ad335.tar.gz

49
rhbz1504009.patch Normal file
View File

@ -0,0 +1,49 @@
commit 9f81f10b0caf6dfc49c4b7ceb7902f45d37b532a (HEAD -> master, origin/master, origin/HEAD)
Author: Frank Ch. Eigler <fche@redhat.com>
Date: Fri Oct 20 10:01:58 2017 -0400
rhbz1504009: let dtrace -G -o /dev/null run, as in autoconf
commit c245153ca193c471a8c broke the ability of dtrace to be tested in
autoconf "-G -o /dev/null" usage, because its output file name was too
simple a function of the input name, and normal users can't write to
/dev/null.dtrace-temp.c . Now we back down to mkstemp, like before,
upon a failure of the simple concatenated name.
diff --git a/dtrace.in b/dtrace.in
index 2e2e002a5c56..25efc253b708 100644
--- a/dtrace.in
+++ b/dtrace.in
@@ -410,8 +410,12 @@ from tempfile import mkstemp
else:
print("header: " + fname)
- fname = filename + ".dtrace-temp.c"
- fdesc = open(fname, mode='w')
+ try: # for reproducible-builds purposes, prefer a fixed path name pattern
+ fname = filename + ".dtrace-temp.c"
+ fdesc = open(fname, mode='w')
+ except: # but that doesn't work for -o /dev/null - see rhbz1504009
+ (ignore,fname) = mkstemp(suffix=".c")
+ fdesc = open(fname, mode='w')
providers.semaphore_write(fdesc)
fdesc.close()
cc1 = os.environ.get("CC", "gcc")
diff --git a/testsuite/systemtap.base/dtrace.exp b/testsuite/systemtap.base/dtrace.exp
index fa6b3ec3f6d3..7c60f09d70b8 100644
--- a/testsuite/systemtap.base/dtrace.exp
+++ b/testsuite/systemtap.base/dtrace.exp
@@ -83,6 +83,13 @@ if {[file exists /tmp/XXX.o]} then {
}
exec rm -f /tmp/XXX.o
+verbose -log "$dtrace -G -s $dpath -o /dev/null"
+if [as_non_root "$python $dtrace -G -s $dpath -o /dev/null"] {
+ fail "$test -G -o /dev/null"
+} else {
+ pass "$test -G -o /dev/null"
+}
+
verbose -log "$dtrace -G -s $dpath -o /tmp/XXX"
catch {exec $python $dtrace -G -s $dpath -o /tmp/XXX} res
if {[file exists /tmp/XXX]} then {

208
rhbz1544711.patch Normal file
View File

@ -0,0 +1,208 @@
commit a8e317b60 (HEAD -> master, origin/master, origin/HEAD)
Author: Stan Cox <scox@redhat.com>
Date: Tue Feb 13 22:38:03 2018 -0500
Fixes for gcc 8
* includes/sys/sdt.h (__SDT_COND_SIGNED): Add CT, cast type argument
Author: Will Cohen <wcohen.redhat.com>
* stap-serverd.cxx (generate_mok, handleRequest, handle_connection):
Catch format overflow
* translate.cxx (translate_pass): Use ref in catch.
diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h
index 940f74483..c0c5a492c 100644
--- a/includes/sys/sdt.h
+++ b/includes/sys/sdt.h
@@ -119,8 +119,8 @@ struct __sdt_type
#define __SDT_ALWAYS_SIGNED(T) \
template<> struct __sdt_type<T> { static const bool __sdt_signed = true; };
-#define __SDT_COND_SIGNED(T) \
-template<> struct __sdt_type<T> { static const bool __sdt_signed = ((T)(-1) < 1); };
+#define __SDT_COND_SIGNED(T,CT) \
+template<> struct __sdt_type<T> { static const bool __sdt_signed = ((CT)(-1) < 1); };
__SDT_ALWAYS_SIGNED(signed char)
__SDT_ALWAYS_SIGNED(short)
__SDT_ALWAYS_SIGNED(int)
@@ -141,14 +141,14 @@ __SDT_ALWAYS_SIGNED(const volatile short)
__SDT_ALWAYS_SIGNED(const volatile int)
__SDT_ALWAYS_SIGNED(const volatile long)
__SDT_ALWAYS_SIGNED(const volatile long long)
-__SDT_COND_SIGNED(char)
-__SDT_COND_SIGNED(wchar_t)
-__SDT_COND_SIGNED(volatile char)
-__SDT_COND_SIGNED(volatile wchar_t)
-__SDT_COND_SIGNED(const char)
-__SDT_COND_SIGNED(const wchar_t)
-__SDT_COND_SIGNED(const volatile char)
-__SDT_COND_SIGNED(const volatile wchar_t)
+__SDT_COND_SIGNED(char, char)
+__SDT_COND_SIGNED(wchar_t, wchar_t)
+__SDT_COND_SIGNED(volatile char, char)
+__SDT_COND_SIGNED(volatile wchar_t, wchar_t)
+__SDT_COND_SIGNED(const char, char)
+__SDT_COND_SIGNED(const wchar_t, wchar_t)
+__SDT_COND_SIGNED(const volatile char, char)
+__SDT_COND_SIGNED(const volatile wchar_t, wchar_t)
#if defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
/* __SDT_COND_SIGNED(char16_t) */
/* __SDT_COND_SIGNED(char32_t) */
diff --git a/stap-serverd.cxx b/stap-serverd.cxx
index b8f70114c..063c3c587 100644
--- a/stap-serverd.cxx
+++ b/stap-serverd.cxx
@@ -1607,6 +1607,7 @@ generate_mok(string &mok_fingerprint)
char tmpdir[PATH_MAX] = { '\0' };
string public_cert_path, private_cert_path, destdir;
mode_t old_umask;
+ int retlen;
mok_fingerprint.clear ();
@@ -1631,7 +1632,14 @@ generate_mok(string &mok_fingerprint)
}
// Make a temporary directory to store results in.
- snprintf (tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", mok_path.c_str ());
+ retlen = snprintf (tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", mok_path.c_str ());
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Could not create %s name", "temporary directory"));
+ tmpdir[0] = '\0';
+ goto cleanup;
+ }
+
if (mkdtemp (tmpdir) == NULL)
{
server_error (_F("Could not create temporary directory %s: %s", tmpdir,
@@ -1704,6 +1712,7 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
unsigned u;
unsigned i;
FILE* f;
+ int retlen;
// Save the server version. Do this early, so the client knows what version of the server
// it is dealing with, even if the request is not fully completed.
@@ -1782,7 +1791,12 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
struct stat st;
char *arg;
- snprintf (stapargfile, PATH_MAX, "%s/argv%d", requestDirName.c_str (), i);
+ retlen = snprintf (stapargfile, PATH_MAX, "%s/argv%d", requestDirName.c_str (), i);
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "path"));
+ return;
+ }
rc = stat(stapargfile, & st);
if (rc) break;
@@ -1888,7 +1902,15 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
{
glob_t globber;
char pattern[PATH_MAX];
- snprintf (pattern, PATH_MAX, "%s/*.ko", new_staptmpdir.c_str());
+ int retlen;
+
+ retlen = snprintf (pattern, PATH_MAX, "%s/*.ko", new_staptmpdir.c_str());
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "pattern"));
+ return;
+ }
+
rc = glob (pattern, GLOB_ERR, NULL, &globber);
if (rc)
server_error (_F("Unable to find a module in %s", new_staptmpdir.c_str()));
@@ -2164,6 +2186,7 @@ handle_connection (void *arg)
copy for each connection.*/
vector<string> argv;
PRInt32 bytesRead;
+ int retlen;
/* Detatch to avoid a memory leak */
if(max_threads > 0)
@@ -2213,7 +2236,13 @@ handle_connection (void *arg)
#endif
secStatus = SECFailure;
- snprintf(tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", getenv("TMPDIR") ?: "/tmp");
+ retlen = snprintf(tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", getenv("TMPDIR") ?: "/tmp");
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "temporary directory"));
+ tmpdir[0]=0; /* prevent /bin/rm */
+ goto cleanup;
+ }
rc1 = mkdtemp(tmpdir);
if (! rc1)
{
@@ -2223,9 +2252,20 @@ handle_connection (void *arg)
}
/* Create a temporary files names and directories. */
- snprintf (requestFileName, PATH_MAX, "%s/request.zip", tmpdir);
+ retlen = snprintf (requestFileName, PATH_MAX, "%s/request.zip", tmpdir);
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "request.zip path"));
+ goto cleanup;
+ }
+
+ retlen = snprintf (requestDirName, PATH_MAX, "%s/request", tmpdir);
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "request directory path"));
+ goto cleanup;
+ }
- snprintf (requestDirName, PATH_MAX, "%s/request", tmpdir);
rc = mkdir(requestDirName, 0700);
if (rc)
{
@@ -2233,7 +2273,13 @@ handle_connection (void *arg)
goto cleanup;
}
- snprintf (responseDirName, PATH_MAX, "%s/response", tmpdir);
+ retlen = snprintf (responseDirName, PATH_MAX, "%s/response", tmpdir);
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "response directory path"));
+ goto cleanup;
+ }
+
rc = mkdir(responseDirName, 0700);
if (rc)
{
@@ -2243,7 +2289,12 @@ handle_connection (void *arg)
// Set this early, since it gets used for errors to be returned to the client.
stapstderr = string(responseDirName) + "/stderr";
- snprintf (responseFileName, PATH_MAX, "%s/response.zip", tmpdir);
+ retlen = snprintf (responseFileName, PATH_MAX, "%s/response.zip", tmpdir);
+ if (retlen < 0 || retlen >= PATH_MAX)
+ {
+ server_error (_F("Error creating %s name", "response.zip path"));
+ goto cleanup;
+ }
/* Read data from the socket.
* If the user is requesting/requiring authentication, authenticate
diff --git a/translate.cxx b/translate.cxx
index 1240a80ec..4ade06fdd 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -7860,7 +7860,7 @@ translate_pass (systemtap_session& s)
if (versions.size() >= 3 && s.verbose > 1)
clog << _F("ignoring extra parts of compat version: %s", s.compatible.c_str()) << endl;
}
- catch (const runtime_error)
+ catch (const runtime_error&)
{
throw SEMANTIC_ERROR(_F("parse error in compatibility version: %s", s.compatible.c_str()));
}

273
rhbz1546563.patch Normal file
View File

@ -0,0 +1,273 @@
From fbb26e17a4c026f05a497fc5d584516bad3b6950 Mon Sep 17 00:00:00 2001
From: David Smith <dsmith@redhat.com>
Date: Wed, 6 Dec 2017 14:37:42 -0600
Subject: [PATCH] Fix PR22551 by updating the use of timers for the 4.15
kernel.
* runtime/linux/timer_compatibility.h: New file.
* runtime/time.c: Update timer callback function parameter type. Update
timer initialization.
* runtime/transport/relay_v2.c: Ditto.
* runtime/transport/transport.c: Ditto.
* tapset-timers.cxx (timer_derived_probe_group::emit_module_decls):
Ditto. Handle old and new timer callback interface.
* runtime/linux/runtime.h: Include timer_compatibility.h instead of timer.h.
* tapset/linux/scsi.stp: Ditto.
---
runtime/linux/runtime.h | 2 +-
runtime/linux/timer_compatibility.h | 76 +++++++++++++++++++++++++++++++++++++
runtime/time.c | 7 ++--
runtime/transport/relay_v2.c | 8 ++--
runtime/transport/transport.c | 13 +++----
tapset-timers.cxx | 14 +++++--
tapset/linux/scsi.stp | 2 +-
7 files changed, 100 insertions(+), 22 deletions(-)
create mode 100644 runtime/linux/timer_compatibility.h
diff --git a/runtime/linux/runtime.h b/runtime/linux/runtime.h
index 9c585a2..df9b74c 100644
--- a/runtime/linux/runtime.h
+++ b/runtime/linux/runtime.h
@@ -34,7 +34,7 @@
#include <linux/compat.h>
#include <linux/sched.h>
#include <linux/mm.h>
-#include <linux/timer.h>
+#include "timer_compatibility.h"
#include <linux/delay.h>
#include <linux/profile.h>
#include <linux/rcupdate.h>
diff --git a/runtime/linux/timer_compatibility.h b/runtime/linux/timer_compatibility.h
new file mode 100644
index 0000000..ac03de9
--- /dev/null
+++ b/runtime/linux/timer_compatibility.h
@@ -0,0 +1,76 @@
+/*
+ * linux/timer.h compatibility defines and inlines
+ * Copyright (C) 2017 Red Hat Inc.
+ *
+ * This file is part of systemtap, and is free software. You can
+ * redistribute it and/or modify it under the terms of the GNU General
+ * Public License (GPL); either version 2, or (at your option) any
+ * later version.
+ */
+
+#ifndef _TIMER_COMPATIBILITY_H_
+#define _TIMER_COMPATIBILITY_H_
+
+#include <linux/timer.h>
+
+/*
+ * Starting with the 4.15 kernel, the timer interface
+ * changed. Originally, you'd do something like:
+ *
+ * static void timer_func(unsigned long val);
+ *
+ * init_timer(&timer);
+ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL;
+ * timer.function = timer_func;
+ * timer.data = 0;
+ * add_timer(&timer);
+ *
+ * The 'data' parameter would get passed to the callback
+ * function. Starting with 4.15, you'd do something like this:
+ *
+ * static void timer_func(struct timer_list *val);
+ *
+ * timer_setup(&timer, timer_func, 0);
+ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL;
+ * add_timer(&timer);
+ *
+ * With the new code, the timer that caused the callback gets passed
+ * to the timer callback function. The 'data' field has been removed.
+ *
+ * So, we're going to use the new interface. To hide the differences
+ * between the callback function parameter type, we'll define a new
+ * type, 'stp_timer_callback_parameter_t'.
+ *
+ * If code needs to figure out the difference between the old and new
+ * interface, it should test the TIMER_TRACE_FLAGMASK define (which
+ * only exists in the new interface).
+ */
+
+#if defined(TIMER_TRACE_FLAGMASK)
+/* This is the >= 4.15 kernel interface. */
+
+typedef struct timer_list * stp_timer_callback_parameter_t;
+
+#else
+/* This is the < 4.15 kernel interface. */
+
+typedef unsigned long stp_timer_callback_parameter_t;
+
+/**
+ * timer_setup - prepare a timer for first use
+ * @timer: the timer in question
+ * @callback: the function to call when timer expires
+ * @flags: any TIMER_* flags (note that anything other than 0 is an
+ * error, since this compatibility function can't support any
+ * of the TIMER_* flags)
+ */
+#define timer_setup(timer, callback, flags) \
+ { \
+ init_timer((timer)); \
+ (timer)->function = callback; \
+ (timer)->data = 0; \
+ BUILD_BUG_ON_ZERO((flags) != 0); \
+ }
+#endif
+
+#endif /* _TIMER_COMPATIBILITY_H_ */
diff --git a/runtime/time.c b/runtime/time.c
index 2e666d5..91ceafa 100644
--- a/runtime/time.c
+++ b/runtime/time.c
@@ -168,10 +168,10 @@ __stp_time_smp_callback(void *val)
/* The timer callback is in a softIRQ -- interrupts enabled. */
static void
-__stp_time_timer_callback(unsigned long val)
+__stp_time_timer_callback(stp_timer_callback_parameter_t unused)
{
stp_time_t *time =__stp_time_local_update();
- (void) val;
+ (void) unused;
/* PR6481: make sure IRQs are enabled before resetting the timer
(IRQs are disabled and then reenabled in
@@ -200,9 +200,8 @@ __stp_init_time(void *info)
time->freq = __stp_get_freq();
__stp_time_local_update();
- init_timer(&time->timer);
+ timer_setup(&time->timer, __stp_time_timer_callback, 0);
time->timer.expires = jiffies + STP_TIME_SYNC_INTERVAL;
- time->timer.function = __stp_time_timer_callback;
#ifndef STAPCONF_ADD_TIMER_ON
add_timer(&time->timer);
diff --git a/runtime/transport/relay_v2.c b/runtime/transport/relay_v2.c
index f81d75d..135951a 100644
--- a/runtime/transport/relay_v2.c
+++ b/runtime/transport/relay_v2.c
@@ -30,7 +30,7 @@
#include <linux/debugfs.h>
#include <linux/mm.h>
#include <linux/relay.h>
-#include <linux/timer.h>
+#include "../linux/timer_compatibility.h"
#include "../uidgid_compatibility.h"
#include "relay_compat.h"
@@ -120,7 +120,7 @@ static void __stp_relay_wakeup_readers(struct rchan_buf *buf)
wake_up_interruptible(&buf->read_wait);
}
-static void __stp_relay_wakeup_timer(unsigned long val)
+static void __stp_relay_wakeup_timer(stp_timer_callback_parameter_t unused)
{
#ifdef STP_BULKMODE
int i;
@@ -151,10 +151,8 @@ static void __stp_relay_wakeup_timer(unsigned long val)
static void __stp_relay_timer_init(void)
{
atomic_set(&_stp_relay_data.wakeup, 0);
- init_timer(&_stp_relay_data.timer);
+ timer_setup(&_stp_relay_data.timer, __stp_relay_wakeup_timer, 0);
_stp_relay_data.timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL;
- _stp_relay_data.timer.function = __stp_relay_wakeup_timer;
- _stp_relay_data.timer.data = 0;
add_timer(&_stp_relay_data.timer);
smp_mb();
}
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index 3400f22..320fd18 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -311,7 +311,7 @@ static void _stp_detach(void)
}
-static void _stp_ctl_work_callback(unsigned long val);
+static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused);
/*
* Called when stapio opens the control channel.
@@ -320,13 +320,12 @@ static void _stp_attach(void)
{
dbug_trans(1, "attach\n");
_stp_pid = current->pid;
- if (_stp_namespaces_pid < 1)
- _stp_namespaces_pid = _stp_pid;
+ if (_stp_namespaces_pid < 1)
+ _stp_namespaces_pid = _stp_pid;
_stp_transport_data_fs_overwrite(0);
- init_timer(&_stp_ctl_work_timer);
+
+ timer_setup(&_stp_ctl_work_timer, _stp_ctl_work_callback, 0);
_stp_ctl_work_timer.expires = jiffies + STP_CTL_TIMER_INTERVAL;
- _stp_ctl_work_timer.function = _stp_ctl_work_callback;
- _stp_ctl_work_timer.data= 0;
add_timer(&_stp_ctl_work_timer);
}
@@ -341,7 +340,7 @@ static void _stp_attach(void)
* notified. Reschedules itself if someone is still attached
* to the cmd channel.
*/
-static void _stp_ctl_work_callback(unsigned long val)
+static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused)
{
int do_io = 0;
unsigned long flags;
diff --git a/tapset-timers.cxx b/tapset-timers.cxx
index 1a40bcd..0ab4d69 100644
--- a/tapset-timers.cxx
+++ b/tapset-timers.cxx
@@ -122,9 +122,13 @@ timer_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline(-1) << "};";
s.op->newline();
- s.op->newline() << "static void enter_timer_probe (unsigned long val) {";
+ s.op->newline() << "static void enter_timer_probe (stp_timer_callback_parameter_t val) {";
+ s.op->newline() << "#if defined(TIMER_TRACE_FLAGMASK)";
+ s.op->newline(1) << "struct stap_timer_probe* stp = container_of(val, struct stap_timer_probe, timer_list);";
+ s.op->newline(-1) << "#else";
s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [val];";
- s.op->newline() << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||";
+ s.op->newline(-1) << "#endif";
+ s.op->newline(1) << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||";
s.op->newline() << " (atomic_read (session_state()) == STAP_SESSION_RUNNING))";
s.op->newline(1) << "mod_timer (& stp->timer_list, jiffies + ";
emit_interval (s.op);
@@ -148,9 +152,11 @@ timer_derived_probe_group::emit_module_init (systemtap_session& s)
s.op->newline() << "for (i=0; i<" << probes.size() << "; i++) {";
s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [i];";
s.op->newline() << "probe_point = stp->probe->pp;";
- s.op->newline() << "init_timer (& stp->timer_list);";
- s.op->newline() << "stp->timer_list.function = & enter_timer_probe;";
+
+ s.op->newline() << "timer_setup (& stp->timer_list, enter_timer_probe, 0);";
+ s.op->newline() << "#if !defined(TIMER_TRACE_FLAGMASK)";
s.op->newline() << "stp->timer_list.data = i;"; // NB: important!
+ s.op->newline() << "#endif";
// copy timer renew calculations from above :-(
s.op->newline() << "stp->timer_list.expires = jiffies + ";
emit_interval (s.op);
diff --git a/tapset/linux/scsi.stp b/tapset/linux/scsi.stp
index 44f686c..3577942 100644
--- a/tapset/linux/scsi.stp
+++ b/tapset/linux/scsi.stp
@@ -14,7 +14,7 @@
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
-#include <linux/timer.h>
+#include "linux/timer_compatibility.h"
#include <linux/blkdev.h>
%}
--
2.9.3

32
rhbz1549063.patch Normal file
View File

@ -0,0 +1,32 @@
commit d6492e78bd50e923963e3c7aa235100a208f4775
Author: Mark Wielaard <mark@klomp.org>
Date: Mon Feb 26 11:31:44 2018 +0100
testsuite: Use /usr/bin/env everywhere.
bz5274.stp and bz5274.a.stp where still using /bin/env instead of
/usr/bin/env like every other testsuite file.
The latest coreutils in rawhide dropped old /bin/* provides.
https://bugzilla.redhat.com/show_bug.cgi?id=1549063
diff --git a/testsuite/systemtap.base/bz5274.a.stp b/testsuite/systemtap.base/bz5274.a.stp
index 1d3aefc..e6365e4 100755
--- a/testsuite/systemtap.base/bz5274.a.stp
+++ b/testsuite/systemtap.base/bz5274.a.stp
@@ -1,4 +1,4 @@
-#! /bin/env stap
+#! /usr/bin/env stap
probe process("./bz5274").function("funcb").call,
process("./bz5274").function("funcc").call,
process("./bz5274").function("funcd").call
diff --git a/testsuite/systemtap.base/bz5274.stp b/testsuite/systemtap.base/bz5274.stp
index b3e26d8..2f62cbc 100755
--- a/testsuite/systemtap.base/bz5274.stp
+++ b/testsuite/systemtap.base/bz5274.stp
@@ -1,4 +1,4 @@
-#! /bin/env stap
+#! /usr/bin/env stap
probe process("./bz5274").function("*").call {
printf("%s Entering %s\n", pp(), thread_indent(1))
}

46
rhbz1566422.patch Normal file
View File

@ -0,0 +1,46 @@
commit db9c9d6e30c6cfd7b85475b5c79ee2cc51201934
Author: Serhei Makarov <smakarov@redhat.com>
Date: Tue Apr 17 11:35:00 2018 -0400
RHBZ1566422 - fix spurious Build-id mismatch when probing reinserted kernel module
Code for newer kernels did not clear the address of the notes-section
when a probed module was unloaded. This caused spurious Build-id mismatch
when the module was reinserted as new addresses are not computed for
dynamically loaded modules (see also: PR23068) and the Build-id check
was trying to read the notes section at the no-longer-valid old address.
* runtime/sym.c (_stp_module_notifier): clear addresses on
MODULE_STATE_GOING in newer kernels (>=3.10) too.
* runtime/transport/symbols.c (_stp_kmodule_update_address): fix logic
error and clear notes section addr when reloc=NULL (aka. 'all').
diff --git a/runtime/sym.c b/runtime/sym.c
index c11a35a..b6e0fd6 100644
--- a/runtime/sym.c
+++ b/runtime/sym.c
@@ -1045,7 +1045,7 @@ static void _stp_kmodule_update_address(const char* module,
if (strcmp (_stp_modules[mi]->name, module))
continue;
- if (reloc && !strcmp (note_sectname, reloc)) {
+ if (!reloc || !strcmp (note_sectname, reloc)) {
dbug_sym(1, "module %s special section %s address %#lx\n",
_stp_modules[mi]->name,
note_sectname,
diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c
index 64c2aeb..076c562 100644
--- a/runtime/transport/symbols.c
+++ b/runtime/transport/symbols.c
@@ -167,6 +167,11 @@ static int _stp_module_notifier (struct notifier_block * nb,
/* Verify build-id. */
_stp_kmodule_check (mod->name);
}
+ else if (val == MODULE_STATE_GOING) {
+ /* Unregister all sections. */
+ dbug_sym(2, "unregister sections\n");
+ _stp_kmodule_update_address(mod->name, NULL, 0);
+ }
else if (val != MODULE_STATE_GOING) {
return NOTIFY_DONE;
}

125
rhbz1566745.patch Normal file
View File

@ -0,0 +1,125 @@
commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e
Author: David Smith <dsmith@redhat.com>
Date: Thu Dec 7 16:07:39 2017 -0600
Updated several tapsets for the 4.15 kernel.
* tapset/linux/linuxmib.stp: Update the 'DelayedACKs' probes to handle
a missing '$data' parameter.
* tapset/linux/memory.stp: Handle missing '__GFP_COLD' flag.
* tapset/linux/nfsd.stp: Update the 'nfsd.proc4.rename' probe to handle
upstream changes.
* tapset/linux/signal.stp: Update the 'signal.pending' probe to handle a
missing '$sigsestsize' parameter.
diff --git a/tapset/linux/linuxmib.stp b/tapset/linux/linuxmib.stp
index ef09929..63ec248 100644
--- a/tapset/linux/linuxmib.stp
+++ b/tapset/linux/linuxmib.stp
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2009 IBM Corp.
- * Copyright (C) 2010 Red Hat Inc.
+ * Copyright (C) 2010-2017 Red Hat Inc.
*
* This file is part of systemtap, and is free software. You can
* redistribute it and/or modify it under the terms of the GNU General
@@ -39,14 +39,18 @@ probe _linuxmib.DelayedACKs.A = kernel.function("tcp_send_ack")
probe _linuxmib.DelayedACKs.B = kernel.function("tcp_delack_timer")
{
- sk=$data
+ sk=@choose_defined($data,
+ &@container_of($t, "inet_connection_sock",
+ icsk_delack_timer)->icsk_inet->sk)
indelack_timer[sk]=1
op=0
}
probe _linuxmib.DelayedACKs.C = kernel.function("tcp_delack_timer").return
{
- sk=@entry($data)
+ sk=@entry(@choose_defined($data,
+ &@container_of($t, "inet_connection_sock",
+ icsk_delack_timer)->icsk_inet->sk))
indelack_timer[sk]=0;
op=0
}
diff --git a/tapset/linux/memory.stp b/tapset/linux/memory.stp
index b968fe3..169d0f1 100644
--- a/tapset/linux/memory.stp
+++ b/tapset/linux/memory.stp
@@ -1,7 +1,7 @@
// memory/vm related tapset
// Copyright (C) 2005, 2006 IBM Corp.
// Copyright (C) 2006 Intel Corporation.
-// Copyright (C) 2014 Red Hat Inc.
+// Copyright (C) 2014-2017 Red Hat Inc.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
@@ -368,7 +368,9 @@ probe vm.oom_kill = kernel.function("oom_kill_process") !,
__GFP_BITMASKS(__GFP_HIGH)
__GFP_BITMASKS(__GFP_IO)
__GFP_BITMASKS(__GFP_FS)
+#ifdef __GFP_COLD
__GFP_BITMASKS(__GFP_COLD)
+#endif
__GFP_BITMASKS(__GFP_NOWARN)
#ifdef __GFP_RETRY_MAYFAIL
__GFP_BITMASKS(__GFP_RETRY_MAYFAIL)
diff --git a/tapset/linux/nfsd.stp b/tapset/linux/nfsd.stp
index 3df1600..5a70e84 100644
--- a/tapset/linux/nfsd.stp
+++ b/tapset/linux/nfsd.stp
@@ -1262,18 +1262,26 @@ probe nfsd.proc4.rename = kernel.function("nfsd4_rename").call !,
fh = & @nfsd4_compound_state($cstate)->save_fh
tfh = & @nfsd4_compound_state($cstate)->current_fh
- filelen = $rename->rn_snamelen
- filename = kernel_string_n($rename->rn_sname, $rename->rn_snamelen)
- tlen = $rename->rn_tnamelen
- tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen)
+ if (@defined($rename)) {
+ filelen = $rename->rn_snamelen
+ filename = kernel_string_n($rename->rn_sname,
+ $rename->rn_snamelen)
+ tlen = $rename->rn_tnamelen
+ tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen)
+ } else {
+ filelen = $u->rename->rn_snamelen
+ filename = kernel_string_n($u->rename->rn_sname,
+ $u->rename->rn_snamelen)
+ tlen = $u->rename->rn_tnamelen
+ tname = kernel_string_n($u->rename->rn_tname,
+ $u->rename->rn_tnamelen)
+ }
uid = __rqstp_uid($rqstp)
gid = __rqstp_gid($rqstp)
name = "nfsd.proc4.rename"
- argstr = sprintf("%s to %s",
- kernel_string_n($rename->rn_sname, $rename->rn_snamelen),
- kernel_string_n($rename->rn_tname, $rename->rn_tnamelen))
+ argstr = sprintf("%s to %s", filename, tname)
}
probe nfsd.proc4.rename.return =
diff --git a/tapset/linux/signal.stp b/tapset/linux/signal.stp
index 9a94bad..4f9f9f9 100644
--- a/tapset/linux/signal.stp
+++ b/tapset/linux/signal.stp
@@ -613,7 +613,11 @@ probe signal.pending = kernel.function("do_sigpending").call !,
{
name = "pending"
sigset_add=@choose_defined($set, $uset)
- sigset_size=$sigsetsize
+
+ # Note that this isn't 100% correct if $sigsetsize doesn't
+ # exist (in the case of newer do_sigpending() calls). Instead,
+ # we're returning the default size of a sigset_t.
+ sigset_size=@choose_defined($sigsetsize, @cast_sizeof("sigset_t"))
}
/**

View File

@ -1 +1 @@
SHA512 (systemtap-4.3-0.20200211git91ffb97ad335.tar.gz) = 449959f46a89633f57c20cbeb0ded7031587e6df7cf19c30a237bb1886a7235e066c2878023385a7ec83e6045ab31bc8819991574a5840c8080d2ea066974eb5
SHA512 (systemtap-3.2.tar.gz) = 6036ed1b5189fd3fcfdeeaa526a3539ac632d0b687a063b5e3424e8f613bfc2c8d079742b0262b547128e97e30e4beb61898b23761657aee519e61346ac92e94

View File

@ -1,19 +1,19 @@
%{!?with_sqlite: %global with_sqlite 0%{?fedora} >= 17 || 0%{?rhel} >= 7}
# prefer prebuilt docs
%{!?with_docs: %global with_docs 0}
%{!?with_docs: %global with_docs 1}
%{!?with_htmldocs: %global with_htmldocs 0}
%{!?with_monitor: %global with_monitor 1}
# crash is not available
%ifarch ppc ppc64 %{sparc} %{mips}
%ifarch ppc ppc64 %{sparc} aarch64 ppc64le %{mips}
%{!?with_crash: %global with_crash 0}
%else
%{!?with_crash: %global with_crash 1}
%endif
%{!?with_rpm: %global with_rpm 1}
%{!?with_bundled_elfutils: %global with_bundled_elfutils 0}
%{!?elfutils_version: %global elfutils_version 0.142}
%{!?pie_supported: %global pie_supported 1}
%{!?with_boost: %global with_boost 0}
%ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64
%ifarch %{ix86} x86_64 ppc ppc64
%{!?with_dyninst: %global with_dyninst 0%{?fedora} >= 18 || 0%{?rhel} >= 7}
%else
%{!?with_dyninst: %global with_dyninst 0}
@ -33,18 +33,14 @@
%{!?with_openssl: %global with_openssl 0}
%endif
%{!?with_pyparsing: %global with_pyparsing 0%{?fedora} >= 18 || 0%{?rhel} >= 7}
%{!?with_python3: %global with_python3 0%{?fedora} >= 23 || 0%{?rhel} > 7}
%{!?with_python2_probes: %global with_python2_probes (0%{?fedora} <= 28 && 0%{?rhel} <= 7)}
%{!?with_python3_probes: %global with_python3_probes (0%{?fedora} >= 23 || 0%{?rhel} > 7)}
%{!?with_python3: %global with_python3 0%{?fedora} >= 23}
%{!?with_python2_probes: %global with_python2_probes 1}
%{!?with_python3_probes: %global with_python3_probes 0%{?fedora} >= 23}
%{!?with_httpd: %global with_httpd 0}
%{!?with_specific_python: %global with_specific_python 0%{?fedora} >= 31}
# Virt is supported on these arches, even on el7, but it's not in core EL7
%if 0%{?rhel} <= 7
%ifarch ppc64le aarch64
%global with_virthost 0
%endif
%endif
%if 0%{?fedora} >= 18 || 0%{?rhel} >= 6
%define initdir %{_initddir}
@ -70,26 +66,48 @@
%define dracutstap %{_prefix}/share/dracut/modules.d/99stap
%endif
%if 0%{?rhel} == 6 || 0%{?rhel} == 7
%if 0%{?rhel} >= 6
%define dracutbindir /sbin
%else
%define dracutbindir %{_bindir}
%endif
%if 0%{?rhel} == 6
%{!?_rpmmacrodir: %define _rpmmacrodir /etc/rpm/}
%else
%{!?_rpmmacrodir: %define _rpmmacrodir %{_rpmconfigdir}/macros.d}
%endif
# To avoid testsuite/*/*.stp has shebang which doesn't start with '/'
%define __brp_mangle_shebangs_exclude_from .stp$
%undefine __brp_mangle_shebangs
Name: systemtap
Version: 4.3
Release: 0.20200212git91ffb97ad335%{?dist}
Version: 3.2
Release: 11%{?dist}
# for version, see also configure.ac
Patch10: rhbz1504009.patch
Patch11: rhbz1544711.patch
# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1546563
# upstream: https://sourceware.org/bugzilla/show_bug.cgi?id=22551
Patch12: rhbz1546563.patch
# Add a new kernel fallback unwinder.
# upstream: commit 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d
Patch13: unwind-fallback.patch
# And make the kernel DWARF unwinder work with ksalr.
# upstream: commit 17ee540dd61113fe4f557f191db3480db875cca1
Patch14: unwind-ksalr.patch
# Build-id mismatch with (re)inserted/removed kernel module probe
# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1566422
# upstream: db9c9d6e30c6cfd7b85475b5c79ee2cc51201934
Patch15: rhbz1566422.patch
# systemtap depends on removed /bin/env
# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063
# upstream: commit d6492e78bd50e923963e3c7aa235100a208f4775
Patch16: rhbz1549063.patch
# 4.15 kernel updates (__GFP_COLD undeclared)
# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063
# upstream: commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e
Patch17: rhbz1566745.patch
# Packaging abstract:
#
@ -119,18 +137,18 @@ Release: 0.20200212git91ffb97ad335%{?dist}
# intermediary stap-server for --use-server: systemtap-server (-devel unused)
Summary: Programmable system-wide instrumentation system
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Source: %{name}-%{version}-0.20200211git91ffb97ad335.tar.gz
Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz
# Build*
BuildRequires: gcc-c++
BuildRequires: cpio
BuildRequires: gettext-devel
BuildRequires: pkgconfig(nss)
BuildRequires: pkgconfig(avahi-client)
%if %{with_dyninst}
BuildRequires: dyninst-devel >= 10.0
BuildRequires: dyninst-devel >= 8.0
BuildRequires: pkgconfig(libselinux)
%endif
%if %{with_sqlite}
@ -153,7 +171,14 @@ BuildRequires: crash-devel zlib-devel
%if %{with_rpm}
BuildRequires: rpm-devel
%endif
%if %{with_bundled_elfutils}
Source1: elfutils-%{elfutils_version}.tar.gz
Patch1: elfutils-portability.patch
BuildRequires: m4
%global setup_elfutils -a1
%else
BuildRequires: elfutils-devel >= %{elfutils_version}
%endif
%if %{with_docs}
BuildRequires: /usr/bin/latex /usr/bin/dvips /usr/bin/ps2pdf
%if 0%{?fedora} >= 18 || 0%{?rhel} >= 7
@ -185,20 +210,13 @@ BuildRequires: readline-devel
BuildRequires: pkgconfig(ncurses)
%endif
%if %{with_python2_probes}
BuildRequires: python2-devel
%if 0%{?fedora} >= 1
BuildRequires: python2-setuptools
%else
BuildRequires: python-devel
BuildRequires: python-setuptools
%endif
%endif
%if %{with_python3_probes}
BuildRequires: python3-devel
BuildRequires: python3-setuptools
%endif
%if %{with_specific_python}
BuildRequires: /usr/bin/pathfix.py
%endif
%if %{with_httpd}
BuildRequires: libmicrohttpd-devel
@ -219,26 +237,23 @@ the components needed to locally develop and execute systemtap scripts.
%package server
Summary: Instrumentation System Server
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-devel = %{version}-%{release}
Conflicts: systemtap-devel < %{version}-%{release}
Conflicts: systemtap-runtime < %{version}-%{release}
Conflicts: systemtap-client < %{version}-%{release}
Requires: nss coreutils
Requires: zip unzip
Requires(pre): shadow-utils
Requires(post): chkconfig
Requires(preun): chkconfig
Requires(preun): initscripts
Requires(postun): initscripts
BuildRequires: nss-devel avahi-devel
%if %{with_openssl}
Requires: openssl
%endif
%if %{with_systemd}
Requires: systemd
%else
Requires(post): chkconfig
Requires(preun): chkconfig
Requires(preun): initscripts
Requires(postun): initscripts
%endif
%description server
@ -249,20 +264,15 @@ compiles systemtap scripts to kernel objects on their demand.
%package devel
Summary: Programmable system-wide instrumentation system - development headers, tools
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20
Recommends: (kernel-debug-devel if kernel-debug)
Recommends: (kernel-devel if kernel)
%else
# The virtual provide 'kernel-devel-uname-r' tries to get the right
# kernel variant (kernel-PAE, kernel-debug, etc.) devel package
# installed.
Requires: kernel-devel-uname-r
%endif
%{?fedora:Suggests: kernel-devel}
Requires: gcc make
Conflicts: systemtap-client < %{version}-%{release}
Conflicts: systemtap-server < %{version}-%{release}
Conflicts: systemtap-runtime < %{version}-%{release}
# Suggest: kernel-debuginfo
%description devel
@ -276,12 +286,10 @@ a copy of the standard tapset library and the runtime library C files.
%package runtime
Summary: Programmable system-wide instrumentation system - runtime
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires(pre): shadow-utils
Conflicts: systemtap-devel < %{version}-%{release}
Conflicts: systemtap-server < %{version}-%{release}
Conflicts: systemtap-client < %{version}-%{release}
%description runtime
SystemTap runtime contains the components needed to execute
@ -291,15 +299,13 @@ using a local or remote systemtap-devel installation.
%package client
Summary: Programmable system-wide instrumentation system - client
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: zip unzip
Requires: systemtap-runtime = %{version}-%{release}
Requires: coreutils grep sed unzip zip
Requires: openssh-clients
Conflicts: systemtap-devel < %{version}-%{release}
Conflicts: systemtap-server < %{version}-%{release}
Conflicts: systemtap-runtime < %{version}-%{release}
%if %{with_mokutil}
Requires: mokutil
%endif
@ -314,17 +320,14 @@ documentation, and a copy of the tapset library for reference.
%package initscript
Summary: Systemtap Initscripts
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap = %{version}-%{release}
%if %{with_systemd}
Requires: systemd
%else
Requires(post): chkconfig
Requires(preun): chkconfig
Requires(preun): initscripts
Requires(postun): initscripts
%endif
%description initscript
This package includes a SysVinit script to launch selected systemtap
@ -334,17 +337,14 @@ boot-time probing if supported.
%package sdt-devel
Summary: Static probe support tools
Group: Development/System
License: GPLv2+ and Public Domain
URL: http://sourceware.org/systemtap/
%if %{with_pyparsing}
%if %{with_python3}
Requires: python3-pyparsing
%else
%if 0%{?rhel} >= 7
Requires: pyparsing
%else
Requires: python2-pyparsing
%endif
%endif
%endif
@ -357,6 +357,7 @@ with the optional dtrace-compatibility preprocessor to process related
%package testsuite
Summary: Instrumentation System Testsuite
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap = %{version}-%{release}
@ -414,21 +415,23 @@ systemtap on the current system.
%if %{with_java}
%package runtime-java
Summary: Systemtap Java Runtime Support
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-runtime = %{version}-%{release}
Requires: byteman > 2.0
Requires: iproute
Requires: java-devel
Requires: net-tools
%description runtime-java
This package includes support files needed to run systemtap scripts
that probe Java processes running on the OpenJDK runtimes using Byteman.
that probe Java processes running on the OpenJDK 1.6 and OpenJDK 1.7
runtimes using Byteman.
%endif
%if %{with_python2_probes}
%package runtime-python2
Summary: Systemtap Python 2 Runtime Support
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-runtime = %{version}-%{release}
@ -441,36 +444,20 @@ that probe python 2 processes.
%if %{with_python3_probes}
%package runtime-python3
Summary: Systemtap Python 3 Runtime Support
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-runtime = %{version}-%{release}
%if ! (%{with_python2_probes})
# Provide an clean upgrade path when the python2 package is removed
Obsoletes: %{name}-runtime-python2 < %{version}-%{release}
%endif
%description runtime-python3
This package includes support files needed to run systemtap scripts
that probe python 3 processes.
%endif
%if %{with_python3}
%package exporter
Summary: Systemtap-prometheus interoperation mechanism
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-runtime = %{version}-%{release}
%description exporter
This package includes files for a systemd service that manages
systemtap sessions and relays prometheus metrics from the sessions
to remote requesters on demand.
%endif
%if %{with_virthost}
%package runtime-virthost
Summary: Systemtap Cross-VM Instrumentation - host
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: libvirt >= 1.0.2
@ -485,6 +472,7 @@ connection.
%if %{with_virtguest}
%package runtime-virtguest
Summary: Systemtap Cross-VM Instrumentation - guest
Group: Development/System
License: GPLv2+
URL: http://sourceware.org/systemtap/
Requires: systemtap-runtime = %{version}-%{release}
@ -506,10 +494,44 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
# ------------------------------------------------------------------------
%prep
%setup -q
%setup -q %{?setup_elfutils}
%if %{with_bundled_elfutils}
cd elfutils-%{elfutils_version}
%patch1 -p1
sleep 1
find . \( -name Makefile.in -o -name aclocal.m4 \) -print | xargs touch
sleep 1
find . \( -name configure -o -name config.h.in \) -print | xargs touch
cd ..
%endif
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%build
%if %{with_bundled_elfutils}
# Build our own copy of elfutils.
%global elfutils_config --with-elfutils=elfutils-%{elfutils_version}
# We have to prevent the standard dependency generation from identifying
# our private elfutils libraries in our provides and requires.
%global _use_internal_dependency_generator 0
%global filter_eulibs() /bin/sh -c "%{1} | sed '/libelf/d;/libdw/d;/libebl/d'"
%global __find_provides %{filter_eulibs /usr/lib/rpm/find-provides}
%global __find_requires %{filter_eulibs /usr/lib/rpm/find-requires}
# This will be needed for running stap when not installed, for the test suite.
%global elfutils_mflags LD_LIBRARY_PATH=`pwd`/lib-elfutils
%endif
# Enable/disable the dyninst pure-userspace backend
%if %{with_dyninst}
%global dyninst_config --with-dyninst
@ -545,7 +567,7 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
%global docs_config --enable-docs --disable-htmldocs
%endif
%else
%global docs_config --enable-docs=prebuilt
%global docs_config --disable-docs
%endif
# Enable pie as configure defaults to disabling it
@ -596,20 +618,18 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
%global httpd_config --disable-httpd
%endif
%if %{with_bpf}
%global bpf_config --with-bpf
%else
%global bpf_config --without-bpf
%endif
# We don't ship compileworthy python code, just oddball samples
%global py_auto_byte_compile 0
%configure %{dyninst_config} %{sqlite_config} %{crash_config} %{docs_config} %{pie_config} %{rpm_config} %{java_config} %{virt_config} %{dracut_config} %{python3_config} %{python2_probes_config} %{python3_probes_config} %{httpd_config} %{bpf_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}"
%configure %{?elfutils_config} %{dyninst_config} %{sqlite_config} %{crash_config} %{docs_config} %{pie_config} %{rpm_config} %{java_config} %{virt_config} %{dracut_config} %{python3_config} %{python2_probes_config} %{python3_probes_config} %{httpd_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}"
make %{?_smp_mflags}
%if %{with_emacsvim}
%{_emacs_bytecompile} emacs/systemtap-mode.el
%endif
%install
rm -rf ${RPM_BUILD_ROOT}
make DESTDIR=$RPM_BUILD_ROOT install
%find_lang %{name}
for dir in $(ls -1d $RPM_BUILD_ROOT%{_mandir}/{??,??_??}) ; do
@ -638,21 +658,19 @@ install -c -m 755 stap-prep $RPM_BUILD_ROOT%{_bindir}/stap-prep
# Copy over the testsuite
cp -rp testsuite $RPM_BUILD_ROOT%{_datadir}/systemtap
%if %{with_docs}
# We want the manuals in the special doc dir, not the generic doc install dir.
# We build it in place and then move it away so it doesn't get installed
# twice. rpm can specify itself where the (versioned) docs go with the
# %doc directive.
mkdir docs.installed
mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/*.pdf docs.installed/
%if %{with_docs}
%if %{with_htmldocs}
mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/tapsets docs.installed/
mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/SystemTap_Beginners_Guide docs.installed/
%endif
%endif
install -D -m 644 macros.systemtap $RPM_BUILD_ROOT%{_rpmmacrodir}/macros.systemtap
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/stap-server
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server/.systemtap
@ -662,27 +680,12 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/systemtap
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/systemtap
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
install -m 644 initscript/logrotate.stap-server $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/stap-server
# If using systemd systemtap.service file, retain the old init script in %{_libexecdir} as a helper.
%if %{with_systemd}
mkdir -p $RPM_BUILD_ROOT%{_unitdir}
touch $RPM_BUILD_ROOT%{_unitdir}/systemtap.service
install -m 644 initscript/systemtap.service $RPM_BUILD_ROOT%{_unitdir}/systemtap.service
mkdir -p $RPM_BUILD_ROOT%{_sbindir}
install -m 755 initscript/systemtap $RPM_BUILD_ROOT%{_sbindir}/systemtap-service
%else
mkdir -p $RPM_BUILD_ROOT%{initdir}
install -m 755 initscript/systemtap $RPM_BUILD_ROOT%{initdir}
mkdir -p $RPM_BUILD_ROOT%{_sbindir}
ln -sf %{initdir}/systemtap $RPM_BUILD_ROOT%{_sbindir}/systemtap-service
# TODO CHECK CORRECTNESS: symlink %{_sbindir}/systemtap-service to %{initdir}/systemtap
%endif
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/conf.d
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/script.d
install -m 644 initscript/config.systemtap $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/config
%if %{with_systemd}
mkdir -p $RPM_BUILD_ROOT%{_unitdir}
touch $RPM_BUILD_ROOT%{_unitdir}/stap-server.service
@ -735,32 +738,18 @@ done
touch $RPM_BUILD_ROOT%{dracutstap}/params.conf
%endif
%if %{with_specific_python}
# Some files got ambiguous python shebangs, we fix them after everything else is done
pathfix.py -pni "%{__python3} %{py3_shbang_opts}" %{buildroot}%{python3_sitearch} %{buildroot}%{_bindir}/*
%endif
%pre runtime
getent group stapusr >/dev/null || groupadd -f -g 156 -r stapusr
getent group stapsys >/dev/null || groupadd -f -g 157 -r stapsys
getent group stapdev >/dev/null || groupadd -f -g 158 -r stapdev
getent group stapusr >/dev/null || groupadd -g 156 -r stapusr 2>/dev/null || groupadd -r stapusr
getent group stapsys >/dev/null || groupadd -g 157 -r stapsys 2>/dev/null || groupadd -r stapsys
getent group stapdev >/dev/null || groupadd -g 158 -r stapdev 2>/dev/null || groupadd -r stapdev
exit 0
%pre server
getent group stap-server >/dev/null || groupadd -f -g 155 -r stap-server
getent group stap-server >/dev/null || groupadd -g 155 -r stap-server 2>/dev/null || groupadd -r stap-server
getent passwd stap-server >/dev/null || \
useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \
useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server
%pre testsuite
getent passwd stapusr >/dev/null || \
useradd -c "Systemtap 'stapusr' User" -g stapusr -r -s /sbin/nologin stapusr
getent passwd stapsys >/dev/null || \
useradd -c "Systemtap 'stapsys' User" -g stapsys -G stapusr -r -s /sbin/nologin stapsys
getent passwd stapdev >/dev/null || \
useradd -c "Systemtap 'stapdev' User" -g stapdev -G stapusr -r -s /sbin/nologin stapdev
exit 0
%post server
# We have some duplication between the %files listings for the
@ -915,24 +904,6 @@ if [ "$1" -ge "1" ]; then
fi
exit 0
%if %{with_python3}
%if %{with_systemd}
%preun exporter
if [ $1 = 0 ] ; then
/bin/systemctl stop stap-exporter.service >/dev/null 2>&1 || :
/bin/systemctl disable stap-exporter.service >/dev/null 2>&1 || :
fi
exit 0
%postun exporter
# Restart service if this is an upgrade rather than an uninstall
if [ "$1" -ge "1" ]; then
/bin/systemctl condrestart stap-exporter >/dev/null 2>&1 || :
fi
exit 0
%endif
%endif
%post
# Remove any previously-built uprobes.ko materials
(make -C %{_datadir}/systemtap/runtime/uprobes clean) >/dev/null 2>&1 || true
@ -997,10 +968,11 @@ done
# ------------------------------------------------------------------------
%files
%files -f systemtap.lang
# The master "systemtap" rpm doesn't include any files.
%files server -f systemtap.lang
%defattr(-,root,root)
%{_bindir}/stap-server
%dir %{_libexecdir}/systemtap
%{_libexecdir}/systemtap/stap-serverd
@ -1054,6 +1026,10 @@ done
%dir %{_libexecdir}/systemtap
%{_libexecdir}/systemtap/libHelperSDT_*.so
%endif
%if %{with_bundled_elfutils}
%dir %{_libdir}/systemtap
%{_libdir}/systemtap/lib*.so*
%endif
%if %{with_emacsvim}
%{_emacs_sitelispdir}/*.el*
%{_emacs_sitestartdir}/systemtap-init.el
@ -1069,6 +1045,7 @@ done
%files runtime -f systemtap.lang
%defattr(-,root,root)
%attr(4110,root,stapusr) %{_bindir}/staprun
%{_bindir}/stapsh
%{_bindir}/stap-merge
@ -1104,12 +1081,13 @@ done
%files client -f systemtap.lang
%defattr(-,root,root)
%doc README README.unprivileged AUTHORS NEWS
%{_datadir}/systemtap/examples
%{!?_licensedir:%global license %%doc}
%license COPYING
%doc docs.installed/*.pdf
%if %{with_docs}
%doc docs.installed/*.pdf
%if %{with_htmldocs}
%doc docs.installed/tapsets/*.html
%doc docs.installed/SystemTap_Beginners_Guide
@ -1133,20 +1111,15 @@ done
%files initscript
%if %{with_systemd}
%{_unitdir}/systemtap.service
%{_sbindir}/systemtap-service
%else
%defattr(-,root,root)
%{initdir}/systemtap
%{_sbindir}/systemtap-service
%endif
%dir %{_sysconfdir}/systemtap
%dir %{_sysconfdir}/systemtap/conf.d
%dir %{_sysconfdir}/systemtap/script.d
%config(noreplace) %{_sysconfdir}/systemtap/config
%dir %{_localstatedir}/cache/systemtap
%ghost %{_localstatedir}/run/systemtap
%{_mandir}/man8/systemtap-service.8*
%{_mandir}/man8/systemtap.8*
%if %{with_dracut}
%dir %{dracutstap}
%{dracutstap}/*
@ -1154,17 +1127,18 @@ done
%files sdt-devel
%defattr(-,root,root)
%{_bindir}/dtrace
%{_includedir}/sys/sdt.h
%{_includedir}/sys/sdt-config.h
%{_mandir}/man1/dtrace.1*
%{_rpmmacrodir}/macros.systemtap
%doc README AUTHORS NEWS
%{!?_licensedir:%global license %%doc}
%license COPYING
%files testsuite
%defattr(-,root,root)
%dir %{_datadir}/systemtap
%{_datadir}/systemtap/testsuite
@ -1208,15 +1182,6 @@ done
%endif
%endif
%if %{with_python3}
%files exporter
%{_sysconfdir}/stap-exporter
%{_sysconfdir}/sysconfig/stap-exporter
%{_unitdir}/stap-exporter.service
%{_mandir}/man8/stap-exporter.8*
%{_sbindir}/stap-exporter
%endif
# ------------------------------------------------------------------------
# Future new-release entries should be of the form
@ -1226,35 +1191,38 @@ done
# PRERELEASE
%changelog
* Tue Apr 21 2020 Björn Esser <besser82@fedoraproject.org> - 4.3-0.20200212git91ffb97ad335
- Rebuild (json-c)
* Thu Apr 19 2018 Mark Wielaard <mjw@fedoraproject.org> - 3.2-11
- Add rhbz1549063.patch (/bin/env -> /usr/bin/env)
- Add rhbz1566745.patch (4.15 kernel tapset updates)
- Enable accidentially disabled Suggests: kernel-devel again.
* Tue Feb 11 2020 Frank Ch. Eigler <fche@redhat.com> - 4.3-0.20200211git91ffb97ad335
- Automated weekly rawhide release
- Applied spec changes from upstream git
* Wed Apr 18 2018 Mark Wielaard <mjw@fedoraproject.org> - 3.2-10
- Add unwind-fallback.patch
- rhbz1566422.patch
* Mon Feb 03 2020 Frank Ch. Eigler <fche@redhat.com> - 4.3-0.20200203git6c0b74f5910a
- Automated weekly rawhide release
- Applied spec changes from upstream git
* Tue Apr 17 2018 Mark Wielaard <mjw@fedoraproject.org> - 3.2-9
- Add unwind-fallback.patch.
* Fri Jan 31 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.3-0.20200113gitb1e6a6645bba
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Tue Mar 27 2018 Björn Esser <besser82@fedoraproject.org> - 3.2-8
- Rebuilt for libjson-c.so.4 (json-c v0.13.1) on fc28
* Sun Jan 12 2020 Frank Ch. Eigler <fche@redhat.com> - 4.3-0.20200112gitb1e6a6645bba
- Automated weekly rawhide release
- Applied spec changes from upstream git
* Thu Feb 22 2018 Sergey Avseyev <sergey.avseyev@gmail.com> - 3.2-7
- rhbz1546563 (backport fix for removed timers in kernel 4.15)
* Mon Nov 18 2019 Sagar Patel <sapatel@redhat.com> - 4.2-1
- Upstream release.
* Tue Feb 13 2018 Stan Cox <scox@redhat.com> - 3.2-6
- rebuilt
* Tue May 07 2019 Serguei Makarov <smakarov@redhat.com> - 4.1-1
- Upstream release.
* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 3.2-5
- Escape macros in %%changelog
* Sat Oct 13 2018 Frank Ch. Eigler <fche@redhat.com> - 4.0-1
- Upstream release.
* Wed Feb 07 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 3.2-4
- Fix very old Requires
* Thu Jun 07 2018 Frank Ch. Eigler <fche@redhat.com> - 3.3-1
- Upstream release.
* Sun Dec 10 2017 Björn Esser <besser82@fedoraproject.org> - 3.2-3
- Rebuilt for libjson-c.so.3
* Fri Oct 20 2017 Frank Ch. Eigler <fche@redhat.com> - 3.2-2
- rhbz1504009 (dtrace -G -o /dev/null)
* Wed Oct 18 2017 Frank Ch. Eigler <fche@redhat.com> - 3.2-1
- Upstream release.

View File

@ -1,38 +0,0 @@
TOPLEVEL_NAMESPACE=fedora
PACKAGE_NAME=systemtap
RELATIVE_PATH=Sanity/dejagnu-smoketest
export TESTVERSION=1.0
export TEST=/$(TOPLEVEL_NAMESPACE)/$(PACKAGE_NAME)/$(RELATIVE_PATH)
.PHONY: all install download clean
BUILT_FILES=
FILES=$(METADATA) runtest.sh Makefile PURPOSE
run: $(FILES) build
./runtest.sh
build: $(BUILT_FILES)
chmod a+x ./runtest.sh
clean:
rm -f *~ *.rpm $(BUILT_FILES)
include /usr/share/rhts/lib/rhts-make.include
# Generate the testinfo.desc here:
$(METADATA): Makefile
@touch $(METADATA)
# Change to the test owner's name
@echo "Owner: Frank Ch. Eigler <fche@redhat.com>" > $(METADATA)
@echo "Name: $(TEST)" >> $(METADATA)
@echo "Path: $(TEST_DIR)" >> $(METADATA)
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
@echo "Type: Sanity" >> $(METADATA)
@echo "Description: smoke test" >> $(METADATA)
@echo "TestTime: 10m" >> $(METADATA)
@echo "RunFor: $(PACKAGE_NAME)" >> $(METADATA)
@echo "Requires: $(PACKAGE_NAME)" >> $(METADATA)
@echo "License: GPLv2" >> $(METADATA)
# You may need other fields here; see the documentation
rhts-lint $(METADATA)

View File

@ -1,3 +0,0 @@
Test Name: dejagnu-smoketest
Author:
Short Description: Run a minimal systemtap testsuite

View File

@ -1,17 +0,0 @@
#!/bin/sh
set -e
set -x
dnf debuginfo-install -y kernel
# on Fedora CI, can only assume about 1GB RAM to run these tests
stap -L 'process("stap").mark("*")' | grep pass
# stap -L 'kernel.trace("sys_enter")'
stap -v --example helloworld.stp
stap -v -T 10 -p4 -e 'probe kernel.function("do_exit") {println($$vars)}'
# stap -v -T 10 -e 'probe syscall.* ? {println(argstr)}'
echo
echo RESULT: PASS

View File

@ -1,11 +0,0 @@
---
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- classic
tests:
- dejagnu-smoketest
required_packages:
- systemtap-testsuite
- kernel-devel

249
unwind-fallback.patch Normal file
View File

@ -0,0 +1,249 @@
From 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Tue, 17 Apr 2018 14:36:13 +0200
Subject: [PATCH] linux runtime: Add support for new kernel unwind fallback.
In newer kernels dump_trace got replaced by a new unwind infrastructure.
Add a new autoconf-unwind-stack-trace.c to detect whether we can use it.
Extend the runtime/stack.c _stp_stack_print_fallback with a new pt_regs*
argument. Update all callers and add dbug_unwind output to show which
fallback unwinder we are selecting (or if we are just giving up).
Rename the struct unwind_state in unwind.c and unwind.h to uw_state
because the old name now conflicts with the one used in the kernel.
---
buildrun.cxx | 2 ++
runtime/linux/autoconf-unwind-stack-trace.c | 16 +++++++++
runtime/stack.c | 50 ++++++++++++++++++++++++++---
runtime/unwind.c | 14 ++++----
runtime/unwind/unwind.h | 4 +--
5 files changed, 72 insertions(+), 14 deletions(-)
create mode 100644 runtime/linux/autoconf-unwind-stack-trace.c
diff --git a/buildrun.cxx b/buildrun.cxx
index 403fa71..59b9e88 100644
--- a/buildrun.cxx
+++ b/buildrun.cxx
@@ -365,6 +365,8 @@ compile_pass (systemtap_session& s)
"STAPCONF_KERNEL_STACKTRACE", NULL);
output_autoconf(s, o, "autoconf-save-stack-trace-no-bp.c",
"STAPCONF_KERNEL_STACKTRACE_NO_BP", NULL);
+ output_autoconf(s, o, "autoconf-unwind-stack-trace.c",
+ "STAPCONF_KERNEL_UNWIND_STACK", NULL);
output_autoconf(s, o, "autoconf-asm-syscall.c",
"STAPCONF_ASM_SYSCALL_H", NULL);
output_autoconf(s, o, "autoconf-ring_buffer-flags.c", "STAPCONF_RING_BUFFER_FLAGS", NULL);
diff --git a/runtime/linux/autoconf-unwind-stack-trace.c b/runtime/linux/autoconf-unwind-stack-trace.c
new file mode 100644
index 0000000..2ec399e
--- /dev/null
+++ b/runtime/linux/autoconf-unwind-stack-trace.c
@@ -0,0 +1,16 @@
+#include <linux/sched.h>
+#include <asm/unwind.h>
+
+void unwind_stack_trace (void)
+{
+ struct unwind_state state;
+ unwind_start (&state, current, 0, 0);
+ while (! unwind_done (&state))
+ {
+ unsigned long addr = unwind_get_return_address (&state);
+ if (addr == 0)
+ break;
+ unwind_next_frame (&state);
+ }
+}
+
diff --git a/runtime/stack.c b/runtime/stack.c
index c9d2c0c..43f98ef 100644
--- a/runtime/stack.c
+++ b/runtime/stack.c
@@ -43,7 +43,11 @@
#include <asm/stacktrace.h>
#endif
-static void _stp_stack_print_fallback(unsigned long, int, int, int);
+#if defined(STAPCONF_KERNEL_UNWIND_STACK)
+#include <asm/unwind.h>
+#endif
+
+static void _stp_stack_print_fallback(unsigned long, struct pt_regs*, int, int, int);
#ifdef STP_USE_DWARF_UNWINDER
#ifdef STAPCONF_LINUX_UACCESS_H
@@ -128,7 +132,7 @@ static const struct stacktrace_ops print_stack_ops = {
};
/* Used for kernel backtrace printing when other mechanisms fail. */
-static void _stp_stack_print_fallback(unsigned long stack,
+static void _stp_stack_print_fallback(unsigned long stack, struct pt_regs *regs,
int sym_flags, int levels, int skip)
{
struct print_stack_data print_data;
@@ -136,20 +140,55 @@ static void _stp_stack_print_fallback(unsigned long stack,
print_data.levels = levels;
print_data.skip = skip;
#if defined(STAPCONF_KERNEL_STACKTRACE)
+ dbug_unwind(1, "fallback kernel stacktrace\n");
dump_trace(current, NULL, (long *)stack, 0, &print_stack_ops,
&print_data);
#else
/* STAPCONF_KERNEL_STACKTRACE_NO_BP */
+ dbug_unwind(1, "fallback kernel stacktrace (no bp)\n");
dump_trace(current, NULL, (long *)stack, &print_stack_ops,
&print_data);
#endif
}
#else
-static void _stp_stack_print_fallback(unsigned long s, int v, int l, int k) {
+#if defined(STAPCONF_KERNEL_UNWIND_STACK)
+static void _stp_stack_print_fallback(unsigned long sp, struct pt_regs *regs,
+ int sym_flags,
+ int levels, int skip) {
+ struct unwind_state state;
+ unwind_start (&state, current, regs, (unsigned long *) sp);
+ dbug_unwind(1, "fallback kernel stacktrace (unwind)\n");
+ while (levels > 0 && ! unwind_done (&state))
+ {
+ if (skip == 0)
+ {
+ unsigned long addr = unwind_get_return_address (&state);
+ /* When we have frame pointers, the unwind addresses can be
+ (mostly) trusted, otherwise it is all guesswork. */
+#ifdef CONFIG_FRAME_POINTER
+ _stp_print_addr(addr, sym_flags, NULL);
+#else
+ _stp_print_addr(addr, sym_flags | _STP_SYM_INEXACT, NULL);
+#endif
+ if (addr == 0)
+ break;
+ levels--;
+ }
+ else
+ {
+ dbug_unwind(1, "skipping frame\n");
+ skip--;
+ }
+ unwind_next_frame(&state);
+ }
+}
+#else /* no new unwind */
+static void _stp_stack_print_fallback(unsigned long s, struct pt_regs *r, int v, int l, int k) {
/* Don't guess, just give up. */
+ dbug_unwind(1, "no fallback kernel stacktrace (giving up)\n");
_stp_print_addr(0, v | _STP_SYM_INEXACT, NULL);
}
-
+#endif /* new unwind */
#endif /* defined(STAPCONF_KERNEL_STACKTRACE) || defined(STAPCONF_KERNEL_STACKTRACE_NO_BP) */
@@ -382,6 +421,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags)
if (l == 0) {
remaining = MAXBACKTRACE - n;
_stp_stack_print_fallback(UNW_SP(&c->uwcontext_kernel.info),
+ &c->uwcontext_kernel.info.regs,
sym_flags, remaining, 0);
break;
} else {
@@ -408,7 +448,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags)
sp = 0;
skip = 5; /* yes, that many framework frames. */
#endif
- _stp_stack_print_fallback(sp, sym_flags,
+ _stp_stack_print_fallback(sp, NULL, sym_flags,
MAXBACKTRACE, skip);
#else
if (sym_flags & _STP_SYM_SYMBOL)
diff --git a/runtime/unwind.c b/runtime/unwind.c
index ec7cd58..3a2d991 100644
--- a/runtime/unwind.c
+++ b/runtime/unwind.c
@@ -235,7 +235,7 @@ static int parse_fde_cie(const u32 *fde, const u32 *cie,
#define REG_STATE state->reg[state->stackDepth]
-static int advance_loc(unsigned long delta, struct unwind_state *state)
+static int advance_loc(unsigned long delta, struct uw_state *state)
{
state->loc += delta * state->codeAlign;
dbug_unwind(1, "state->loc=%lx\n", state->loc);
@@ -244,7 +244,7 @@ static int advance_loc(unsigned long delta, struct unwind_state *state)
/* Set Same or Nowhere rule for register. */
static void set_no_state_rule(uleb128_t reg, enum item_location where,
- struct unwind_state *state)
+ struct uw_state *state)
{
dbug_unwind(1, "reg=%lx, where=%d\n", reg, where);
if (reg < ARRAY_SIZE(REG_STATE.regs)) {
@@ -254,7 +254,7 @@ static void set_no_state_rule(uleb128_t reg, enum item_location where,
/* Memory or Value rule */
static void set_offset_rule(uleb128_t reg, enum item_location where,
- sleb128_t svalue, struct unwind_state *state)
+ sleb128_t svalue, struct uw_state *state)
{
dbug_unwind(1, "reg=%lx, where=%d, svalue=%lx\n", reg, where, svalue);
if (reg < ARRAY_SIZE(REG_STATE.regs)) {
@@ -265,7 +265,7 @@ static void set_offset_rule(uleb128_t reg, enum item_location where,
/* Register rule. */
static void set_register_rule(uleb128_t reg, uleb128_t value,
- struct unwind_state *state)
+ struct uw_state *state)
{
dbug_unwind(1, "reg=%lx, value=%lx\n", reg, value);
if (reg < ARRAY_SIZE(REG_STATE.regs)) {
@@ -277,7 +277,7 @@ static void set_register_rule(uleb128_t reg, uleb128_t value,
/* Expr or ValExpr rule. */
static void set_expr_rule(uleb128_t reg, enum item_location where,
const u8 **expr, const u8 *end,
- struct unwind_state *state)
+ struct uw_state *state)
{
const u8 *const start = *expr;
uleb128_t len = get_uleb128(expr, end);
@@ -296,7 +296,7 @@ static void set_expr_rule(uleb128_t reg, enum item_location where,
#define MAX_CFI 512
static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc,
- signed ptrType, int user, struct unwind_state *state, int compat_task)
+ signed ptrType, int user, struct uw_state *state, int compat_task)
{
union {
const u8 *p8;
@@ -1169,7 +1169,7 @@ static int unwind_frame(struct unwind_context *context,
unsigned i;
signed ptrType = -1, call_frame = 1;
uleb128_t retAddrReg = 0;
- struct unwind_state *state = &context->state;
+ struct uw_state *state = &context->state;
unsigned long addr;
if (unlikely(table_len == 0)) {
diff --git a/runtime/unwind/unwind.h b/runtime/unwind/unwind.h
index 9d66732..b3ff786 100644
--- a/runtime/unwind/unwind.h
+++ b/runtime/unwind/unwind.h
@@ -492,7 +492,7 @@ struct unwind_reg_state {
unsigned cfa_is_expr:1;
};
-struct unwind_state {
+struct uw_state {
uleb128_t loc;
uleb128_t codeAlign;
sleb128_t dataAlign;
@@ -503,7 +503,7 @@ struct unwind_state {
struct unwind_context {
struct unwind_frame_info info;
- struct unwind_state state;
+ struct uw_state state;
};
static const struct cfa badCFA = { ARRAY_SIZE(reg_info), 1 };
--
1.8.3.1

32
unwind-ksalr.patch Normal file
View File

@ -0,0 +1,32 @@
commit 17ee540dd61113fe4f557f191db3480db875cca1
Author: Mark Wielaard <mark@klomp.org>
Date: Wed Apr 18 15:00:24 2018 +0200
Make kernel DWARF unwinder work with ksalr.
The .debug_frame loaded from disk is already relocated against the
expected load offset of the kernel, but the actual static (load)
address might be different (with kaslr). So adjust the startLoc
for that difference when reading any address from the unwind table.
diff --git a/runtime/unwind.c b/runtime/unwind.c
index 3a2d991..4c360d2 100644
--- a/runtime/unwind.c
+++ b/runtime/unwind.c
@@ -724,10 +724,15 @@ adjustStartLoc (unsigned long startLoc,
dbug_unwind(2, "adjustStartLoc=%lx, ptrType=%s, m=%s, s=%s eh=%d\n",
startLoc, _stp_eh_enc_name(ptrType), m->path, s->name, is_ehframe);
if (startLoc == 0
- || strcmp (m->name, "kernel") == 0
|| (strcmp (s->name, ".absolute") == 0 && !is_ehframe))
return startLoc;
+ /* The .debug_frame loaded from disk is already relocated against the
+ expected load offset of the kernel, but the actual static (load)
+ address might be different (with kaslr). */
+ if (strcmp (m->name, "kernel") == 0)
+ return startLoc - s->sec_load_offset + s->static_addr;
+
/* eh_frame data has been loaded in the kernel, so readjust offset. */
if (is_ehframe) {
dbug_unwind(2, "eh_frame=%lx, eh_frame_addr=%lx\n", (unsigned long) m->eh_frame, m->eh_frame_addr);