Merge commit 'e27784e31bd662313ac83c1632a70b51e5d86563' into kernel
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 30 Apr 2013 10:54:11 +0000 (14:54 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 30 Apr 2013 10:54:11 +0000 (14:54 +0400)
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

1  2 
kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/arch/asm-arm/dbi_kprobes.h
kprobe/arch/asm-x86/dbi_kprobes.c
kprobe/arch/asm-x86/dbi_kprobes.h
kprobe/dbi_kprobes.c
kprobe/dbi_kprobes.h

@@@ -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)
  {
  }
  
@@@ -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;
Simple merge
Simple merge
@@@ -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);
@@@ -275,8 -283,5 +275,10 @@@ struct kprobe *kprobe_running (void)
  void reset_current_kprobe (void);
  struct kprobe_ctlblk *get_kprobe_ctlblk (void);
  
- int patch_suspended_task(struct kretprobe *rp, struct task_struct *tsk);
 +void prepare_singlestep(struct kprobe *p, struct pt_regs *regs);
++int patch_suspended_task(struct kretprobe *rp,
++                       struct task_struct *task,
++                       struct pt_regs *regs);
 +
  #endif /* _DBI_KPROBES_H */