import systemtap-4.3-4.el8

This commit is contained in:
CentOS Sources 2020-11-03 07:11:16 -05:00 committed by Andrew Lukoshko
parent 92b503b22e
commit 21211692a7
9 changed files with 2539 additions and 215 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/systemtap-4.2.tar.gz
SOURCES/systemtap-4.3.tar.gz

View File

@ -1 +1 @@
efdb0d6e09ebdfa2acbfdb725542885db2195bb6 SOURCES/systemtap-4.2.tar.gz
14769266f6591b85895a5f40e516f8228e83476e SOURCES/systemtap-4.3.tar.gz

View File

@ -1,65 +0,0 @@
commit ab4a060a82d0eb68189590ff3f48e8eb5617b6ae
Author: Frank Ch. Eigler <fche@redhat.com>
Date: Thu Jan 9 11:43:59 2020 -0500
RHBZ1788648: parse arm64 sys/sdt.h operand format [x?, x?]
On arm64, the sys/sdt.h operand [x0, x1] was observed, and not
handled. New code in
sdt_uprobe_var_expanding_visitor::try_parse_arg_register_pair
recognizes that and parses it indirectly via
sdt_uprobe_var_expanding_visitor::try_parse_arg_effective_addr .
diff --git a/tapsets.cxx b/tapsets.cxx
index 68ec74b..aab7c83 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -6949,17 +6949,30 @@ sdt_uprobe_var_expanding_visitor::try_parse_arg_register_pair (target_symbol *e,
const string& asmarg,
long precision)
{
+
// BZ1613157: for powerpc, accept "R,R", as an alias of "(Ra,Rb)"
- if (sess.architecture.substr(0,7) != "powerpc")
- return NULL;
-
- // test for BASE_REGISTER,INDEX_REGISTER
- string regexp = "^(" + regnames + "),(" + regnames + ")$";
- vector<string> matches;
- if (!regexp_match(asmarg, regexp, matches))
+ if (sess.architecture.substr(0,7) == "powerpc")
+ {
+ // test for BASE_REGISTER,INDEX_REGISTER
+ string regexp = "^(" + regnames + "),(" + regnames + ")$";
+ vector<string> matches;
+ if (!regexp_match(asmarg, regexp, matches))
+ {
+ // delegate to parenthetic syntax
+ return try_parse_arg_effective_addr (e, string("(")+asmarg+string(")"), precision);
+ }
+ }
+ else if (elf_machine == EM_AARCH64) // BZ1788648
{
- // delegate to parenthetic syntax
- return try_parse_arg_effective_addr (e, string("(")+asmarg+string(")"), precision);
+ // test for [BASE_REGISTER, INDEX_REGISTER]
+ string regexp = "^\\[(" + regnames + "), (" + regnames + ")\\]$";
+ vector<string> matches;
+ if (!regexp_match(asmarg, regexp, matches))
+ {
+ // delegate to parenthetic syntax
+ string regnames = asmarg.substr(1, asmarg.length()-2); // trim the []
+ return try_parse_arg_effective_addr (e, string("(")+regnames+string(")"), precision); // add the ()
+ }
}
return NULL;
@@ -6975,7 +6988,7 @@ sdt_uprobe_var_expanding_visitor::try_parse_arg_effective_addr (target_symbol *e
// test for OFFSET(BASE_REGISTER,INDEX_REGISTER[,SCALE]) where OFFSET is +-N+-N+-N
// NB: Despite PR11821, we can use regnames here, since the parentheses
// make things unambiguous. (Note: gdb/stap-probe.c also parses this)
- string regexp = "^([+-]?[0-9]*)([+-][0-9]*)?([+-][0-9]*)?[(](" + regnames + "),(" +
+ string regexp = "^([+-]?[0-9]*)([+-][0-9]*)?([+-][0-9]*)?[(](" + regnames + "),[ ]?(" +
regnames + ")(,[1248])?[)]$";
vector<string> matches;
if (!regexp_match(asmarg, regexp, matches))

View File

@ -1,32 +0,0 @@
commit 2699450dde9af4cc609bdeca2b346a014840f0f0
Author: Frank Ch. Eigler <fche@redhat.com>
Date: Thu Jan 23 13:35:30 2020 -0500
RHBZ1788662: check rcu_is_watching() before probe entry
Some tracepoints are problematic because they are called from an idle
context, where RCU/lockdep is not legal to call. On lockdep kernels,
RCU warnings and even possibly-related panics have been reported.
Kernel tracepoint handlers protect themselves by wrapping their
innards in rcu_irq_enter/rcu_irq_exit(), which flips the legality flag
back on (even during idle), but these functions are not
module-exported, and it's not clear they'd be sufficient anyway. So
we call the module-export'd rcu_is_watching() in
_stp_runtime_get_context() to reject any attempt to start a probe in
such an idling-cpu context. This covers the cpu_idle tracepoint as
well as others.
diff --git a/runtime/linux/runtime_context.h b/runtime/linux/runtime_context.h
index 48894a6..db38bfc 100644
--- a/runtime/linux/runtime_context.h
+++ b/runtime/linux/runtime_context.h
@@ -73,6 +73,8 @@ static void _stp_runtime_contexts_free(void)
static inline struct context * _stp_runtime_get_context(void)
{
+ if (! rcu_is_watching()) // rcu operations are rejected in idle-cpu contexts
+ return 0; // in effect: skip probe
return rcu_dereference_sched(contexts[smp_processor_id()]);
}

View File

@ -1,69 +0,0 @@
commit 6053cecf4a4ffd19d1ac0a3bb3ffef100ab83fda
Author: Frank Ch. Eigler <fche@redhat.com>
Date: Tue Jan 28 15:48:42 2020 -0500
RHBZ1795196: tolerate partial elf + missing dwarf vmlinuz for -d kernel
Previous code in dump_symbol_tables() couldn't tolerate the case where
new elfutils opened /boot/vmlinuz* as an elf file for the kernel, and
could not extract a symbol table from that (nor an absent -debuginfo).
New code instead emits a warning and moves on. A special error code
triggers return to the dump_kallsyms() path that prior elfutils/stap
versions rely on.
diff --git a/testsuite/systemtap.base/kallsyms.exp b/testsuite/systemtap.base/kallsyms.exp
index 8ee5242..13ca4ad 100644
--- a/testsuite/systemtap.base/kallsyms.exp
+++ b/testsuite/systemtap.base/kallsyms.exp
@@ -5,7 +5,10 @@ if {![installtest_p]} {untested $test; return}
set script {"probe timer.profile {print_stack(backtrace()); exit()}"}
set passed 0
+# don't let stap find kernel debuginfo!
setenv SYSTEMTAP_DEBUGINFO_PATH $srcdir
+setenv DEBUGINFOD_URLS ""
+setenv DEBUGINFOD_CACHE_PATH "/dev/null"
eval spawn stap --all-modules -e $script
expect {
diff --git a/translate.cxx b/translate.cxx
index f142667..9e30427 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -6786,7 +6786,17 @@ dump_symbol_tables (Dwfl_Module *m,
dwfl_module_info (m, NULL, NULL, &end, NULL, NULL, NULL, NULL);
int syments = dwfl_module_getsymtab(m);
- DWFL_ASSERT (_F("Getting symbol table for %s", modname), syments >= 0);
+ if (syments < 0) // RHBZ1795196: elfutils 0.178+ can open vmlinuz as elf.main but fail here
+ {
+ c->session.print_warning(_F("libdwfl failure getting symbol table for %s: %s",
+ modname, dwfl_errmsg(-1)));
+ return DWARF_CB_ABORT;
+
+ // signal to dump_unwindsyms() to not let things proceed all the way to
+ // dump_unwindsym_cxt(), which then believes it has all the info for a
+ // complete record about this module. In the kernel's case, this allows
+ // PR17921 fallback to /proc/kallsyms via dump_kallsyms().
+ }
// Look up the relocation basis for symbols
int n = dwfl_module_relocations (m);
commit 3d571c2ab5797b41d07b51a7bbff626270d1e263
Author: Craig Ringer <craig.ringer@2ndquadrant.com>
Date: Sun Dec 29 14:51:47 2019 -0500
PR25265: fix strict-prototypes nit autoconf-stack-trace-save-regs.c
diff --git a/runtime/linux/autoconf-stack-trace-save-regs.c b/runtime/linux/autoconf-stack-trace-save-regs.c
index 8bf3339..1fd515f 100644
--- a/runtime/linux/autoconf-stack-trace-save-regs.c
+++ b/runtime/linux/autoconf-stack-trace-save-regs.c
@@ -1,6 +1,6 @@
#include <linux/stacktrace.h>
-unsigned int foo ()
+unsigned int foo (void)
{
unsigned long e[10];
struct pt_regs* r = 0;

File diff suppressed because it is too large Load Diff

874
SOURCES/rhbz1855264.patch Normal file
View File

@ -0,0 +1,874 @@
commit 0a281a96ddf7cae9a0f0cc0eb505a752ffdd932e
Author: William Cohen <wcohen@redhat.com>
Date: Tue Jun 16 16:02:11 2020 -0400
Make sizeof.stp runnable with the bpf backend.
diff --git a/testsuite/systemtap.examples/general/sizeof.meta b/testsuite/systemtap.examples/general/sizeof.meta
index 29713e4..b30078d 100644
--- a/testsuite/systemtap.examples/general/sizeof.meta
+++ b/testsuite/systemtap.examples/general/sizeof.meta
@@ -2,7 +2,7 @@ title: Print the Size of a C Type
name: sizeof.stp
version: 1.0
author: anonymous
-keywords: statistics memory
+keywords: statistics memory bpf
subsystem: any
status: proposed
exit: event-ended
@@ -11,3 +11,5 @@ scope: system-wide
description: This script prints the size of a type, based on dwarf debuginfo for any kernel or userspace module, or trial-compilation of a given header file name.
test_check: stap -p4 sizeof.stp task_struct 'kernel<include/linux/sched.h>'
test_installcheck: stap sizeof.stp FILE '</usr/include/stdio.h>'
+test_check_bpf: stap -p4 --bpf sizeof.stp task_struct 'kernel<include/linux/sched.h>'
+test_installcheck_bpf: stap --bpf sizeof.stp FILE '</usr/include/stdio.h>'
diff --git a/testsuite/systemtap.examples/general/sizeof.stp b/testsuite/systemtap.examples/general/sizeof.stp
index 0c77dce..5aec674 100755
--- a/testsuite/systemtap.examples/general/sizeof.stp
+++ b/testsuite/systemtap.examples/general/sizeof.stp
@@ -7,9 +7,11 @@
# sizeof.stp TYPENAME </usr/include/someheader.h>
probe oneshot {
- println("type ", @1,
- %( $# > 1 %? " in ", @2, %) /* module or header file name */
- " byte-size: ",
- %( $# > 1 %? @cast_module_sizeof(@2, @1) %: @cast_sizeof(@1) %)
- )
+ %( $# > 1 %?
+ printf("type %s in %s byte-size: %d\n", @1, @2,
+ @cast_module_sizeof(@2, @1))
+ %:
+ printf("type %s byte-size: %d\n", @1,
+ @cast_sizeof(@1))
+ %)
}
commit 2b2b6a622dc1d434c60d0ea159b260f660068ad1
Author: William Cohen <wcohen@redhat.com>
Date: Wed Jun 17 11:57:18 2020 -0400
Fix sizeof.stp to explicitly use kernel debuginfo if one not specified
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to use the @cast_module_sizeof()
instead of @cast_size() to use the kernel debuginfo.
diff --git a/testsuite/systemtap.examples/general/sizeof.stp b/testsuite/systemtap.examples/general/sizeof.stp
index 5aec674..b45f593 100755
--- a/testsuite/systemtap.examples/general/sizeof.stp
+++ b/testsuite/systemtap.examples/general/sizeof.stp
@@ -12,6 +12,6 @@ probe oneshot {
@cast_module_sizeof(@2, @1))
%:
printf("type %s byte-size: %d\n", @1,
- @cast_sizeof(@1))
+ @cast_module_sizeof("kernel", @1))
%)
}
commit 717b7dddd08b66b3caa5585221472d84e40be658
Author: William Cohen <wcohen@redhat.com>
Date: Wed Jun 17 13:08:30 2020 -0400
Use explicit @cast() operators to fslatency-nd.stp and fsslower-nd.stp
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
diff --git a/testsuite/systemtap.examples/lwtools/fslatency-nd.stp b/testsuite/systemtap.examples/lwtools/fslatency-nd.stp
index 6008399..0bee34f 100755
--- a/testsuite/systemtap.examples/lwtools/fslatency-nd.stp
+++ b/testsuite/systemtap.examples/lwtools/fslatency-nd.stp
@@ -63,8 +63,8 @@ probe __vfs_read = kprobe.function("__vfs_read")
{
# Skip the call if new_sync_read() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->read
- || !@cast(file, "file")->f_op->read_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->read
+ || !@cast(file, "file", "kernel")->f_op->read_iter)
next
}
@@ -75,8 +75,8 @@ probe __vfs_write = kprobe.function("__vfs_write")
{
# Skip the call if new_sync_write() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->write
- || !@cast(file, "file")->f_op->write_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->write
+ || !@cast(file, "file", "kernel")->f_op->write_iter)
next
}
@@ -102,8 +102,8 @@ probe __vfs_read.return = kprobe.function("__vfs_read").return
{
# Skip the call if new_sync_read() wouldn't be called.
file = @entry(pointer_arg(1))
- if (!file || @cast(file, "file")->f_op->read
- || !@cast(file, "file")->f_op->read_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->read
+ || !@cast(file, "file", "kernel")->f_op->read_iter)
next
}
@@ -115,8 +115,8 @@ probe __vfs_write.return = kprobe.function("__vfs_write")
{
# Skip the call if new_sync_write() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->write
- || !@cast(file, "file")->f_op->write_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->write
+ || !@cast(file, "file", "kernel")->f_op->write_iter)
next
}
diff --git a/testsuite/systemtap.examples/lwtools/fsslower-nd.stp b/testsuite/systemtap.examples/lwtools/fsslower-nd.stp
index 64abe41..90fa9b5 100755
--- a/testsuite/systemtap.examples/lwtools/fsslower-nd.stp
+++ b/testsuite/systemtap.examples/lwtools/fsslower-nd.stp
@@ -65,8 +65,8 @@ probe __vfs_read = kprobe.function("__vfs_read")
{
# Skip the call if new_sync_read() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->read
- || !@cast(file, "file")->f_op->read_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->read
+ || !@cast(file, "file", "kernel")->f_op->read_iter)
next
}
@@ -77,8 +77,8 @@ probe __vfs_write = kprobe.function("__vfs_write")
{
# Skip the call if new_sync_write() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->write
- || !@cast(file, "file")->f_op->write_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->write
+ || !@cast(file, "file", "kernel")->f_op->write_iter)
next
}
@@ -110,8 +110,8 @@ probe __vfs_read.return = kprobe.function("__vfs_read").return
{
# Skip the call if new_sync_read() wouldn't be called.
file = @entry(pointer_arg(1))
- if (!file || @cast(file, "file")->f_op->read
- || !@cast(file, "file")->f_op->read_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->read
+ || !@cast(file, "file", "kernel")->f_op->read_iter)
next
}
@@ -123,7 +123,7 @@ probe __vfs_write.return = kprobe.function("__vfs_write")
{
# Skip the call if new_sync_write() wouldn't be called.
file = pointer_arg(1)
- if (!file || @cast(file, "file")->f_op->write
- || !@cast(file, "file")->f_op->write_iter)
+ if (!file || @cast(file, "file", "kernel")->f_op->write
+ || !@cast(file, "file", "kernel")->f_op->write_iter)
next
}
commit 9eb37102d48b814821b7f474986a7bfe86784192
Author: William Cohen <wcohen@redhat.com>
Date: Wed Jun 17 13:39:20 2020 -0400
Use explicit @cast() operators for pfiles.stp and ioctl_handler.stp
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
diff --git a/testsuite/systemtap.examples/process/pfiles.stp b/testsuite/systemtap.examples/process/pfiles.stp
index d52a154..6344a4c 100755
--- a/testsuite/systemtap.examples/process/pfiles.stp
+++ b/testsuite/systemtap.examples/process/pfiles.stp
@@ -787,9 +787,9 @@ function print_unix_socket(sock) {
strlen(peername) > 0 ? peername . "\n" : "")
try { # skip line in case of null pointers
printf(" peercred pid: %d\n",
- @defined(@cast(sock, "socket")->sk->sk_peer_pid) ?
- @cast(sock, "socket")->sk->sk_peer_pid->numbers[0]->nr :
- @cast(sock, "socket")->sk->sk_peercred->pid ); } catch { }
+ @defined(@cast(sock, "socket", "kernel")->sk->sk_peer_pid) ?
+ @cast(sock, "socket", "kernel")->sk->sk_peer_pid->numbers[0]->nr :
+ @cast(sock, "socket", "kernel")->sk->sk_peercred->pid ); } catch { }
}
function print_ipv4_socket(sock) {
diff --git a/testsuite/systemtap.examples/profiling/ioctl_handler.stp b/testsuite/systemtap.examples/profiling/ioctl_handler.stp
index 7044185..6f1e52c 100755
--- a/testsuite/systemtap.examples/profiling/ioctl_handler.stp
+++ b/testsuite/systemtap.examples/profiling/ioctl_handler.stp
@@ -9,7 +9,7 @@ probe syscall.ioctl {
ioctl_requests[execname()] <<< 1
try {
# Dig down through the task struct to find the actual function handling ioctl.
- ioctl_func_address = @cast(task_current(), "struct task_struct")->files->fdt->fd[fd]->f_op->unlocked_ioctl
+ ioctl_func_address = @cast(task_current(), "struct task_struct", "kernel")->files->fdt->fd[fd]->f_op->unlocked_ioctl
if (ioctl_func_address)
ioctl_func[execname(), ioctl_func_address] <<< 1
} catch {
commit 3040d4e8ddb6a9b1d1a57a0185206498670c3f1a
Author: William Cohen <wcohen@redhat.com>
Date: Wed Jun 17 13:53:58 2020 -0400
Use explicit @cast() operators for stapgames/pingpong.stp tapset.
diff --git a/testsuite/systemtap.examples/stapgames/tapset/gmtty.stp b/testsuite/systemtap.examples/stapgames/tapset/gmtty.stp
index 026e4a9..f6ad2db 100644
--- a/testsuite/systemtap.examples/stapgames/tapset/gmtty.stp
+++ b/testsuite/systemtap.examples/stapgames/tapset/gmtty.stp
@@ -10,12 +10,12 @@ global GM_tty_ws_row, GM_tty_ws_col, GM_tty_name
# Initialize current TTY -- must be called from begin
function game_tty_init:long ()
{
- tty = @cast(task_current(), "task_struct")->signal->tty
+ tty = @cast(task_current(), "task_struct", "kernel")->signal->tty
if (tty) {
- namep = @cast(tty,"tty_struct")->name
+ namep = @cast(tty,"tty_struct", "kernel")->name
GM_tty_name = kernel_string(namep)
- GM_tty_ws_col = @cast(tty, "tty_struct")->winsize->ws_col
- GM_tty_ws_row = @cast(tty, "tty_struct")->winsize->ws_row
+ GM_tty_ws_col = @cast(tty, "tty_struct", "kernel")->winsize->ws_col
+ GM_tty_ws_row = @cast(tty, "tty_struct", "kernel")->winsize->ws_row
}
return tty
}
commit 3d922919dbe5657becf48917f1c661bf6711e956
Author: William Cohen <wcohen@redhat.com>
Date: Thu Jun 18 13:32:50 2020 -0400
Use explicit @cast() operators for periodic.stp
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
diff --git a/testsuite/systemtap.examples/profiling/periodic.stp b/testsuite/systemtap.examples/profiling/periodic.stp
index f18f183..b9052e5 100755
--- a/testsuite/systemtap.examples/profiling/periodic.stp
+++ b/testsuite/systemtap.examples/profiling/periodic.stp
@@ -18,8 +18,8 @@ probe kernel.trace("timer_expire_entry")
period[$timer] <<< elapsed
funct[$timer] = $timer->function
data[$timer] = @defined($timer->data) ? $timer->data : 0
- proc_info[$timer] = @defined($timer->data) ? 0 : @container_of($timer, "struct process_timer", timer)->task
- delayed_work_info[$timer] = @defined($timer->data) ? 0 : & @container_of($timer, "struct delayed_work", timer)
+ proc_info[$timer] = @defined($timer->data) ? 0 : @module_container_of($timer, "kernel", "struct process_timer", timer)->task
+ delayed_work_info[$timer] = @defined($timer->data) ? 0 : & @module_container_of($timer, "kernel", "struct delayed_work", timer)
}
last_expire[$timer] = new_expire
}
commit b2d18cb3afca76536506fe4992fdd6ef091ce82f
Author: William Cohen <wcohen@redhat.com>
Date: Thu Jun 18 15:01:40 2020 -0400
Use explicit @cast() operators for semop-watch.stp example.
diff --git a/testsuite/systemtap.examples/process/semop-watch.stp b/testsuite/systemtap.examples/process/semop-watch.stp
index ca2bf0a..bf1d632 100755
--- a/testsuite/systemtap.examples/process/semop-watch.stp
+++ b/testsuite/systemtap.examples/process/semop-watch.stp
@@ -3,7 +3,7 @@ global times;
probe syscall.{semop,semtimedop}
{
- sembuf_sz = @cast_sizeof("struct sembuf");
+ sembuf_sz = @cast_module_sizeof("kernel", "struct sembuf");
res = sprintf("set %d sems", semid)
%( systemtap_v < "2.3" %?
@@ -14,7 +14,7 @@ probe syscall.{semop,semtimedop}
for(i = 0; i < nsops; i++) {
offset = i * sembuf_sz;
pointer = sops_uaddr + offset;
- num_addr = & @cast(pointer, "struct sembuf")->sem_num;
+ num_addr = & @cast(pointer, "struct sembuf", "kernel")->sem_num;
num = user_short(num_addr);
res = sprintf("%s %d", res, num);
commit a948c291c9cd7320d3c9b18b5037908cbbdf70b7
Author: William Cohen <wcohen@redhat.com>
Date: Mon Jun 22 11:28:32 2020 -0400
Use explicit @cast() operators pointing to kernel for tapsets
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
diff --git a/tapset/linux/dentry.stp b/tapset/linux/dentry.stp
index 4e73532..d148c57 100644
--- a/tapset/linux/dentry.stp
+++ b/tapset/linux/dentry.stp
@@ -28,7 +28,7 @@
@__private30 function __dentry_IS_ROOT:long(dentry:long)
{
- return (@cast(dentry, "dentry")->d_parent == dentry)
+ return (@cast(dentry, "dentry", "kernel")->d_parent == dentry)
}
@@ -61,7 +61,7 @@
*/
function d_name:string(dentry:long)
{
- s = & @cast(dentry, "dentry")->d_name;
+ s = & @cast(dentry, "dentry", "kernel")->d_name;
return kernel_string_n(s->name, s->len);
}
@@ -70,8 +70,8 @@ function d_name:string(dentry:long)
{
/* i_dentry is an hlist_head on 3.6+, or a list_head before that. */
d_alias = @choose_defined(
- @cast(inode, "struct inode")->i_dentry->first,
- @cast(inode, "struct inode")->i_dentry->next)
+ @cast(inode, "struct inode", "kernel")->i_dentry->first,
+ @cast(inode, "struct inode", "kernel")->i_dentry->next)
if (@type_member_defined("struct dentry", d_alias)) {
return & @container_of(d_alias, "struct dentry", d_alias)
@@ -86,8 +86,8 @@ function d_name:string(dentry:long)
{
/* s_mounts was added in kernel 3.6, commit b3d9b7a3c. */
if (@type_member_defined("struct super_block", s_mounts)) {
- mnt_ns = @cast(task_current(), "struct task_struct")->nsproxy->mnt_ns
- sb = @cast(inode, "struct inode")->i_sb
+ mnt_ns = @cast(task_current(), "struct task_struct", "kernel<linux/sched.h>")->nsproxy->mnt_ns
+ sb = @cast(inode, "struct inode", "kernel")->i_sb
/* Look for the mount which matches the current namespace */
head = &sb->s_mounts
@@ -141,7 +141,7 @@ function reverse_path_walk:string(dentry:long)
{
while(1) {
name = __dentry_prepend(dentry, name);
- dentry = @cast(dentry, "dentry")->d_parent;
+ dentry = @cast(dentry, "dentry", "kernel")->d_parent;
if (__dentry_IS_ROOT(dentry))
return name;
}
@@ -209,8 +209,8 @@ function task_dentry_path:string(task:long,dentry:long,vfsmnt:long)
* dentry == vfsmnt->mnt_root. In that case, we'll just go
* ahead and handle them normally.
*/
- dentry = & @cast(dentry, "dentry")
- vfsmnt = & @cast(vfsmnt, "vfsmount")
+ dentry = & @cast(dentry, "dentry", "kernel")
+ vfsmnt = & @cast(vfsmnt, "vfsmount", "kernel")
if (@type_member_defined("dentry", d_op->d_dname)
&& dentry->d_op && dentry->d_op->d_dname
@@ -230,7 +230,7 @@ function task_dentry_path:string(task:long,dentry:long,vfsmnt:long)
return sprintf("ANON_INODE:%s", d_name(dentry))
}
else if (vfsmnt->mnt_sb->s_magic == @const("NSFS_MAGIC")) {
- ns_ops = &@cast(dentry->d_fsdata, "proc_ns_operations")
+ ns_ops = &@cast(dentry->d_fsdata, "proc_ns_operations", "kernel")
return sprintf("%s:[%lu]", kernel_string(ns_ops->name),
dentry->d_inode->i_ino)
}
@@ -239,16 +239,16 @@ function task_dentry_path:string(task:long,dentry:long,vfsmnt:long)
# Handle old-school vs. new-school fs_structs.
if (@type_member_defined("fs_struct", rootmnt)) {
- root_dentry = & @cast(task, "task_struct")->fs->root
- root_vfsmnt = & @cast(task, "task_struct")->fs->rootmnt
+ root_dentry = & @cast(task, "task_struct", "kernel")->fs->root
+ root_vfsmnt = & @cast(task, "task_struct", "kernel")->fs->rootmnt
}
else {
- root_dentry = @cast(task, "task_struct")->fs->root->dentry
- root_vfsmnt = @cast(task, "task_struct")->fs->root->mnt
+ root_dentry = @cast(task, "task_struct", "kernel")->fs->root->dentry
+ root_vfsmnt = @cast(task, "task_struct", "kernel")->fs->root->mnt
}
if (@type_member_defined("mount", mnt_parent)) {
- mnt = &@cast(real_mount(vfsmnt), "mount")
+ mnt = &@cast(real_mount(vfsmnt), "mount", "kernel")
if (mnt == 0)
return "<unknown>"
}
@@ -305,10 +305,10 @@ function task_dentry_path:string(task:long,dentry:long,vfsmnt:long)
*/
function d_path:string(nd:long)
{
- dentry = @choose_defined(@cast(nd,"nameidata")->path->dentry,
- @cast(nd,"nameidata")->dentry)
- vfsmnt = @choose_defined(@cast(nd,"nameidata")->path->mnt,
- @cast(nd,"nameidata")->mnt)
+ dentry = @choose_defined(@cast(nd,"nameidata", "kernel")->path->dentry,
+ @cast(nd,"nameidata", "kernel")->dentry)
+ vfsmnt = @choose_defined(@cast(nd,"nameidata", "kernel")->path->mnt,
+ @cast(nd,"nameidata", "kernel")->mnt)
return sprintf("%s/", task_dentry_path(task_current(), dentry, vfsmnt))
}
@@ -353,8 +353,8 @@ function fullpath_struct_path:string(path:long)
function fullpath_struct_file:string(task:long, file:long)
{
return task_dentry_path(task,
- @choose_defined(@cast(file, "file")->f_path->dentry,
- @cast(file, "file")->f_dentry),
- @choose_defined(@cast(file, "file")->f_path->mnt,
- @cast(file, "file")->f_vfsmnt))
+ @choose_defined(@cast(file, "file", "kernel")->f_path->dentry,
+ @cast(file, "file", "kernel")->f_dentry),
+ @choose_defined(@cast(file, "file", "kernel")->f_path->mnt,
+ @cast(file, "file", "kernel")->f_vfsmnt))
}
diff --git a/tapset/linux/dev.stp b/tapset/linux/dev.stp
index 0232fc9..079ce1c 100644
--- a/tapset/linux/dev.stp
+++ b/tapset/linux/dev.stp
@@ -56,8 +56,8 @@ function usrdev2kerndev:long(dev:long)
function disk_name:string(hd:long, partno:long)
{
if (!partno)
- return kernel_string(@cast(hd, "gendisk")->disk_name)
- disk_name = kernel_string(@cast(hd, "gendisk")->disk_name)
+ return kernel_string(@cast(hd, "gendisk", "kernel")->disk_name)
+ disk_name = kernel_string(@cast(hd, "gendisk", "kernel")->disk_name)
if (isdigit(substr(disk_name, strlen(disk_name)-1, 1)))
return sprintf("%sp%d", disk_name, partno)
else
@@ -66,7 +66,7 @@ function disk_name:string(hd:long, partno:long)
function bdevname:string(bdev:long)
{
- bdev = & @cast(bdev, "block_device")
+ bdev = & @cast(bdev, "block_device", "kernel")
if (bdev == 0)
return "N/A"
diff --git a/tapset/linux/ioblock.stp b/tapset/linux/ioblock.stp
index ad3603c..9d8f57b 100644
--- a/tapset/linux/ioblock.stp
+++ b/tapset/linux/ioblock.stp
@@ -107,12 +107,12 @@ function bio_rw_str(rw:long)
@__private30 function __bio_start_sect:long(bio:long)
{
try {
- if (@defined(@cast(bio, "bio")->bi_dev)) {
- return @cast(bio, "bio")->bi_bdev->bd_part->start_sect
+ if (@defined(@cast(bio, "bio", "kernel")->bi_dev)) {
+ return @cast(bio, "bio", "kernel")->bi_bdev->bd_part->start_sect
}
- else if (@defined(@cast(bio, "bio")->bi_disk)) {
- return disk_get_part_start_sect(@cast(bio, "bio")->bi_disk,
- @cast(bio, "bio")->bi_partno)
+ else if (@defined(@cast(bio, "bio", "kernel")->bi_disk)) {
+ return disk_get_part_start_sect(@cast(bio, "bio", "kernel")->bi_disk,
+ @cast(bio, "bio", "kernel")->bi_partno)
}
} catch {
return -1
@@ -122,12 +122,12 @@ function bio_rw_str(rw:long)
/* returns the block device name */
@__private30 function __bio_devname:string(bio:long)
{
- if (@defined(@cast(bio, "bio")->bi_bdev)) {
- return bdevname(@cast(bio, "bio")->bi_bdev)
+ if (@defined(@cast(bio, "bio", "kernel")->bi_bdev)) {
+ return bdevname(@cast(bio, "bio", "kernel")->bi_bdev)
}
else {
- return disk_name(@cast(bio, "bio")->bi_disk,
- @cast(bio, "bio")->bi_partno)
+ return disk_name(@cast(bio, "bio", "kernel")->bi_disk,
+ @cast(bio, "bio", "kernel")->bi_partno)
}
}
diff --git a/tapset/linux/task.stp b/tapset/linux/task.stp
index 4afc458..b542b61 100644
--- a/tapset/linux/task.stp
+++ b/tapset/linux/task.stp
@@ -40,7 +40,7 @@ function task_current:long () {
return -1;
}
sig = @task(task)->signal;
- return @cast(sig, "signal_struct")->rlim[nd_limit]->rlim_cur;
+ return @cast(sig, "signal_struct", "kernel")->rlim[nd_limit]->rlim_cur;
}
/* sfunction task_rlimit - The current resource limit of the task
commit 403e927796c3008ad5d5fed9bd97dc7cbad424bb
Author: Martin Cermak <mcermak@redhat.com>
Date: Mon Jun 29 16:30:34 2020 +0200
PR26181: Use explicit @cast() within get_ip_from_client()
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
Also, fix the type of server_ip, which historically had been a long,
but since systemtap_v >= "4.3", it is a string.
diff --git a/tapset/linux/nfs_proc.stp b/tapset/linux/nfs_proc.stp
index 8da3f6b..2579074 100644
--- a/tapset/linux/nfs_proc.stp
+++ b/tapset/linux/nfs_proc.stp
@@ -77,11 +77,11 @@ function get_ip_from_client:string(clnt:long)
* inside that buffer. */
if (@cast(addr, "sockaddr")->sa_family
== @const("AF_INET")) {
- return format_ipaddr(&@cast(addr, "sockaddr_in")->sin_addr->s_addr, @const("AF_INET"))
+ return format_ipaddr(&@cast(addr, "sockaddr_in", "kernel:sunrpc")->sin_addr->s_addr, @const("AF_INET"))
}
else if (@cast(addr, "sockaddr")->sa_family
== @const("AF_INET6")) {
- return format_ipaddr(&@cast(addr, "sockaddr_in6")->sin6_addr, @const("AF_INET6"))
+ return format_ipaddr(&@cast(addr, "sockaddr_in6", "kernel:sunrpc")->sin6_addr, @const("AF_INET6"))
}
return ""
}
@@ -90,12 +90,12 @@ function get_ip_from_client:long(clnt:long)
{
cl_xprt = @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_xprt
addr = &@cast(cl_xprt, "rpc_xprt", "kernel:sunrpc")->addr
- if (@cast(addr, "sockaddr_in")->sin_family
+ if (@cast(addr, "sockaddr_in", "kernel:sunrpc")->sin_family
!= @const("AF_INET")) {
/* Now consider ipv4 only */
return 0
}
- return @cast(addr, "sockaddr_in")->sin_addr->s_addr
+ return @cast(addr, "sockaddr_in", "kernel:sunrpc")->sin_addr->s_addr
}
%)
@@ -758,7 +758,11 @@ probe _nfs.proc2.missing_read_setup = never
{
inode = 0
client = 0
+%( systemtap_v >= "4.3" %?
+ server_ip = "0"
+%:
server_ip = 0
+%)
prot = 0
count = 0
commit f1a9bb064d11319a7eca4f4233c9edcc4a03af7e
Author: Martin Cermak <mcermak@redhat.com>
Date: Thu Jul 9 09:19:01 2020 +0200
Tapset and testsuite updates against @cast() change 00ee19ff03
Commit 00ee19ff030f665df7e087a579f39105256a0253 changed how @cast()
operations work and they no longer default to using the kernel
debuginfo for type information. Need to include kernel as location for
this information for the @cast() rather than just assuming a default.
These are respective tapset and testsuite minor updates.
diff --git a/tapset/linux/networking.stp b/tapset/linux/networking.stp
index 69843a7..0b52cbc 100644
--- a/tapset/linux/networking.stp
+++ b/tapset/linux/networking.stp
@@ -69,7 +69,7 @@
/* A function that returns the device name given the net_device struct */
function get_netdev_name:string (addr:long) {
- return kernel_string(@cast(addr, "net_device")->name)
+ return kernel_string(@cast(addr, "net_device", "kernel")->name)
}
/**
diff --git a/tapset/linux/scsi.stp b/tapset/linux/scsi.stp
index 3577942..5359fe8 100644
--- a/tapset/linux/scsi.stp
+++ b/tapset/linux/scsi.stp
@@ -179,8 +179,8 @@ probe scsi.iocompleted
function timer_pending:long(timer:long)
{
- return (@choose_defined(@cast(timer, "timer_list")->entry->next,
- @cast(timer, "timer_list")->base) != 0)
+ return (@choose_defined(@cast(timer, "timer_list", "kernel")->entry->next,
+ @cast(timer, "timer_list", "kernel")->base) != 0)
}
function scsi_timer_pending:long(cmd:long)
diff --git a/testsuite/buildok/pretty.stp b/testsuite/buildok/pretty.stp
index 85c9cd9..a2fc781 100755
--- a/testsuite/buildok/pretty.stp
+++ b/testsuite/buildok/pretty.stp
@@ -6,14 +6,14 @@ global i = 1
# pretty-printing with @cast
probe begin {
t = task_current()
- log(@cast(t, "task_struct")->fs$)
- log(@cast(t, "task_struct")->fs$$)
- log(@cast(t, "task_struct")->comm$)
- log(@cast(t, "task_struct")->comm$$)
- log(@cast(t, "task_struct")->comm[0]$)
- log(@cast(t, "task_struct")->comm[0]$$)
- log(@cast(t, "task_struct")->comm[i]$)
- log(@cast(t, "task_struct")->comm[i]$$)
+ log(@cast(t, "task_struct", "kernel")->fs$)
+ log(@cast(t, "task_struct", "kernel")->fs$$)
+ log(@cast(t, "task_struct", "kernel")->comm$)
+ log(@cast(t, "task_struct", "kernel")->comm$$)
+ log(@cast(t, "task_struct", "kernel")->comm[0]$)
+ log(@cast(t, "task_struct", "kernel")->comm[0]$$)
+ log(@cast(t, "task_struct", "kernel")->comm[i]$)
+ log(@cast(t, "task_struct", "kernel")->comm[i]$$)
}
# pretty-printing in dwarf kernel context
diff --git a/testsuite/semok/cast.stp b/testsuite/semok/cast.stp
index d72763c..fe78e36 100755
--- a/testsuite/semok/cast.stp
+++ b/testsuite/semok/cast.stp
@@ -2,7 +2,7 @@
probe begin {
// basic @cast test, with and without specifying kernel
- println(@cast(0, "task_struct")->tgid)
+ println(@cast(0, "task_struct", "kernel")->tgid)
println(@cast(0, "task_struct", "kernel")->tgid)
// check module-search paths
@@ -25,5 +25,5 @@ probe begin {
@cast(0, "task_struct", "no_such_module")->tgid
// PR11556: we should be able to treat the initial pointer like an array too
- println(@cast(0, "task_struct")[42]->tgid)
+ println(@cast(0, "task_struct", "kernel")[42]->tgid)
}
diff --git a/testsuite/semok/pretty.stp b/testsuite/semok/pretty.stp
index 0211d86..25490e7 100755
--- a/testsuite/semok/pretty.stp
+++ b/testsuite/semok/pretty.stp
@@ -12,16 +12,16 @@ global i = 1
# pretty-printing with @cast
probe begin {
t = task_current()
- log(@cast(t, "task_struct")$)
- log(@cast(t, "task_struct")$$)
- log(@cast(t, "task_struct")->fs$)
- log(@cast(t, "task_struct")->fs$$)
- log(@cast(t, "task_struct")->comm$)
- log(@cast(t, "task_struct")->comm$$)
- log(@cast(t, "task_struct")->comm[0]$)
- log(@cast(t, "task_struct")->comm[0]$$)
- log(@cast(t, "task_struct")->comm[i]$)
- log(@cast(t, "task_struct")->comm[i]$$)
+ log(@cast(t, "task_struct", "kernel")$)
+ log(@cast(t, "task_struct", "kernel")$$)
+ log(@cast(t, "task_struct", "kernel")->fs$)
+ log(@cast(t, "task_struct", "kernel")->fs$$)
+ log(@cast(t, "task_struct", "kernel")->comm$)
+ log(@cast(t, "task_struct", "kernel")->comm$$)
+ log(@cast(t, "task_struct", "kernel")->comm[0]$)
+ log(@cast(t, "task_struct", "kernel")->comm[0]$$)
+ log(@cast(t, "task_struct", "kernel")->comm[i]$)
+ log(@cast(t, "task_struct", "kernel")->comm[i]$$)
}
# pretty-printing in dwarf kernel context
diff --git a/testsuite/semok/sizeof.stp b/testsuite/semok/sizeof.stp
index 8e35e29..a5a6bbb 100755
--- a/testsuite/semok/sizeof.stp
+++ b/testsuite/semok/sizeof.stp
@@ -1,7 +1,7 @@
#! stap -p2
probe begin {
- println("task_struct: ", @cast_sizeof("task_struct"))
+ # println("task_struct: ", @cast_sizeof("task_struct"))
println("task_struct: ", @cast_module_sizeof("kernel", "task_struct"))
println("task_struct: ", @cast_module_sizeof("kernel<linux/sched.h>", "task_struct"))
println("FILE: ", @cast_module_sizeof("<stdio.h>", "FILE"))
diff --git a/testsuite/semok/thirtyeight.stp b/testsuite/semok/thirtyeight.stp
index 15189b7..5018795 100755
--- a/testsuite/semok/thirtyeight.stp
+++ b/testsuite/semok/thirtyeight.stp
@@ -7,4 +7,4 @@
probe kernel.function("do_sys_open") { println(@defined($mode) ? 1 : $nosuchvar) }
probe kernel.trace("sched_switch")? { println(@defined($next->pid) ? 1 : $nosuchvar) }
probe procfs.write { println(@defined($value) ? 1 : $nosuchvar) }
-probe begin { println(@defined(@cast(0, "task_struct")->pid) ? 1 : $nosuchvar) }
+probe begin { println(@defined(@cast(0, "task_struct", "kernel")->pid) ? 1 : $nosuchvar) }
diff --git a/testsuite/semok/thirtysix.stp b/testsuite/semok/thirtysix.stp
index 14f10c1..0adae14 100755
--- a/testsuite/semok/thirtysix.stp
+++ b/testsuite/semok/thirtysix.stp
@@ -17,17 +17,17 @@ probe begin,end,error,never { println(@defined($nosuchvar)?$nosuchvar:0) } # inv
probe timer.s(1),timer.jiffies(1) { println(@defined($nosuchvar)?$nosuchvar:0) } # invalid
probe timer.profile { println(@defined($nosuchvar)?$nosuchvar:0) } # invalid
-probe begin { println(@defined(@cast(0, "task_struct")->foo)?$nosuchvar:0) } # invalid
-probe begin { println(@defined(@cast(0, "task_struct")->pid)?1:$nosuchvar) } # valid
-probe kernel.function("do_sys_open") { println(@defined(@cast(0, "task_struct")->foo)?$nosuchvar:0) } # invalid
-probe kernel.function("do_sys_open") { println(@defined(@cast(0, "task_struct")->pid)?1:$nosuchvar) } # valid
+probe begin { println(@defined(@cast(0, "task_struct", "kernel")->foo)?$nosuchvar:0) } # invalid
+probe begin { println(@defined(@cast(0, "task_struct", "kernel")->pid)?1:$nosuchvar) } # valid
+probe kernel.function("do_sys_open") { println(@defined(@cast(0, "task_struct", "kernel")->foo)?$nosuchvar:0) } # invalid
+probe kernel.function("do_sys_open") { println(@defined(@cast(0, "task_struct", "kernel")->pid)?1:$nosuchvar) } # valid
-function foo1() { println(@defined(@cast(0, "task_struct")->foo)?$nosuchvar:0) } # invalid
-function foo2() { println(@defined(@cast(0, "task_struct")->pid)?1:$nosuchvar) } # valid
+function foo1() { println(@defined(@cast(0, "task_struct", "kernel")->foo)?$nosuchvar:0) } # invalid
+function foo2() { println(@defined(@cast(0, "task_struct", "kernel")->pid)?1:$nosuchvar) } # valid
probe begin { foo1(); foo2(); }
# PR11598: support @defined(&...)
-probe begin { println(@defined(@cast(0, "task_struct")->rcu)?$nosuchvar:0) } # invalid
-probe begin { println(@defined(&@cast(0, "task_struct")->rcu)?1:$nosuchvar) } # valid
+probe begin { println(@defined(@cast(0, "task_struct", "kernel")->rcu)?$nosuchvar:0) } # invalid
+probe begin { println(@defined(&@cast(0, "task_struct", "kernel")->rcu)?1:$nosuchvar) } # valid
probe kernel.function("release_task") { println(@defined($p->rcu)?$nosuchvar:0) } # invalid
probe kernel.function("release_task") { println(@defined(&$p->rcu)?1:$nosuchvar) } # valid
diff --git a/testsuite/systemtap.base/bitfield.stp b/testsuite/systemtap.base/bitfield.stp
index 0208108..b5f7b89 100644
--- a/testsuite/systemtap.base/bitfield.stp
+++ b/testsuite/systemtap.base/bitfield.stp
@@ -11,8 +11,8 @@ function check:long(ack:long, urg:long) {
ptr = get_ptr()
/* set the bits with cast */
- @cast(ptr, "tcphdr")->ack = ack
- @cast(ptr, "tcphdr")->urg = urg
+ @cast(ptr, "tcphdr", "kernel")->ack = ack
+ @cast(ptr, "tcphdr", "kernel")->urg = urg
/* check that reading with embedded-C is ok */
real_ack = get_ack()
@@ -20,8 +20,8 @@ function check:long(ack:long, urg:long) {
errors = (ack != real_ack) + (urg != real_urg)
/* check that reading with a cast is ok */
- cast_ack = @cast(ptr, "tcphdr")->ack
- cast_urg = @cast(ptr, "tcphdr")->urg
+ cast_ack = @cast(ptr, "tcphdr", "kernel")->ack
+ cast_urg = @cast(ptr, "tcphdr", "kernel")->urg
errors += (ack != cast_ack) + (urg != cast_urg)
if (errors)
diff --git a/testsuite/systemtap.base/target_set.stp b/testsuite/systemtap.base/target_set.stp
index ad4dca6..7c458cb 100644
--- a/testsuite/systemtap.base/target_set.stp
+++ b/testsuite/systemtap.base/target_set.stp
@@ -19,13 +19,13 @@ probe begin
probe syscall.nanosleep
{
if (target_set_pid(pid())
- && user_long(&@cast(req_uaddr, "struct timespec")->tv_sec) == $1)
+ && user_long(&@cast(req_uaddr, "struct timespec", "kernel")->tv_sec) == $1)
target_set_report()
}
probe syscall.compat_nanosleep ?
{
if (target_set_pid(pid())
- && user_long(&@cast(req_uaddr, "struct compat_timespec")->tv_sec) == $1)
+ && user_long(&@cast(req_uaddr, "struct compat_timespec", "kernel")->tv_sec) == $1)
target_set_report()
}
diff --git a/testsuite/systemtap.context/usymbols.exp b/testsuite/systemtap.context/usymbols.exp
index f53c1cd..e12f067 100644
--- a/testsuite/systemtap.context/usymbols.exp
+++ b/testsuite/systemtap.context/usymbols.exp
@@ -20,7 +20,7 @@ set testscript {
probe syscall.rt_sigaction {
if (pid() == target() && execname() == "%s") {
// Note user address.
- handler = user_long(&@cast(act_uaddr, "struct sigaction")->sa_handler);
+ handler = user_long(&@cast(act_uaddr, "struct sigaction", "kernel")->sa_handler);
try {
printf("handler: %%s (%%s)\n", usymname(handler), umodname(handler));
} catch {
@@ -31,9 +31,9 @@ set testscript {
probe syscall.rt_sigaction32 ? {
if (pid() == target() && execname() == "%s") {
// Note user address.
- handler = user_long(@defined(@cast(0, "compat_sigaction")->sa_handler)
- ? &@cast(act_uaddr, "compat_sigaction")->sa_handler
- : &@cast(act_uaddr, "sigaction32")->sa_handler);
+ handler = user_long(@defined(@cast(0, "compat_sigaction", "kernel")->sa_handler)
+ ? &@cast(act_uaddr, "compat_sigaction", "kernel")->sa_handler
+ : &@cast(act_uaddr, "sigaction32", "kernel")->sa_handler);
try {
printf("handler: %%s (%%s)\n", usymname(handler), umodname(handler));
} catch {
commit c6831f14e043f88096b2219828c0124cf2549b77
Author: Frank Ch. Eigler <fche@redhat.com>
Date: Thu Jul 9 21:41:51 2020 -0400
testuite: More @cast() fallout
Adjust another test case that uses the deprecated
probe begin { @cast(PTR, "type") }
construct. Now "kernel" is formally required to specify context.
diff --git a/testsuite/systemtap.base/cast.stp b/testsuite/systemtap.base/cast.stp
index cc44a36..0e191eb 100644
--- a/testsuite/systemtap.base/cast.stp
+++ b/testsuite/systemtap.base/cast.stp
@@ -4,7 +4,7 @@ probe begin
// Compare PIDs
pid = pid()
- cast_pid = @cast(curr, "task_struct")->tgid
+ cast_pid = @cast(curr, "task_struct", "kernel")->tgid
if (pid == cast_pid)
println("PID OK")
else
@@ -18,7 +18,7 @@ probe begin
printf("PID2 %d != %d\n", pid, cast_pid)
// Compare PIDs with an array access (PR11556)
- cast_pid = @cast(curr, "task_struct")[0]->tgid
+ cast_pid = @cast(curr, "task_struct", "kernel")[0]->tgid
if (pid == cast_pid)
println("PID3 OK")
else
@@ -26,16 +26,16 @@ probe begin
// Compare execnames
name = execname()
- cast_name = kernel_string(@cast(curr, "task_struct")->comm)
+ cast_name = kernel_string(@cast(curr, "task_struct", "kernel")->comm)
if (name == cast_name)
println("execname OK")
else
printf("execname \"%s\" != \"%s\"\n", name, cast_name)
// Compare usage counter values through a struct address
- usage = @cast(curr, "task_struct")->usage->counter
- pusage = & @cast(curr, "task_struct")->usage
- cast_usage = @cast(pusage, "atomic_t")->counter
+ usage = @cast(curr, "task_struct", "kernel")->usage->counter
+ pusage = & @cast(curr, "task_struct", "kernel")->usage
+ cast_usage = @cast(pusage, "atomic_t", "kernel")->counter
if (usage == cast_usage)
println("usage OK")
else

237
SOURCES/rhbz1868095.patch Normal file
View File

@ -0,0 +1,237 @@
diff --git a/java/HelperSDT.c b/java/HelperSDT.c
index ea08b8d..4b3271d 100644
--- a/java/HelperSDT.c
+++ b/java/HelperSDT.c
@@ -47,7 +47,7 @@ static int64_t determine_java_type(JNIEnv *env, jobject _arg, _Bool *need_free)
{
if ((*env)->IsSameObject(env, _arg, NULL)) {
*need_free = 1;
- return (int64_t) strdup("(null)"); /* need a real string to avoid user_string_warn getting upset */
+ return (int64_t) (uintptr_t) strdup("(null)"); /* need a real string to avoid user_string_warn getting upset */
}
jclass class_arg = (*env)->GetObjectClass(env, _arg);
@@ -87,7 +87,7 @@ static int64_t determine_java_type(JNIEnv *env, jobject _arg, _Bool *need_free)
(*env)->ExceptionClear(env);
/* Not a simple numeric scalar. Caller must free(). */
*need_free = true;
- return (int64_t) get_java_tostring(env, _arg);
+ return (int64_t) (uintptr_t) get_java_tostring(env, _arg);
}
static char *alloc_sargs(int64_t *sargs, _Bool *sfree, JNIEnv *env,
@@ -106,7 +106,7 @@ static void free_sargs(char *rulename, int64_t *sargs, _Bool *sfree, int num)
int i;
for (i = 0;i < num; i++)
if (sfree[i])
- free((void *) sargs[i]);
+ free((void *) (uintptr_t) sargs[i]);
free(rulename);
}
diff --git a/tapset/linux/conversions.stp b/tapset/linux/conversions.stp
index cfea83c..82f535f 100644
--- a/tapset/linux/conversions.stp
+++ b/tapset/linux/conversions.stp
@@ -26,7 +26,8 @@ deref_fault: /* branched to from deref_string() */
* really odd in the following error message. Setting a format
* width of '1' fixes this. */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel string copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -67,7 +68,8 @@ function kernel_string_quoted:string (addr:long)
(char *)(uintptr_t)STAP_ARG_addr,
MAXSTRINGLEN, MAXSTRINGLEN, 1, 0, 0);
if (STAP_ARG_addr == 0 || rc < 0)
- snprintf(STAP_RETVALUE, MAXSTRINGLEN, "%p", (void *)(uintptr_t)STAP_ARG_addr);
+ snprintf(STAP_RETVALUE, MAXSTRINGLEN, "0x%lx",
+ (unsigned long)(uintptr_t)STAP_ARG_addr);
%}
/**
@@ -86,7 +88,8 @@ function kernel_string_n:string (addr:long, n:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel string copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -110,7 +113,8 @@ function kernel_string_utf32:string (addr:long) %{ /* pure */
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "invalid UTF-32 character U+%X at 0x%p", c32, source);
+ "invalid UTF-32 character U+%X at 0x%lx", c32,
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
@@ -123,7 +127,8 @@ function kernel_string_utf32:string (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel string copy fault at 0x%p [man error::fault]", source);
+ "kernel string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -189,7 +194,8 @@ function kernel_string_utf16:string (addr:long) %{ /* pure */
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "invalid UTF-16 character U+%X at 0x%p", c32, source);
+ "invalid UTF-16 character U+%X at 0x%lx", c32,
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
@@ -202,7 +208,8 @@ function kernel_string_utf16:string (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel string copy fault at 0x%p [man error::fault]", source);
+ "kernel string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -249,7 +256,8 @@ function kernel_long:long (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel long copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel long copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -267,7 +275,8 @@ function kernel_int:long (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel int copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel int copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -285,7 +294,8 @@ function kernel_short:long (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel short copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel short copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -303,7 +313,8 @@ function kernel_char:long (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel char copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel char copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -322,7 +333,8 @@ function kernel_pointer:long (addr:long) %{ /* pure */
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "kernel pointer copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
+ "kernel pointer copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
diff --git a/tapset/uconversions.stp b/tapset/uconversions.stp
index 1b2b52e..83790e9 100644
--- a/tapset/uconversions.stp
+++ b/tapset/uconversions.stp
@@ -126,7 +126,7 @@ function user_string_n:string (addr:long, n:long)
strlcpy(STAP_RETVALUE, "<unknown>", MAXSTRINGLEN);
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"user string copy fault %ld at 0x%lx [man error::fault]", rc,
- (uintptr_t) STAP_ARG_addr);
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
} else
STAP_RETVALUE[len - 1] = '\0';
@@ -228,8 +228,8 @@ function user_string_n_warn:string (addr:long, n:long, warn_msg:string)
// NB: using error_buffer to get local space for the warning, but we're
// not aborting, so leave last_error alone.
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "user string copy fault 0x%ld at %lx [man error::fault]", rc,
- (void *) (uintptr_t) STAP_ARG_addr);
+ "user string copy fault %ld at 0x%lx [man error::fault]", rc,
+ (unsigned long) (uintptr_t) STAP_ARG_addr);
_stp_warn(CONTEXT->error_buffer);
strlcpy (STAP_RETVALUE, STAP_ARG_warn_msg, MAXSTRINGLEN);
} else
@@ -335,7 +335,7 @@ function user_string_n_quoted:string (addr:long, inlen:long, outlen:long)
else
#endif
snprintf(STAP_RETVALUE, MAXSTRINGLEN, "0x%lx",
- (uintptr_t)STAP_ARG_addr);
+ (unsigned long) (uintptr_t)STAP_ARG_addr);
#endif
}
}
@@ -366,7 +366,8 @@ function user_string_utf32:string (addr:long) %{ /* pure */ /* myproc-unprivileg
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "invalid UTF-32 character U+%X at 0x%lx", c32, (uintptr_t) source);
+ "invalid UTF-32 character U+%X at 0x%lx", c32,
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
@@ -379,7 +380,8 @@ function user_string_utf32:string (addr:long) %{ /* pure */ /* myproc-unprivileg
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "user string copy fault at 0x%lx [man error::fault]", (uintptr_t) source);
+ "user string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -447,7 +449,8 @@ function user_string_utf16:string (addr:long) %{ /* pure */ /* myproc-unprivileg
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "invalid UTF-16 character U+%X at 0x%lx", c32, source);
+ "invalid UTF-16 character U+%X at 0x%lx", c32,
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
@@ -460,7 +463,8 @@ function user_string_utf16:string (addr:long) %{ /* pure */ /* myproc-unprivileg
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
- "user string copy fault at 0x%lx [man error::fault]", (uintptr_t) source);
+ "user string copy fault at 0x%lx [man error::fault]",
+ (unsigned long) (uintptr_t) source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
@@ -532,7 +536,7 @@ function user_char_warn:long (addr:long) {
try {
return user_char_error(addr)
} catch {
- warn(sprintf("user char copy fault %p [man error::fault]",
+ warn(sprintf("user char copy fault at %p [man error::fault]",
addr))
return 0
}

View File

@ -10,7 +10,6 @@
%{!?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}
@ -87,8 +86,8 @@
%define __brp_mangle_shebangs_exclude_from .stp$
Name: systemtap
Version: 4.2
Release: 6%{?release_override}%{?dist}
Version: 4.3
Release: 4%{?release_override}%{?dist}
# for version, see also configure.ac
@ -124,9 +123,9 @@ License: GPLv2+
URL: http://sourceware.org/systemtap/
Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz
Patch10: rhbz1788648.patch
Patch11: rhbz1788662.patch
Patch12: rhbz1795196.patch
Patch1: rhbz1847676,1857749.patch
Patch2: rhbz1855264.patch
Patch3: rhbz1868095.patch
# Build*
BuildRequires: gcc-c++
@ -158,14 +157,7 @@ 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
@ -518,39 +510,13 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
# ------------------------------------------------------------------------
%prep
%setup -q %{?setup_elfutils}
%if %{with_bundled_elfutils}
cd elfutils-%{elfutils_version}
%setup -q
%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
%patch2 -p1
%patch3 -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
@ -646,9 +612,10 @@ cd ..
# We don't ship compileworthy python code, just oddball samples
%global py_auto_byte_compile 0
%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} %{bpf_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}"
%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}"
make %{?_smp_mflags}
%install
make DESTDIR=$RPM_BUILD_ROOT install
%find_lang %{name}
@ -1094,10 +1061,6 @@ 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
@ -1270,6 +1233,19 @@ done
# PRERELEASE
%changelog
* Wed Aug 12 2020 Martin Cermak <mcermak@redhat.com> - 4.3-4
- rhbz1868095: Refix including PR26379.
* Wed Aug 12 2020 Martin Cermak <mcermak@redhat.com> - 4.3-3
- rhbz1868095: byteman-java-methods-probing
* Tue Jul 28 2020 Frank Ch. Eigler <fche@redhat.com> - 4.3-2
- rhbz1857749: uprobes-inode changes
- rhbz1855264: @cast adaptations
* Thu Jun 11 2020 Stan Cox <scox@redhat.com> - 4.3-1
- rhbz1804319: Upstream release.
* Tue Feb 11 2020 Frank Ch. Eigler <fche@redhat.com> - 4.2-6
- rhbz1795196 cont'd: autoconf fix for kernel change to stack_trace_save_regs