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