|
@@ -492,6 +492,13 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
|
+unsigned long arch_deref_entry_point(void *entry)
|
|
|
+{
|
|
|
+ return (unsigned long)(((func_descr_t *)entry)->entry);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|
|
{
|
|
|
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
|
@@ -500,11 +507,9 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|
|
memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
|
|
|
|
|
|
/* setup return addr to the jprobe handler routine */
|
|
|
+ regs->nip = arch_deref_entry_point(jp->entry);
|
|
|
#ifdef CONFIG_PPC64
|
|
|
- regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
|
|
|
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
|
|
-#else
|
|
|
- regs->nip = (unsigned long)jp->entry;
|
|
|
#endif
|
|
|
|
|
|
return 1;
|