This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]