static DEFINE_PER_CPU (struct kprobe *, kprobe_instance) = NULL;
struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
-EXPORT_SYMBOL_GPL(kprobe_table);
static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
atomic_t kprobe_count;
DBPRINTF ("get_kprobe: probe %p", retVal);
return retVal;
}
-EXPORT_SYMBOL_GPL(get_kprobe);
/*
* Aggregate handlers for multiple kprobes support - these handlers
cross_compiler = $(subst gcc,,$(CC))
inlude_opt = -I$(realpath $(top_srcdir)/src/modules/ksyms) -I$(realpath $(top_srcdir)/src/modules/kprobe) \
- -I$(realpath $(top_srcdir)/src/modules/kprobe/arch) -I$(realpath $(top_srcdir)/src/modules/uprobe/arch)
+ -I$(realpath $(top_srcdir)/src/modules/kprobe/arch) -I$(realpath $(top_srcdir)/src/modules/uprobe/arch) \
+ -I$(realpath $(top_srcdir)/src/modules/uprobe)
extra_cflags = "$(inlude_opt) $(android_opt) $(board_opt)"
all-local:
};
struct hlist_head uprobe_insn_slot_table[UPROBE_TABLE_SIZE];
+struct hlist_head uprobe_table[UPROBE_TABLE_SIZE];
#define DEBUG_PRINT_HASH_TABLE 0
}
}
+static void init_uprobe_table(void)
+{
+ int i;
+ for (i = 0; i < UPROBE_TABLE_SIZE; ++i) {
+ INIT_HLIST_HEAD(&uprobe_table[i]);
+ }
+}
+
+struct kprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid)
+{
+ struct hlist_head *head;
+ struct hlist_node *node;
+ struct kprobe *p;
+
+ head = &uprobe_table[hash_ptr(addr, UPROBE_HASH_BITS)];
+ hlist_for_each_entry_rcu(p, node, head, hlist) {
+ if (p->addr == addr && p->tgid == tgid) {
+ return p;
+ }
+ }
+
+ return NULL;
+}
+
static void add_uprobe_table(struct kprobe *p)
{
#ifdef CONFIG_ARM
#endif
// get the first item
- old_p = get_kprobe(p->addr, p->tgid);
+ old_p = get_uprobe(p->addr, p->tgid);
if (old_p) {
#ifdef CONFIG_ARM
p->safe_arm = old_p->safe_arm;
// TODO: add uprobe (must be in function)
INIT_HLIST_NODE(&p->hlist);
- hlist_add_head_rcu(&p->hlist, &kprobe_table[hash_ptr (p->addr, KPROBE_HASH_BITS)]);
+ hlist_add_head_rcu(&p->hlist, &uprobe_table[hash_ptr(p->addr, UPROBE_HASH_BITS)]);
add_uprobe_table(p);
arch_arm_uprobe(p, task);
struct kprobe *p;
int i;
- for (i = 0; i < KPROBE_TABLE_SIZE; ++i) {
- head = &kprobe_table[i];
+ for (i = 0; i < UPROBE_TABLE_SIZE; ++i) {
+ head = &uprobe_table[i];
hlist_for_each_entry_safe(p, node, tnode, head, hlist) {
if (p->tgid == task->tgid) {
printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n",
static int __init init_uprobes(void)
{
+ init_uprobe_table();
init_uprobes_insn_slots();
return swap_arch_init_uprobes();