|
@@ -378,17 +378,6 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
|
|
|
* single-stepped a copy of the instruction. The address of this
|
|
|
* copy is p->ainsn.insn.
|
|
|
*/
|
|
|
-static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- unsigned int insn = *p->ainsn.insn;
|
|
|
-
|
|
|
- regs->nip = (unsigned long)p->addr;
|
|
|
- ret = emulate_step(regs, insn);
|
|
|
- if (ret == 0)
|
|
|
- regs->nip = (unsigned long)p->addr + 4;
|
|
|
-}
|
|
|
-
|
|
|
static int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|
|
{
|
|
|
struct kprobe *cur = kprobe_running();
|
|
@@ -406,7 +395,8 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|
|
cur->post_handler(cur, regs, 0);
|
|
|
}
|
|
|
|
|
|
- resume_execution(cur, regs);
|
|
|
+ /* Adjust nip to after the single-stepped instruction */
|
|
|
+ regs->nip = (unsigned long)cur->addr + 4;
|
|
|
regs->msr |= kcb->kprobe_saved_msr;
|
|
|
|
|
|
/*Restore back the original saved kprobes variables and continue. */
|