[REFACTOR] redesign arch_prepare_kprobe()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 5 Apr 2013 13:40:40 +0000 (17:40 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 5 Apr 2013 13:40:40 +0000 (17:40 +0400)
-int arch_prepare_kprobe(struct kprobe *p)
+int arch_prepare_kprobe(struct kprobe *p, struct hlist_head *page_list)

kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/arch/asm-arm/dbi_kprobes.h
kprobe/dbi_insn_slots.c
kprobe/dbi_insn_slots.h
kprobe/dbi_kprobes.c

index d4c2464..2c581e0 100644 (file)
@@ -162,7 +162,7 @@ int arch_check_insn_arm(struct arch_specific_insn *ainsn)
 }
 EXPORT_SYMBOL_GPL(arch_check_insn_arm);
 
-int arch_prepare_kprobe(struct kprobe *p)
+int arch_prepare_kprobe(struct kprobe *p, struct hlist_head *page_list)
 {
        kprobe_opcode_t insns[KPROBES_TRAMP_LEN];
        int uregs, pc_dep, ret = 0;
@@ -170,7 +170,7 @@ int arch_prepare_kprobe(struct kprobe *p)
        struct arch_specific_insn ainsn;
 
        /* insn: must be on special executable page on i386. */
-       p->ainsn.insn = get_insn_slot(NULL, &kprobe_insn_pages, 0);
+       p->ainsn.insn = get_insn_slot(NULL, page_list, 0);
        if (!p->ainsn.insn)
                return -ENOMEM;
 
@@ -219,14 +219,14 @@ int arch_prepare_kprobe(struct kprobe *p)
 
                // check instructions that can write result to SP andu uses PC
                if (pc_dep  && (ARM_INSN_REG_RD(ainsn.insn[0]) == 13)) {
-                       free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+                       free_insn_slot(page_list, NULL, p->ainsn.insn);
                        ret = -EFAULT;
                } else {
                        if (uregs && pc_dep) {
                                memcpy(insns, pc_dep_insn_execbuf, sizeof(insns));
                                if (prep_pc_dep_insn_execbuf(insns, insn[0], uregs) != 0) {
                                        DBPRINTF ("failed to prepare exec buffer for insn %lx!", insn[0]);
-                                       free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+                                       free_insn_slot(page_list, NULL, p->ainsn.insn);
                                        return -EINVAL;
                                }
                                insns[6] = (kprobe_opcode_t)(p->addr + 2);
@@ -246,7 +246,7 @@ int arch_prepare_kprobe(struct kprobe *p)
 #endif
                }
        } else {
-               free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+               free_insn_slot(page_list, NULL, p->ainsn.insn);
                printk("arch_prepare_kprobe: instruction 0x%lx not instrumentation, addr=0x%p\n", insn[0], p->addr);
        }
 
index 07fba55..8692137 100644 (file)
@@ -487,7 +487,7 @@ int arch_check_insn_arm(struct arch_specific_insn *ainsn);
 int prep_pc_dep_insn_execbuf(kprobe_opcode_t *insns, kprobe_opcode_t insn, int uregs);
 
 struct kretprobe;
-int arch_prepare_kprobe(struct kprobe *p);
+int arch_prepare_kprobe(struct kprobe *p, struct hlist_head *page_list);
 void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs);
 
 void arch_arm_kprobe(struct kprobe *p);
index 659c03c..55392b7 100644 (file)
@@ -61,8 +61,6 @@ extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
                         unsigned long len, unsigned long prot,
                         unsigned long flags, unsigned long pgoff);
 
-struct hlist_head kprobe_insn_pages;
-
 struct chunk {
        unsigned long *data;
        unsigned long first_available;
index 6ac9cc3..84a642b 100644 (file)
@@ -54,6 +54,4 @@
 kprobe_opcode_t *get_insn_slot(struct task_struct *task, struct hlist_head *page_list, int atomic);
 void free_insn_slot(struct hlist_head *page_list, struct task_struct *task, kprobe_opcode_t *slot);
 
-extern struct hlist_head kprobe_insn_pages;
-
 #endif /*  _SRC_INSNS_SLOTS_H */
index ba496ff..3fc1984 100644 (file)
@@ -64,7 +64,7 @@
 #include <linux/mm.h>
 #include <linux/pagemap.h>
 
-extern struct hlist_head kprobe_insn_pages;
+struct hlist_head kprobe_insn_pages;
 
 DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
 static DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
@@ -489,7 +489,7 @@ int dbi_register_kprobe(struct kprobe *p)
                goto out;
        }
 
-       if ((ret = arch_prepare_kprobe(p)) != 0)
+       if ((ret = arch_prepare_kprobe(p, &kprobe_insn_pages)) != 0)
                goto out;
 
        DBPRINTF ("before out ret = 0x%x\n", ret);