2 * Dynamic Binary Instrumentation Module based on KProbes
3 * modules/ks_manager/ks_manager.c
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.
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.
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.
19 * Copyright (C) Samsung Electronics, 2013
21 * 2013 Vyacheslav Cherkashin <v.cherkashin@samsung.com>
25 #include <linux/module.h>
26 #include <linux/slab.h>
27 #include <dbi_kprobes.h>
28 #include <dbi_kprobes_deps.h>
29 #include "ks_manager.h"
32 struct hlist_node hlist;
36 static HLIST_HEAD(list_probes);
38 static struct probe *create_probe(unsigned long addr, void *pre_handler,
39 void *jp_handler, void *rp_handler)
41 struct probe *p = kzalloc(sizeof(*p), GFP_KERNEL);
43 p->p.jp.kp.addr = p->p.rp.kp.addr = (void *)addr;
44 p->p.jp.pre_entry = pre_handler;
45 p->p.jp.entry = jp_handler;
46 p->p.rp.handler = rp_handler;
47 INIT_HLIST_NODE(&p->hlist);
52 static void free_probe(struct probe *p)
57 static void add_probe_to_list(struct probe *p)
59 hlist_add_head(&p->hlist, &list_probes);
62 static void remove_probe_to_list(struct probe *p)
67 static struct probe *find_probe(unsigned long addr)
70 struct hlist_node *node;
72 /* check if such probe does exist */
73 swap_hlist_for_each_entry(p, node, &list_probes, hlist)
74 if (p->p.jp.kp.addr == addr)
80 int ksm_register_probe(unsigned long addr, void *pre_handler,
81 void *jp_handler, void *rp_handler)
86 p = create_probe(addr, pre_handler, jp_handler, rp_handler);
90 ret = dbi_register_jprobe(&p->p.jp);
94 ret = dbi_register_kretprobe(&p->p.rp);
96 goto unregister_jprobe;
102 dbi_unregister_jprobe(&p->p.jp);
107 EXPORT_SYMBOL_GPL(ksm_register_probe);
109 static void do_ksm_unregister_probe(struct probe *p)
111 remove_probe_to_list(p);
112 dbi_unregister_kretprobe(&p->p.rp);
113 dbi_unregister_jprobe(&p->p.jp);
117 int ksm_unregister_probe(unsigned long addr)
121 p = find_probe(addr);
125 do_ksm_unregister_probe(p);
129 EXPORT_SYMBOL_GPL(ksm_unregister_probe);
131 int ksm_unregister_probe_all(void)
134 struct hlist_node *node, *n;
136 swap_hlist_for_each_entry_safe(p, node, n, &list_probes, hlist) {
137 do_ksm_unregister_probe(p);
142 EXPORT_SYMBOL_GPL(ksm_unregister_probe_all);
144 static int __init init_ks_manager(void)
149 static void __exit exit_ks_manager(void)
151 ksm_unregister_probe_all();
154 module_init(init_ks_manager);
155 module_exit(exit_ks_manager);
157 MODULE_LICENSE ("GPL");