From 096b8c386587e688f5c0c12c8a8aaf7eaeea1798 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Thu, 9 Jul 2015 22:21:02 +0300 Subject: [PATCH] [FIX] move trampoline alloc (for x86) Change-Id: I4914bc07606e002ba83df5c4444659a1df38ebb8 Signed-off-by: Vyacheslav Cherkashin --- uprobe/arch/x86/swap-asm/swap_uprobes.c | 52 ++++++++++----------------------- us_manager/pf/pf_group.c | 20 +------------ 2 files changed, 17 insertions(+), 55 deletions(-) diff --git a/uprobe/arch/x86/swap-asm/swap_uprobes.c b/uprobe/arch/x86/swap-asm/swap_uprobes.c index 2527824..d726f7e 100644 --- a/uprobe/arch/x86/swap-asm/swap_uprobes.c +++ b/uprobe/arch/x86/swap-asm/swap_uprobes.c @@ -91,7 +91,6 @@ static void restore_current_flags(struct pt_regs *regs) */ int arch_prepare_uprobe(struct uprobe *up) { - int ret = 0; struct kprobe *p = up2kp(up); struct task_struct *task = up->task; u8 *tramp = up->atramp.tramp; @@ -113,7 +112,20 @@ int arch_prepare_uprobe(struct uprobe *up) p->ainsn.boostable = swap_can_boost(tramp) ? 0 : -1; - return ret; + p->ainsn.insn = swap_slot_alloc(up->sm); + if (p->ainsn.insn == NULL) { + printk(KERN_INFO "trampoline out of memory\n"); + return -ENOMEM; + } + + if (!write_proc_vm_atomic(task, (unsigned long)p->ainsn.insn, + tramp, sizeof(up->atramp.tramp))) { + swap_slot_free(up->sm, p->ainsn.insn); + printk("failed to write memory %p!\n", tramp); + return -EINVAL; + } + + return 0; } /** @@ -177,6 +189,8 @@ void arch_prepare_uretprobe(struct uretprobe_instance *ri, struct pt_regs *regs) if (!write_proc_vm_atomic(current, regs->EREG(sp), &ra, sizeof(ra))) panic("failed to write user space func ra %lx!\n", regs->EREG(sp)); + + add_uprobe_table(&ri->rp->up.kp); } /** @@ -383,31 +397,6 @@ no_change: return; } -static int make_trampoline(struct uprobe *up) -{ - struct kprobe *p = up2kp(up); - struct task_struct *task = up->task; - void *tramp; - - tramp = swap_slot_alloc(up->sm); - if (tramp == 0) { - printk(KERN_INFO "trampoline out of memory\n"); - return -ENOMEM; - } - - if (!write_proc_vm_atomic(task, (unsigned long)tramp, - up->atramp.tramp, - sizeof(up->atramp.tramp))) { - swap_slot_free(up->sm, tramp); - panic("failed to write memory %p!\n", tramp); - return -EINVAL; - } - - p->ainsn.insn = tramp; - - return 0; -} - static int uprobe_handler(struct pt_regs *regs) { struct kprobe *p; @@ -432,15 +421,6 @@ static int uprobe_handler(struct pt_regs *regs) trampoline_uprobe_handler(p, regs); return 1; } else { - if (p->ainsn.insn == NULL) { - struct uprobe *up = kp2up(p); - - make_trampoline(up); - - /* for uretprobe */ - add_uprobe_table(p); - } - if (!p->pre_handler || !p->pre_handler(p, regs)) { if (p->ainsn.boostable == 1 && !p->post_handler) { diff --git a/us_manager/pf/pf_group.c b/us_manager/pf/pf_group.c index 345c69e..f544728 100644 --- a/us_manager/pf/pf_group.c +++ b/us_manager/pf/pf_group.c @@ -636,25 +636,7 @@ void uninstall_page(unsigned long addr) */ void install_all(void) { -#if !defined(CONFIG_ARM) - struct task_struct *task; - int tmp_oops_in_progress; - - tmp_oops_in_progress = oops_in_progress; - oops_in_progress = 1; - rcu_read_lock(); - for_each_process(task) { - if (task->tgid != task->pid) - continue; - - if (is_kthread(task)) - continue; - - check_task_and_install(task); - } - rcu_read_unlock(); - oops_in_progress = tmp_oops_in_progress; -#endif /* CONFIG_ARM */ + /* TODO: to be implemented */ } static void on_each_uninstall_proc(struct sspt_proc *proc, void *data) -- 2.7.4