summaryrefslogtreecommitdiffstats
path: root/runtime/probes/scf/scf.c
diff options
context:
space:
mode:
authorhunt <hunt>2005-05-31 20:14:03 +0000
committerhunt <hunt>2005-05-31 20:14:03 +0000
commita7b49c5a613f185067ed07f7bfcbb02d14a5ed1f (patch)
treeba94a055804a57c4e1a6d3a629e1a88026933147 /runtime/probes/scf/scf.c
parent9c5d496e200d5476b126bc5ff9806365a77a2c7e (diff)
downloadsystemtap-steved-a7b49c5a613f185067ed07f7bfcbb02d14a5ed1f.tar.gz
systemtap-steved-a7b49c5a613f185067ed07f7bfcbb02d14a5ed1f.tar.xz
systemtap-steved-a7b49c5a613f185067ed07f7bfcbb02d14a5ed1f.zip
New probe.
Diffstat (limited to 'runtime/probes/scf/scf.c')
-rw-r--r--runtime/probes/scf/scf.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/runtime/probes/scf/scf.c b/runtime/probes/scf/scf.c
new file mode 100644
index 00000000..dfdb7b0a
--- /dev/null
+++ b/runtime/probes/scf/scf.c
@@ -0,0 +1,79 @@
+#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 2
+#include "runtime.h"
+
+#define MAP_STRING_LENGTH 512
+#define KEY1_TYPE STRING
+#include "map-keys.c"
+
+#define VALUE_TYPE INT64
+#include "map-values.c"
+
+#include "map.c"
+#include "sym.c"
+#include "current.c"
+#include "stack.c"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: scf");
+MODULE_AUTHOR("Martin Hunt <hunt@redhat.com>");
+
+MAP map1;
+
+int inst_smp_call_function (struct kprobe *p, struct pt_regs *regs)
+{
+ String str = _stp_string_init (0);
+ _stp_stack_sprint (str,regs);
+ _stp_map_key_str(map1, _stp_string_ptr(str));
+ _stp_map_add_int64 (map1, 1);
+ return 0;
+}
+
+static struct kprobe stp_probes[] = {
+ {
+ .addr = (kprobe_opcode_t *)"smp_call_function",
+ .pre_handler = inst_smp_call_function
+ },
+};
+
+#define MAX_STP_ROUTINE (sizeof(stp_probes)/sizeof(struct kprobe))
+
+static int pid;
+module_param(pid, int, 0);
+MODULE_PARM_DESC(pid, "daemon pid");
+
+int init_module(void)
+{
+ int ret;
+
+ if (!pid) {
+ printk("init: Can't start without daemon pid\n");
+ return -1;
+ }
+
+ if (_stp_transport_open(n_subbufs, subbuf_size, pid) < 0) {
+ printk("init: Couldn't open transport\n");
+ return -1;
+ }
+
+ map1 = _stp_map_new_str (100, INT64);
+
+ ret = _stp_register_kprobes (stp_probes, MAX_STP_ROUTINE);
+
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_kprobes (stp_probes, MAX_STP_ROUTINE);
+ _stp_map_print (map1, "trace[%1s] = %d\n");
+ _stp_map_del (map1);
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
+