From: hunt Date: Mon, 21 Mar 2005 21:06:50 +0000 (+0000) Subject: Initial checkin. Code to load/unload jprobes and kprobes. X-Git-Tag: release-0.2.2~238 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=e10ae0b0a445c70eafed2e6a7e8991191f023445;p=systemtap.git Initial checkin. Code to load/unload jprobes and kprobes. --- diff --git a/runtime/probes.c b/runtime/probes.c new file mode 100644 index 000000000..cb268e93d --- /dev/null +++ b/runtime/probes.c @@ -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; +} +