[REFACTOR] move register undef_hook for US in uprobe module
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 12 Mar 2013 07:05:21 +0000 (11:05 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 12 Mar 2013 07:05:21 +0000 (11:05 +0400)
kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/arch/asm-arm/dbi_kprobes.h
kprobe/arch/dbi_kprobes.h
uprobe/arch/asm-arm/swap_uprobes.c
uprobe/arch/asm-arm/swap_uprobes.h
uprobe/swap_uprobes.c

index eb6a4dd..ac0690a 100644 (file)
@@ -64,6 +64,9 @@
 extern struct kprobe * per_cpu__current_kprobe;
 extern struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
 
+static void (*__swap_register_undef_hook)(struct undef_hook *hook);
+static void (*__swap_unregister_undef_hook)(struct undef_hook *hook);
+
 #ifdef OVERHEAD_DEBUG
 unsigned long swap_sum_time = 0;
 unsigned long swap_sum_hit = 0;
@@ -423,22 +426,12 @@ static int check_validity_insn(struct kprobe *p, struct pt_regs *regs, struct ta
        return 0;
 }
 
-static int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
-{
-       int ret;
-        unsigned long flags;
-        local_irq_save(flags);
-        ret = kprobe_handler(regs);
-        local_irq_restore(flags);
-        return ret;
-}
-
 #ifdef TRAP_OVERHEAD_DEBUG
 static unsigned long trap_handler_counter_debug = 0;
 #define SAMPLING_COUNTER                               100000
 #endif
 
-int kprobe_handler(struct pt_regs *regs)
+static int kprobe_handler(struct pt_regs *regs)
 {
        int err_out = 0;
        char *msg_out = NULL;
@@ -634,6 +627,17 @@ out:
        return err_out;
 }
 
+int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
+{
+       int ret;
+       unsigned long flags;
+       local_irq_save(flags);
+       ret = kprobe_handler(regs);
+       local_irq_restore(flags);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(kprobe_trap_handler);
+
 int setjmp_pre_handler (struct kprobe *p, struct pt_regs *regs)
 {
        struct jprobe *jp = container_of (p, struct jprobe, kp);
@@ -951,9 +955,17 @@ int asm_init_module_dependencies(void)
        return 0;
 }
 
-typedef void (* kpro_type)(struct undef_hook *);
-static kpro_type do_kpro;
-static kpro_type undo_kpro;
+void swap_register_undef_hook(struct undef_hook *hook)
+{
+       __swap_register_undef_hook(hook);
+}
+EXPORT_SYMBOL_GPL(swap_register_undef_hook);
+
+void swap_unregister_undef_hook(struct undef_hook *hook)
+{
+       __swap_unregister_undef_hook(hook);
+}
+EXPORT_SYMBOL_GPL(swap_unregister_undef_hook);
 
 // kernel probes hook
 static struct undef_hook undef_ho_k = {
@@ -964,24 +976,6 @@ static struct undef_hook undef_ho_k = {
     .fn                = kprobe_trap_handler
 };
 
-// userspace probes hook (arm)
-static struct undef_hook undef_ho_u = {
-    .instr_mask        = 0xffffffff,
-    .instr_val = BREAKPOINT_INSTRUCTION,
-    .cpsr_mask = MODE_MASK,
-    .cpsr_val  = USR_MODE,
-    .fn                = kprobe_trap_handler
-};
-
-// userspace probes hook (thumb)
-static struct undef_hook undef_ho_u_t = {
-    .instr_mask        = 0xffffffff,
-    .instr_val = BREAKPOINT_INSTRUCTION & 0x0000ffff,
-    .cpsr_mask = MODE_MASK,
-    .cpsr_val  = USR_MODE,
-    .fn                = kprobe_trap_handler
-};
-
 int __init arch_init_kprobes (void)
 {
        unsigned int do_bp_handler = 0;
@@ -1000,22 +994,20 @@ int __init arch_init_kprobes (void)
         }
        arr_traps_template[NOTIFIER_CALL_CHAIN_INDEX] = arch_construct_brunch ((unsigned int)kprobe_handler, do_bp_handler + NOTIFIER_CALL_CHAIN_INDEX * 4, 1);
        // Register hooks (kprobe_handler)
-       do_kpro = (kpro_type)swap_ksyms("register_undef_hook");
-       if (do_kpro == NULL) {
+       __swap_register_undef_hook = swap_ksyms("register_undef_hook");
+       if (__swap_register_undef_hook == NULL) {
                printk("no register_undef_hook symbol found!\n");
                 return -1;
         }
 
         // Unregister hooks (kprobe_handler)
-        undo_kpro = (kpro_type)swap_ksyms("unregister_undef_hook");
-        if (undo_kpro == NULL) {
+       __swap_unregister_undef_hook = swap_ksyms("unregister_undef_hook");
+       if (__swap_unregister_undef_hook == NULL) {
                 printk("no unregister_undef_hook symbol found!\n");
                 return -1;
         }
 
-       do_kpro(&undef_ho_k);
-       do_kpro(&undef_ho_u);
-       do_kpro(&undef_ho_u_t);
+       swap_register_undef_hook(&undef_ho_k);
        if ((ret = dbi_register_kprobe (&trampoline_p)) != 0) {
                //dbi_unregister_jprobe(&do_exit_p, 0);
                return ret;
@@ -1025,9 +1017,7 @@ int __init arch_init_kprobes (void)
 
 void __exit dbi_arch_exit_kprobes (void)
 {
-       undo_kpro(&undef_ho_u_t);
-       undo_kpro(&undef_ho_u);
-       undo_kpro(&undef_ho_k);
+       swap_unregister_undef_hook(&undef_ho_k);
 }
 
 //EXPORT_SYMBOL_GPL (dbi_arch_uprobe_return);
index 921b6e5..5091f72 100644 (file)
@@ -498,6 +498,11 @@ struct arch_specific_insn {
 
 typedef kprobe_opcode_t (*entry_point_t) (unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
 
+struct undef_hook;
+
+void swap_register_undef_hook(struct undef_hook *hook);
+void swap_unregister_undef_hook(struct undef_hook *hook);
+
 //void gen_insn_execbuf (void);
 //void pc_dep_insn_execbuf (void);
 //void gen_insn_execbuf_holder (void);
index 0fc4f9d..8b49dda 100644 (file)
@@ -91,8 +91,6 @@ void save_previous_kprobe (struct kprobe_ctlblk *kcb, struct kprobe *cur_p);
 void restore_previous_kprobe (struct kprobe_ctlblk *kcb);
 void set_current_kprobe (struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb);
 
-int kprobe_handler (struct pt_regs *regs);
-
 int setjmp_pre_handler (struct kprobe *p, struct pt_regs *regs);
 
 void dbi_jprobe_return (void);
index ee6b580..2e39530 100644 (file)
@@ -1,5 +1,6 @@
 #include <dbi_kprobes.h>
 #include <asm/dbi_kprobes.h>
+#include <asm/traps.h>
 
 // FIXME:
 #include <dbi_kdebug.h>
@@ -13,6 +14,7 @@ void pc_dep_insn_execbuf(void);
 void gen_insn_execbuf(void);
 void gen_insn_execbuf_thumb(void);
 void pc_dep_insn_execbuf_thumb(void);
+int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr);
 
 
 #define sign_extend(x, signbit) ((x) | (0 - ((x) & (1 << (signbit)))))
@@ -582,3 +584,35 @@ int arch_prepare_uprobe(struct kprobe *p, struct task_struct *task, int atomic)
 
        return ret;
 }
+
+/* userspace probes hook (arm) */
+static struct undef_hook undef_hook_for_us_arm = {
+       .instr_mask     = 0xffffffff,
+       .instr_val      = BREAKPOINT_INSTRUCTION,
+       .cpsr_mask      = MODE_MASK,
+       .cpsr_val       = USR_MODE,
+       .fn             = kprobe_trap_handler
+};
+
+/* userspace probes hook (thumb) */
+static struct undef_hook undef_hook_for_us_thumb = {
+       .instr_mask     = 0xffffffff,
+       .instr_val      = BREAKPOINT_INSTRUCTION & 0x0000ffff,
+       .cpsr_mask      = MODE_MASK,
+       .cpsr_val       = USR_MODE,
+       .fn             = kprobe_trap_handler
+};
+
+int swap_arch_init_uprobes(void)
+{
+       swap_register_undef_hook(&undef_hook_for_us_arm);
+       swap_register_undef_hook(&undef_hook_for_us_thumb);
+
+       return 0;
+}
+
+void swap_arch_exit_uprobes(void)
+{
+       swap_unregister_undef_hook(&undef_hook_for_us_thumb);
+       swap_unregister_undef_hook(&undef_hook_for_us_arm);
+}
index 84cf3fc..74ce81b 100644 (file)
@@ -6,4 +6,7 @@ struct task_struct;
 
 int arch_prepare_uprobe(struct kprobe *p, struct task_struct *task, int atomic);
 
+int swap_arch_init_uprobes(void);
+void swap_arch_exit_uprobes(void);
+
 #endif /* _ARM_SWAP_UPROBES_H */
index dadaa7f..01dbf9d 100644 (file)
@@ -459,11 +459,12 @@ static int __init init_uprobes(void)
                init_uprobes_insn_slots(i);
        }
 
-       return 0;
+       return swap_arch_init_uprobes();
 }
 
 static void __exit exit_uprobes(void)
 {
+       swap_arch_exit_uprobes();
 }
 
 EXPORT_SYMBOL_GPL(dbi_uprobe_return);