|
@@ -225,10 +225,8 @@ int __kprobes arc_kprobe_handler(unsigned long addr, struct pt_regs *regs)
|
|
|
|
|
|
/* If we have no pre-handler or it returned 0, we continue with
|
|
|
* normal processing. If we have a pre-handler and it returned
|
|
|
- * non-zero - which is expected from setjmp_pre_handler for
|
|
|
- * jprobe, we return without single stepping and leave that to
|
|
|
- * the break-handler which is invoked by a kprobe from
|
|
|
- * jprobe_return
|
|
|
+ * non-zero - which means user handler setup registers to exit
|
|
|
+ * to another instruction, we must skip the single stepping.
|
|
|
*/
|
|
|
if (!p->pre_handler || !p->pre_handler(p, regs)) {
|
|
|
setup_singlestep(p, regs);
|
|
@@ -386,38 +384,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|
|
-{
|
|
|
- struct jprobe *jp = container_of(p, struct jprobe, kp);
|
|
|
- struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
|
|
- unsigned long sp_addr = regs->sp;
|
|
|
-
|
|
|
- kcb->jprobe_saved_regs = *regs;
|
|
|
- memcpy(kcb->jprobes_stack, (void *)sp_addr, MIN_STACK_SIZE(sp_addr));
|
|
|
- regs->ret = (unsigned long)(jp->entry);
|
|
|
-
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-void __kprobes jprobe_return(void)
|
|
|
-{
|
|
|
- __asm__ __volatile__("unimp_s");
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
|
|
-{
|
|
|
- struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
|
|
- unsigned long sp_addr;
|
|
|
-
|
|
|
- *regs = kcb->jprobe_saved_regs;
|
|
|
- sp_addr = regs->sp;
|
|
|
- memcpy((void *)sp_addr, kcb->jprobes_stack, MIN_STACK_SIZE(sp_addr));
|
|
|
- preempt_enable_no_resched();
|
|
|
-
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
static void __used kretprobe_trampoline_holder(void)
|
|
|
{
|
|
|
__asm__ __volatile__(".global kretprobe_trampoline\n"
|