Redesign KProbe module (separating core and arch parts).
[kernel/swap-modules.git] / kprobe / arch / dbi_kprobes.c
1 /*
2  *  Kernel Probes (KProbes)
3  *  arch/<arch>/kernel/kprobes.c
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  *
19  * Copyright (C) IBM Corporation, 2002, 2004
20  */
21
22 /*
23  *  Dynamic Binary Instrumentation Module based on KProbes
24  *  modules/kprobe/arch/dbi_kprobes.c
25  *
26  * This program is free software; you can redistribute it and/or modify
27  * it under the terms of the GNU General Public License as published by
28  * the Free Software Foundation; either version 2 of the License, or
29  * (at your option) any later version.
30  *
31  * This program is distributed in the hope that it will be useful,
32  * but WITHOUT ANY WARRANTY; without even the implied warranty of
33  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34  * GNU General Public License for more details.
35  *
36  * You should have received a copy of the GNU General Public License
37  * along with this program; if not, write to the Free Software
38  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
39  *
40  * Copyright (C) Samsung Electronics, 2006-2010
41  *
42  * 2006-2007    Ekaterina Gorelkina <e.gorelkina@samsung.com>: initial implementation for ARM and MIPS
43  * 2008-2009    Alexey Gerenkov <a.gerenkov@samsung.com> User-Space
44  *              Probes initial implementation; Support x86/ARM/MIPS for both user and kernel spaces.
45  * 2010         Ekaterina Gorelkina <e.gorelkina@samsung.com>: redesign module for separating core and arch parts 
46  *
47
48  */
49
50 #include "dbi_kprobes.h"
51 #include "../dbi_kprobes.h"
52 #include "asm/dbi_kprobes.h"
53
54 #include "../dbi_kdebug.h"
55 #include "../dbi_insn_slots.h"
56 #include "../dbi_kprobes_deps.h"
57
58 #include <linux/module.h>
59
60 extern unsigned int *sched_addr;
61 extern unsigned int *fork_addr;
62
63 extern struct hlist_head kprobe_insn_pages;
64 extern struct hlist_head uprobe_insn_pages;
65
66 static int ksyms = INVALID_VALUE;
67 module_param (ksyms, int, 0);
68
69 extern unsigned long (*kallsyms_search) (const char *name);
70
71 void arch_remove_kprobe (struct kprobe *p, struct task_struct *task)
72 {
73         if(p->tgid)
74                 free_insn_slot (&uprobe_insn_pages, task, \
75                                 p->ainsn.insn, (p->ainsn.boostable == 1));
76         else
77                 free_insn_slot (&kprobe_insn_pages, NULL, \
78                                 p->ainsn.insn, (p->ainsn.boostable == 1));
79 }
80
81 void arch_arm_uprobe (struct kprobe *p, struct task_struct *tsk)
82 {
83         kprobe_opcode_t insn = BREAKPOINT_INSTRUCTION;
84
85         if (!write_proc_vm_atomic (tsk, (unsigned long) p->addr, &insn, sizeof (insn)))
86                 panic ("failed to write memory %p!\n", p->addr);
87 }
88
89 void arch_arm_uretprobe (struct kretprobe *p, struct task_struct *tsk)
90 {
91 }
92
93 void arch_disarm_uprobe (struct kprobe *p, struct task_struct *tsk)
94 {
95         if (!write_proc_vm_atomic (tsk, (unsigned long) p->addr, &p->opcode, sizeof (p->opcode)))
96                 panic ("failed to write memory %p!\n", p->addr);
97 }
98
99 void arch_disarm_uretprobe (struct kretprobe *p, struct task_struct *tsk)
100 {
101 }
102
103 int arch_init_module_dependencies()
104 {
105
106         kallsyms_search = (void *) ksyms; 
107         DBPRINTF ("kallsyms=0x%08x\n", ksyms);
108
109         sched_addr = (unsigned int *)kallsyms_search("__switch_to");//"schedule");
110         fork_addr = (unsigned int *)kallsyms_search("do_fork");
111
112         init_module_dependencies();
113
114         return asm_init_module_dependencies();
115 }