From: Vyacheslav Cherkashin Date: Tue, 30 Apr 2013 10:54:11 +0000 (+0400) Subject: Merge commit 'e27784e31bd662313ac83c1632a70b51e5d86563' into kernel X-Git-Tag: Tizen_SDK_2.3~525 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f759c2f02574eadb2862497cb9970c0077192e3e;p=kernel%2Fswap-modules.git Merge commit 'e27784e31bd662313ac83c1632a70b51e5d86563' into kernel Conflicts: src/modules/kprobe/arch/asm-arm/dbi_kprobes.c src/modules/kprobe/arch/asm-arm/dbi_kprobes.h src/modules/kprobe/arch/dbi_kprobes.h --- f759c2f02574eadb2862497cb9970c0077192e3e diff --cc kprobe/arch/asm-arm/dbi_kprobes.c index 22c982e,c976d79..a57053a --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@@ -353,36 -1234,62 +353,36 @@@ int kprobe_trap_handler(struct pt_regs oops_in_progress = swap_oops_in_progress; #endif - if(msg_out) { - printk(msg_out); - } - - return err_out; + return ret; } -int setjmp_pre_handler (struct kprobe *p, struct pt_regs *regs) +int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) { - struct jprobe *jp = container_of (p, struct jprobe, kp); - kprobe_pre_entry_handler_t pre_entry; - entry_point_t entry; - -# ifdef REENTER -// p = kprobe_running(regs); -# endif - - DBPRINTF ("pjp = 0x%p jp->entry = 0x%p", jp, jp->entry); - entry = (entry_point_t) jp->entry; - pre_entry = (kprobe_pre_entry_handler_t) jp->pre_entry; - //if(!entry) - // DIE("entry NULL", regs) - DBPRINTF ("entry = 0x%p jp->entry = 0x%p", entry, jp->entry); - - //call handler for all kernel probes and user space ones which belong to current tgid - if (!p->tgid || (p->tgid == current->tgid)) - { - if(!p->tgid && ((unsigned int)p->addr == sched_addr) && sched_rp) { - struct thread_info *tinfo = (struct thread_info *)regs->ARM_r2; - patch_suspended_task(sched_rp, tinfo->task, regs); - } - if (pre_entry) - p->ss_addr = (void *)pre_entry (jp->priv_arg, regs); - if (entry){ - entry (regs->ARM_r0, regs->ARM_r1, regs->ARM_r2, regs->ARM_r3, regs->ARM_r4, regs->ARM_r5); - } - else { - if (p->tgid) - dbi_arch_uprobe_return (); - else - dbi_jprobe_return (); - } + struct jprobe *jp = container_of(p, struct jprobe, kp); + kprobe_pre_entry_handler_t pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry; + entry_point_t entry = (entry_point_t)jp->entry; + pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry; + + if (((unsigned long)p->addr == sched_addr) && sched_rp) { + struct thread_info *tinfo = (struct thread_info *)regs->ARM_r2; - patch_suspended_task(sched_rp, tinfo->task); ++ patch_suspended_task(sched_rp, tinfo->task, regs); } - else if (p->tgid) - dbi_arch_uprobe_return (); - prepare_singlestep (p, regs); + if (pre_entry) { + p->ss_addr = (void *)pre_entry (jp->priv_arg, regs); + } - return 1; -} + if (entry) { + entry(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2, + regs->ARM_r3, regs->ARM_r4, regs->ARM_r5); + } else { + dbi_jprobe_return(); + } -void dbi_jprobe_return (void) -{ + return 0; } -void dbi_arch_uprobe_return (void) +void dbi_jprobe_return (void) { } diff --cc kprobe/arch/asm-arm/dbi_kprobes.h index a98f37b,7f6f59e..3bd5b3f --- a/kprobe/arch/asm-arm/dbi_kprobes.h +++ b/kprobe/arch/asm-arm/dbi_kprobes.h @@@ -62,11 -66,12 +62,17 @@@ typedef unsigned long kprobe_opcode_t #define UREGS_OFFSET 8 +struct prev_kprobe { + struct kprobe *kp; + unsigned long status; +}; + + static inline unsigned long *arch_get_patch_addr(struct task_struct *p, + struct pt_regs *regs) + { + return &task_thread_info(p)->cpu_context.pc; + } + static inline unsigned long arch_get_task_pc(struct task_struct *p) { return task_thread_info(p)->cpu_context.pc; diff --cc kprobe/dbi_kprobes.c index 6edfe3c,770e7c9..47b91f7 --- a/kprobe/dbi_kprobes.c +++ b/kprobe/dbi_kprobes.c @@@ -780,17 -801,19 +780,20 @@@ struct kretprobe *clone_kretprobe(struc return clone; } +EXPORT_SYMBOL_GPL(clone_kretprobe); - static void inline set_task_trampoline(struct task_struct *p, struct kretprobe_instance *ri, unsigned long tramp_addr) + static void inline set_task_trampoline(unsigned long *patch_addr, + struct kretprobe_instance *ri, + unsigned long tramp_addr) { - unsigned long pc = arch_get_task_pc(p); + unsigned long pc = *patch_addr; if (pc == tramp_addr) panic("[%d] %s (%d/%d): pc = %08lx --- [%d] %s (%d/%d)\n", - task_cpu(p), p->comm, p->tgid, p->pid, pc, - task_cpu(current), current->comm, current->tgid, current->pid); + task_cpu(ri->task), ri->task->comm, ri->task->tgid, + ri->task->pid, pc, task_cpu(current), current->comm, + current->tgid, current->pid); ri->ret_addr = (kprobe_opcode_t *)pc; - arch_set_task_pc(p, tramp_addr); + *patch_addr = tramp_addr; } static void inline rm_task_trampoline(struct task_struct *p, struct kretprobe_instance *ri) @@@ -865,9 -891,11 +871,10 @@@ int patch_suspended_task(struct kretpro return -ENOMEM; ri->rp = rp; - ri->rp2 = NULL; ri->task = task; ri->sp = NULL; - set_task_trampoline(task, ri, (unsigned long)tramp); + patch_addr = arch_get_patch_addr(task, regs); + set_task_trampoline(patch_addr, ri, (unsigned long)tramp); add_rp_inst(ri); spin_unlock_irqrestore(&kretprobe_lock, flags); diff --cc kprobe/dbi_kprobes.h index 4458f6f,01cf0ef..c1b3d90 --- a/kprobe/dbi_kprobes.h +++ b/kprobe/dbi_kprobes.h @@@ -275,8 -283,5 +275,10 @@@ struct kprobe *kprobe_running (void) void reset_current_kprobe (void); struct kprobe_ctlblk *get_kprobe_ctlblk (void); +void prepare_singlestep(struct kprobe *p, struct pt_regs *regs); - int patch_suspended_task(struct kretprobe *rp, struct task_struct *tsk); ++int patch_suspended_task(struct kretprobe *rp, ++ struct task_struct *task, ++ struct pt_regs *regs); + #endif /* _DBI_KPROBES_H */