1f08c3bdfSopenharmony_ci#include <linux/kernel.h> 2f08c3bdfSopenharmony_ci#include <linux/module.h> 3f08c3bdfSopenharmony_ci#include <linux/fs.h> 4f08c3bdfSopenharmony_ci#include <linux/uio.h> 5f08c3bdfSopenharmony_ci#include <linux/kprobes.h> 6f08c3bdfSopenharmony_ci 7f08c3bdfSopenharmony_ci/* 8f08c3bdfSopenharmony_ci * Jumper probe for do_fork. 9f08c3bdfSopenharmony_ci * Mirror principle enables access to arguments of the probed routine 10f08c3bdfSopenharmony_ci * from the probe handler. 11f08c3bdfSopenharmony_ci */ 12f08c3bdfSopenharmony_ci 13f08c3bdfSopenharmony_ci/* Proxy routine having the same arguments as actual do_fork() routine */ 14f08c3bdfSopenharmony_cilong jdo_fork(unsigned long clone_flags, unsigned long stack_start, 15f08c3bdfSopenharmony_ci struct pt_regs *regs, unsigned long stack_size, 16f08c3bdfSopenharmony_ci int __user * parent_tidptr, int __user * child_tidptr) 17f08c3bdfSopenharmony_ci{ 18f08c3bdfSopenharmony_ci printk("jprobe: clone_flags=0x%lx, stack_size=0x%lx, regs=%p\n", 19f08c3bdfSopenharmony_ci clone_flags, stack_size, regs); 20f08c3bdfSopenharmony_ci /* Always end with a call to jprobe_return(). */ 21f08c3bdfSopenharmony_ci jprobe_return(); 22f08c3bdfSopenharmony_ci 23f08c3bdfSopenharmony_ci return 0; 24f08c3bdfSopenharmony_ci} 25f08c3bdfSopenharmony_ci 26f08c3bdfSopenharmony_cistatic struct jprobe my_jprobe = { 27f08c3bdfSopenharmony_ci .entry = jdo_fork 28f08c3bdfSopenharmony_ci}; 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_cistatic int __init jprobe_init(void) 31f08c3bdfSopenharmony_ci{ 32f08c3bdfSopenharmony_ci int ret; 33f08c3bdfSopenharmony_ci my_jprobe.kp.symbol_name = "do_fork"; 34f08c3bdfSopenharmony_ci 35f08c3bdfSopenharmony_ci if ((ret = register_jprobe(&my_jprobe)) < 0) { 36f08c3bdfSopenharmony_ci printk("register_jprobe failed, returned %d\n", ret); 37f08c3bdfSopenharmony_ci /* XXX: Exit code is wrong. */ 38f08c3bdfSopenharmony_ci return -1; 39f08c3bdfSopenharmony_ci } 40f08c3bdfSopenharmony_ci printk("Planted jprobe at %p, handler addr %p\n", 41f08c3bdfSopenharmony_ci my_jprobe.kp.addr, my_jprobe.entry); 42f08c3bdfSopenharmony_ci return 0; 43f08c3bdfSopenharmony_ci} 44f08c3bdfSopenharmony_ci 45f08c3bdfSopenharmony_cistatic void __exit jprobe_exit(void) 46f08c3bdfSopenharmony_ci{ 47f08c3bdfSopenharmony_ci unregister_jprobe(&my_jprobe); 48f08c3bdfSopenharmony_ci printk("jprobe unregistered\n"); 49f08c3bdfSopenharmony_ci} 50f08c3bdfSopenharmony_ci 51f08c3bdfSopenharmony_cimodule_init(jprobe_init) 52f08c3bdfSopenharmony_ci module_exit(jprobe_exit) 53f08c3bdfSopenharmony_ci MODULE_LICENSE("GPL"); 54