This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[PATCH] add support for aarapovs' uretprobes
- From: groleo at gmail dot com
- To: systemtap at sourceware dot org
- Cc: Adrian Marius Negreanu <adrian dot m dot negreanu at intel dot com>
- Date: Thu, 21 Mar 2013 21:28:08 +0200
- Subject: [PATCH] add support for aarapovs' uretprobes
From: Adrian Marius Negreanu <adrian.m.negreanu@intel.com>
Change-Id: Ia05ef5f1c3adadaeafc32fa37a368bec2f4015c4
Signed-off-by: Adrian Marius Negreanu <adrian.m.negreanu@intel.com>
---
runtime/linux/autoconf-inode-uretprobes.c | 4 +---
runtime/linux/uprobes-inode.c | 22 +++++-----------------
runtime/transport/transport.c | 16 ----------------
tapsets.cxx | 3 +--
4 files changed, 7 insertions(+), 38 deletions(-)
diff --git a/runtime/linux/autoconf-inode-uretprobes.c b/runtime/linux/autoconf-inode-uretprobes.c
index 84bae26..356092d 100644
--- a/runtime/linux/autoconf-inode-uretprobes.c
+++ b/runtime/linux/autoconf-inode-uretprobes.c
@@ -2,9 +2,7 @@
#include <linux/wait.h>
#include <linux/uprobes.h>
/* Check whether we have uretprobes. */
-void *reg = uretprobe_register;
-void *ureg = uretprobe_unregister;
-
+struct uprobe_consumer uc = { .rp_handler = NULL };
#else
#error "not an inode-uprobes kernel"
#endif
diff --git a/runtime/linux/uprobes-inode.c b/runtime/linux/uprobes-inode.c
index e066dd2..73cea64 100644
--- a/runtime/linux/uprobes-inode.c
+++ b/runtime/linux/uprobes-inode.c
@@ -54,19 +54,6 @@ typedef typeof(&uprobe_unregister) uprobe_unregister_fn;
#define uprobe_unregister unregister_uprobe
#endif
-#if defined(STAPCONF_INODE_URETPROBES)
-#if !defined(STAPCONF_URETPROBE_REGISTER_EXPORTED)
-// First typedef from the original decl, then #define it as a typecasted call.
-typedef typeof(&uretprobe_register) uretprobe_register_fn;
-#define uretprobe_register (* (uretprobe_register_fn)kallsyms_uretprobe_register)
-#endif
-
-#if !defined(STAPCONF_URETPROBE_UNREGISTER_EXPORTED)
-// First typedef from the original decl, then #define it as a typecasted call.
-typedef typeof(&uretprobe_unregister) uretprobe_unregister_fn;
-#define uretprobe_unregister (* (uretprobe_unregister_fn)kallsyms_uretprobe_unregister)
-#endif
-#endif
#if !defined(STAPCONF_UPROBE_GET_SWBP_ADDR_EXPORTED)
// First typedef from the original decl, then #define it as a typecasted call.
@@ -174,12 +161,13 @@ stapiu_probe_prehandler_noaddr (struct uprobe_consumer *inst, struct pt_regs *re
static int
stapiu_register (struct inode* inode, struct stapiu_consumer* c)
{
- c->consumer.handler = STAPIU_HANDLER;
if (!c->return_p) {
+ c->consumer.handler = STAPIU_HANDLER;
return uprobe_register (inode, c->offset, &c->consumer);
- } else {
+ } else {
#if defined(STAPCONF_INODE_URETPROBES)
- return uretprobe_register (inode, c->offset, &c->consumer);
+ c->consumer.rp_handler = STAPIU_HANDLER;
+ return uprobe_register (inode, c->offset, &c->consumer);
#else
return EINVAL;
#endif
@@ -193,7 +181,7 @@ stapiu_unregister (struct inode* inode, struct stapiu_consumer* c)
uprobe_unregister (inode, c->offset, &c->consumer);
#if defined(STAPCONF_INODE_URETPROBES)
else
- uretprobe_unregister (inode, c->offset, &c->consumer);
+ uprobe_unregister (inode, c->offset, &c->consumer);
#endif
}
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index cc14c77..46eb28f 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -380,22 +380,6 @@ static int _stp_transport_init(void)
}
#endif
#endif
-#if defined(STAPCONF_INODE_URETPROBES) // i.e., kernel-embedded uretprobes
-#if !defined(STAPCONF_URETPROBE_REGISTER_EXPORTED)
- kallsyms_uretprobe_register = (void*) kallsyms_lookup_name ("uretprobe_register");
- if (kallsyms_uretprobe_register == NULL) {
- printk(KERN_ERR "%s can't resolve uretprobe_register!", THIS_MODULE->name);
- goto err0;
- }
-#endif
-#if !defined(STAPCONF_URETPROBE_UNREGISTER_EXPORTED)
- kallsyms_uretprobe_unregister = (void*) kallsyms_lookup_name ("uretprobe_unregister");
- if (kallsyms_uretprobe_unregister == NULL) {
- printk(KERN_ERR "%s can't resolve uretprobe_unregister!", THIS_MODULE->name);
- goto err0;
- }
-#endif
-#endif
#ifdef RELAY_GUEST
diff --git a/tapsets.cxx b/tapsets.cxx
index 7bcfa13..fdee04b 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -4178,8 +4178,7 @@ kernel_supports_inode_uretprobes(systemtap_session& s)
// We need inode-uprobes first, then look for uretprobe_register either as a
// real export or in the list possibly accessible by kallsyms.
return kernel_supports_inode_uprobes(s) &&
- (s.kernel_exports.count("uretprobe_register") > 0 ||
- s.kernel_functions.count("uretprobe_register") > 0);
+ (s.kernel_functions.count("arch_uretprobe_hijack_return_addr") > 0);
}
--
1.8.0