/*jprobes-sample.c */ #include #include #include #include #include #include /* * Jumper probe for blockdev_direct_IO * Mirror principle enables access to arguments of the probed routine * from the probe handler. */ long jdo_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidptr) { printk("In handler? \n"); printk("jprobe: clone_flags=0x%x, stack_start=0x%x, stack_size=0x%x\n", clone_flags, stack_start, stack_size); jprobe_return(); return 0; } static struct jprobe my_jprobe = { {.addr = (kprobe_opcode_t *)0xc011eb20}, .entry = JPROBE_ENTRY(jdo_fork) //.entry = (kprobe_opcode_t *)jdo_fork }; int init_module(void) { int ret; /* first time invokation to initialize probe handler */ printk("plant jprobe at %p, handler addr %p\n", my_jprobe.kp.addr, my_jprobe.entry); /* now we are all set to register the probe */ ret = register_jprobe(&my_jprobe); if (ret) { printk("Unable to register jprobe\n"); return ret; } printk("registered jprobe\n"); return 0; } void cleanup_module(void) { unregister_jprobe(&my_jprobe); printk("jprobe unregistered\n"); } MODULE_LICENSE("GPL");