From 4deeb1e5a3730be6667fe1e57ea0236e29e849b8 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Fri, 5 Apr 2013 16:38:51 +0400 Subject: [PATCH] [REFACTOR] redesign arch_prepare_uprobe() -int arch_prepare_uprobe(struct uprobe *up, int atomic) +int arch_prepare_uprobe(struct uprobe *up, struct hlist_head *page_list, int atomic) --- uprobe/arch/asm-arm/swap_uprobes.c | 17 ++++++++--------- uprobe/arch/asm-arm/swap_uprobes.h | 2 +- uprobe/swap_uprobes.c | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/uprobe/arch/asm-arm/swap_uprobes.c b/uprobe/arch/asm-arm/swap_uprobes.c index d3e14f2..cf2c8b6 100644 --- a/uprobe/arch/asm-arm/swap_uprobes.c +++ b/uprobe/arch/asm-arm/swap_uprobes.c @@ -10,7 +10,6 @@ // FIXME: #include -extern struct hlist_head uprobe_insn_pages; #define flush_insns(addr, size) \ @@ -537,7 +536,7 @@ static int arch_copy_trampoline_thumb_uprobe(struct kprobe *p, struct task_struc return 0; } -int arch_prepare_uprobe(struct uprobe *up, int atomic) +int arch_prepare_uprobe(struct uprobe *up, struct hlist_head *page_list, int atomic) { int ret = 0; struct kprobe *p = &up->kp; @@ -554,7 +553,7 @@ int arch_prepare_uprobe(struct uprobe *up, int atomic) } p->opcode = insn[0]; - p->ainsn.insn_arm = get_insn_slot(task, &uprobe_insn_pages, atomic); + p->ainsn.insn_arm = get_insn_slot(task, page_list, atomic); if (!p->ainsn.insn_arm) { printk("Error in %s at %d: kprobe slot allocation error (arm)\n", __FILE__, __LINE__); return -ENOMEM; @@ -562,11 +561,11 @@ int arch_prepare_uprobe(struct uprobe *up, int atomic) ret = arch_copy_trampoline_arm_uprobe(p, task, 1); if (ret) { - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm); + free_insn_slot(page_list, task, p->ainsn.insn_arm); return -EFAULT; } - p->ainsn.insn_thumb = get_insn_slot(task, &uprobe_insn_pages, atomic); + p->ainsn.insn_thumb = get_insn_slot(task, page_list, atomic); if (!p->ainsn.insn_thumb) { printk("Error in %s at %d: kprobe slot allocation error (thumb)\n", __FILE__, __LINE__); return -ENOMEM; @@ -574,8 +573,8 @@ int arch_prepare_uprobe(struct uprobe *up, int atomic) ret = arch_copy_trampoline_thumb_uprobe(p, task, 1); if (ret) { - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm); - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb); + free_insn_slot(page_list, task, p->ainsn.insn_arm); + free_insn_slot(page_list, task, p->ainsn.insn_thumb); return -EFAULT; } @@ -586,8 +585,8 @@ int arch_prepare_uprobe(struct uprobe *up, int atomic) panic("Failed to write memory %p!\n", p->addr); } - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm); - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb); + free_insn_slot(page_list, task, p->ainsn.insn_arm); + free_insn_slot(page_list, task, p->ainsn.insn_thumb); return -EFAULT; } diff --git a/uprobe/arch/asm-arm/swap_uprobes.h b/uprobe/arch/asm-arm/swap_uprobes.h index a34f8a2..1e2c66b 100644 --- a/uprobe/arch/asm-arm/swap_uprobes.h +++ b/uprobe/arch/asm-arm/swap_uprobes.h @@ -10,7 +10,7 @@ static inline void dbi_arch_uprobe_return(void) { } -int arch_prepare_uprobe(struct uprobe *up, int atomic); +int arch_prepare_uprobe(struct uprobe *up, struct hlist_head *page_list, int atomic); int setjmp_upre_handler(struct kprobe *p, struct pt_regs *regs); static inline int longjmp_break_uhandler(struct kprobe *p, struct pt_regs *regs) diff --git a/uprobe/swap_uprobes.c b/uprobe/swap_uprobes.c index a60c38f..fce7b4b 100644 --- a/uprobe/swap_uprobes.c +++ b/uprobe/swap_uprobes.c @@ -551,7 +551,7 @@ int dbi_register_uprobe(struct uprobe *up, int atomic) goto out; } - ret = arch_prepare_uprobe(up, atomic); + ret = arch_prepare_uprobe(up, &uprobe_insn_pages, atomic); if (ret) { DBPRINTF("goto out\n", ret); goto out; -- 2.7.4