[REFACTOR] create uprobe_table[]
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Mon, 18 Mar 2013 08:01:19 +0000 (12:01 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Mon, 18 Mar 2013 08:01:19 +0000 (12:01 +0400)
kprobe/dbi_kprobes.c
uprobe/Makefile.am
uprobe/arch/asm-arm/swap_uprobes.c
uprobe/swap_uprobes.c
uprobe/swap_uprobes.h

index a69d9b4..7fa3cb1 100644 (file)
@@ -77,7 +77,6 @@ EXPORT_SYMBOL_GPL(kretprobe_lock);
 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;
@@ -161,7 +160,6 @@ struct kprobe *get_kprobe(kprobe_opcode_t *addr, pid_t tgid)
        DBPRINTF ("get_kprobe: probe %p", retVal);
        return retVal;
 }
-EXPORT_SYMBOL_GPL(get_kprobe);
 
 /*
  * Aggregate handlers for multiple kprobes support - these handlers
index 3eff0bf..2c20f8b 100644 (file)
@@ -6,7 +6,8 @@ module_name = swap_uprobe
 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:
index 8e6f44c..81c7dae 100644 (file)
@@ -1,6 +1,7 @@
 #include <dbi_kprobes.h>
 #include <asm/dbi_kprobes.h>
 #include <asm/traps.h>
+#include <swap_uprobes.h>
 
 // FIXME:
 #include <dbi_kdebug.h>
@@ -667,7 +668,7 @@ static int uprobe_handler(struct pt_regs *regs)
        oops_in_progress = 1;
 #endif
 
-       p = get_kprobe(addr, tgid);
+       p = get_uprobe(addr, tgid);
 
        if (p && (check_validity_insn(p, regs, task) != 0)) {
                goto no_uprobe_live;
index 7ab0d0c..7449b0d 100644 (file)
@@ -40,6 +40,7 @@ enum {
 };
 
 struct hlist_head uprobe_insn_slot_table[UPROBE_TABLE_SIZE];
+struct hlist_head uprobe_table[UPROBE_TABLE_SIZE];
 
 #define DEBUG_PRINT_HASH_TABLE 0
 
@@ -104,6 +105,30 @@ static void init_uprobes_insn_slots(void)
        }
 }
 
+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
@@ -215,7 +240,7 @@ int dbi_register_uprobe(struct kprobe *p, struct task_struct *task, int atomic)
 #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;
@@ -240,7 +265,7 @@ int dbi_register_uprobe(struct kprobe *p, struct task_struct *task, int atomic)
 
        // 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);
 
@@ -511,8 +536,8 @@ void dbi_unregister_all_uprobes(struct task_struct *task, int atomic)
        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",
@@ -530,6 +555,7 @@ void dbi_uprobe_return(void)
 
 static int __init init_uprobes(void)
 {
+       init_uprobe_table();
        init_uprobes_insn_slots();
 
        return swap_arch_init_uprobes();
index e56efed..8de84fb 100644 (file)
@@ -41,5 +41,6 @@ void dbi_unregister_uretprobe(struct task_struct *task, struct kretprobe *rp, in
 void dbi_unregister_all_uprobes(struct task_struct *task, int atomic);
 
 void dbi_uprobe_return(void);
+struct kprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid);
 
 #endif /*  _DBI_UPROBES_H */