From 2a8768f8356d0f6ead7da0bc92463805ee203eaf Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Tue, 12 Mar 2013 13:00:38 +0400 Subject: [PATCH] [REFACTOR] decompose arch_remove_kprobe() on arch_remove_kprobe() and arch_remove_uprobe() --- kprobe/arch/dbi_kprobes.c | 21 +++++++++++++-------- kprobe/arch/dbi_kprobes.h | 3 ++- kprobe/dbi_kprobes.c | 6 +++++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/kprobe/arch/dbi_kprobes.c b/kprobe/arch/dbi_kprobes.c index 52ee35b..1d56e43 100644 --- a/kprobe/arch/dbi_kprobes.c +++ b/kprobe/arch/dbi_kprobes.c @@ -61,19 +61,24 @@ extern struct hlist_head kprobe_insn_pages; extern struct hlist_head uprobe_insn_pages; -void arch_remove_kprobe (struct kprobe *p, struct task_struct *task) +void arch_remove_kprobe(struct kprobe *p) { // TODO: check boostable for x86 and MIPS - if (p->tgid) { + free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn); +} + +void arch_remove_uprobe(struct kprobe *p, struct task_struct *task) +{ + if (p->tgid == 0) { + panic("arch_remove_uprobe for tgid == 0!!!"); + } + #ifdef CONFIG_ARM - 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(&uprobe_insn_pages, task, p->ainsn.insn_arm); + free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb); #else /* CONFIG_ARM */ - free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn); + free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn); #endif /* CONFIG_ARM */ - } else { - free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn); - } } void arch_arm_uprobe (struct kprobe *p, struct task_struct *tsk) diff --git a/kprobe/arch/dbi_kprobes.h b/kprobe/arch/dbi_kprobes.h index 8b49dda..06ebc11 100644 --- a/kprobe/arch/dbi_kprobes.h +++ b/kprobe/arch/dbi_kprobes.h @@ -84,7 +84,8 @@ extern int patch_suspended_task(struct kretprobe *rp, struct task_struct *tsk); void dbi_arch_uprobe_return (void); -void arch_remove_kprobe (struct kprobe *p, struct task_struct *task); +void arch_remove_kprobe(struct kprobe *p); +void arch_remove_uprobe(struct kprobe *p, struct task_struct *task); void prepare_singlestep (struct kprobe *p, struct pt_regs *regs); void save_previous_kprobe (struct kprobe_ctlblk *kcb, struct kprobe *cur_p); diff --git a/kprobe/dbi_kprobes.c b/kprobe/dbi_kprobes.c index d8f89d4..1a42e1b 100644 --- a/kprobe/dbi_kprobes.c +++ b/kprobe/dbi_kprobes.c @@ -576,7 +576,11 @@ valid_p: synchronize_sched(); } - arch_remove_kprobe (p, task); + if (pid) { + arch_remove_uprobe(p, task); + } else { + arch_remove_kprobe(p); + } } else { -- 2.7.4