From 36356cfd4b61dea01c5107666ded9567530ba8b8 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Fri, 5 Apr 2013 17:40:40 +0400 Subject: [PATCH] [REFACTOR] redesign arch_prepare_kprobe() -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 | 10 +++++----- kprobe/arch/asm-arm/dbi_kprobes.h | 2 +- kprobe/dbi_insn_slots.c | 2 -- kprobe/dbi_insn_slots.h | 2 -- kprobe/dbi_kprobes.c | 4 ++-- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/kprobe/arch/asm-arm/dbi_kprobes.c b/kprobe/arch/asm-arm/dbi_kprobes.c index d4c2464..2c581e0 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@ -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); } diff --git a/kprobe/arch/asm-arm/dbi_kprobes.h b/kprobe/arch/asm-arm/dbi_kprobes.h index 07fba55..8692137 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.h +++ b/kprobe/arch/asm-arm/dbi_kprobes.h @@ -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); diff --git a/kprobe/dbi_insn_slots.c b/kprobe/dbi_insn_slots.c index 659c03c..55392b7 100644 --- a/kprobe/dbi_insn_slots.c +++ b/kprobe/dbi_insn_slots.c @@ -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; diff --git a/kprobe/dbi_insn_slots.h b/kprobe/dbi_insn_slots.h index 6ac9cc3..84a642b 100644 --- a/kprobe/dbi_insn_slots.h +++ b/kprobe/dbi_insn_slots.h @@ -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 */ diff --git a/kprobe/dbi_kprobes.c b/kprobe/dbi_kprobes.c index ba496ff..3fc1984 100644 --- a/kprobe/dbi_kprobes.c +++ b/kprobe/dbi_kprobes.c @@ -64,7 +64,7 @@ #include #include -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); -- 2.7.4