| 1 | /* test-kprobes.c |
| 2 | * |
| 3 | * kprobe timing test. |
| 4 | */ |
| 5 | |
| 6 | #include <linux/kernel.h> |
| 7 | #include <linux/module.h> |
| 8 | #include <linux/kprobes.h> |
| 9 | #include <linux/kallsyms.h> |
| 10 | #include <linux/sched.h> |
| 11 | |
| 12 | |
| 13 | /*For each probe you need to allocate a kprobe structure*/ |
| 14 | static struct kprobe kp; |
| 15 | |
| 16 | /*kprobe pre_handler: called just before the probed instruction is executed*/ |
| 17 | int handler_pre(struct kprobe *p, struct pt_regs *regs) |
| 18 | { |
| 19 | //printk("pre_handler: p->addr=0x%p, eip=%lx, eflags=0x%lx\n", |
| 20 | // p->addr, regs->eip, regs->eflags); |
| 21 | //dump_stack(); |
| 22 | return 0; |
| 23 | } |
| 24 | |
| 25 | /*kprobe post_handler: called after the probed instruction is executed*/ |
| 26 | void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags) |
| 27 | { |
| 28 | //printk("post_handler: p->addr=0x%p, eflags=0x%lx\n", |
| 29 | // p->addr, regs->eflags); |
| 30 | } |
| 31 | |
| 32 | /* fault_handler: this is called if an exception is generated for any |
| 33 | * instruction within the pre- or post-handler, or when Kprobes |
| 34 | * single-steps the probed instruction. |
| 35 | */ |
| 36 | int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr) |
| 37 | { |
| 38 | //printk("fault_handler: p->addr=0x%p, trap #%dn", |
| 39 | // p->addr, trapnr); |
| 40 | /* Return 0 because we don't handle the fault. */ |
| 41 | return 0; |
| 42 | } |
| 43 | |
| 44 | int init_module(void) |
| 45 | { |
| 46 | int ret; |
| 47 | kp.pre_handler = handler_pre; |
| 48 | kp.post_handler = handler_post; |
| 49 | kp.fault_handler = handler_fault; |
| 50 | //kp.addr = (kprobe_opcode_t*) kallsyms_lookup_name("do_fork"); |
| 51 | kp.addr = (void*)0xf886b000; |
| 52 | /* register the kprobe now */ |
| 53 | if (!kp.addr) { |
| 54 | printk("Couldn't find %s to plant kprobe\n", "do_fork"); |
| 55 | return -1; |
| 56 | } |
| 57 | if ((ret = register_kprobe(&kp) < 0)) { |
| 58 | printk("register_kprobe failed, returned %d\n", ret); |
| 59 | return -1; |
| 60 | } |
| 61 | printk("kprobe registered\n"); |
| 62 | return 0; |
| 63 | } |
| 64 | |
| 65 | void cleanup_module(void) |
| 66 | { |
| 67 | unregister_kprobe(&kp); |
| 68 | printk("kprobe unregistered\n"); |
| 69 | } |
| 70 | |
| 71 | MODULE_LICENSE("GPL"); |
| 72 | MODULE_AUTHOR("Mathieu Desnoyers"); |
| 73 | MODULE_DESCRIPTION("Linux Trace Toolkit Test"); |
| 74 | |