]> sourceware.org Git - systemtap.git/commitdiff
Initial checkin. Code to load/unload jprobes and kprobes.
authorhunt <hunt>
Mon, 21 Mar 2005 21:06:50 +0000 (21:06 +0000)
committerhunt <hunt>
Mon, 21 Mar 2005 21:06:50 +0000 (21:06 +0000)
runtime/probes.c [new file with mode: 0644]

diff --git a/runtime/probes.c b/runtime/probes.c
new file mode 100644 (file)
index 0000000..cb268e9
--- /dev/null
@@ -0,0 +1,81 @@
+/* -*- linux-c -*- */
+
+/** Create a new map.
+ * Maps must be created at module initialization time.
+ * @param max_entries The maximum number of entries allowed. Currently that 
+ * will be allocated dynamically.
+ * @param type Type of values stored in this map. 
+ * @return A MAP on success or NULL on failure.
+ */
+
+
+static unsigned long (*_stp_lookup_name)(char *name)=(void *)KALLSYMS_LOOKUP_NAME;
+
+void _stp_unregister_jprobes (struct jprobe *probes, int num_probes)
+{
+       int i;
+       for (i = 0; i < num_probes; i++)
+               unregister_jprobe(&probes[i]);
+       dlog ("All jprobes removed\n");
+}
+
+int _stp_register_jprobes (struct jprobe *probes, int num_probes)
+{
+       int i, ret ;
+       unsigned long addr;
+
+       for (i = 0; i < num_probes; i++) {
+               addr =_stp_lookup_name((char *)probes[i].kp.addr);
+               if (addr == 0) {
+                       dlog ("ERROR: function %s not found!\n", 
+                             (char *)probes[i].kp.addr);
+                       ret = -1; /* FIXME */
+                       goto out;
+               }
+               dlog("inserting jprobe at %s (%p)\n", probes[i].kp.addr, addr);
+               probes[i].kp.addr = (kprobe_opcode_t *)addr;
+               ret = register_jprobe(&probes[i]);
+               if (ret)
+                       goto out;
+       }
+       return 0;
+out:
+       dlog ("probe module initialization failed.  Exiting...\n");
+       _stp_unregister_jprobes(probes, i);
+       return ret;
+}
+
+void _stp_unregister_kprobes (struct kprobe *probes, int num_probes)
+{
+       int i;
+       for (i = 0; i < num_probes; i++)
+               unregister_kprobe(&probes[i]);
+       dlog ("All kprobes removed\n");
+}
+
+int _stp_register_kprobes (struct kprobe *probes, int num_probes)
+{
+       int i, ret ;
+       unsigned long addr;
+
+       for (i = 0; i < num_probes; i++) {
+               addr =_stp_lookup_name((char *)probes[i].addr);
+               if (addr == 0) {
+                       dlog ("ERROR: function %s not found!\n", 
+                             (char *)probes[i].addr);
+                       ret = -1; /* FIXME */
+                       goto out;
+               }
+               dlog("inserting kprobe at %s (%p)\n", probes[i].addr, addr);
+               probes[i].addr = (kprobe_opcode_t *)addr;
+               ret = register_kprobe(&probes[i]);
+               if (ret)
+                       goto out;
+       }
+       return 0;
+out:
+       dlog ("probe module initialization failed.  Exiting...\n");
+       _stp_unregister_kprobes(probes, i);
+       return ret;
+}
+
This page took 0.028922 seconds and 5 git commands to generate.