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)
{
}
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)
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);
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 */