aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/kprobes.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/kprobes.c')
-rw-r--r--arch/powerpc/kernel/kprobes.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index 23545a2f51f3..74693d91731f 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -95,6 +95,11 @@ void __kprobes arch_remove_kprobe(struct kprobe *p)
95 95
96static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) 96static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
97{ 97{
98 /* We turn off async exceptions to ensure that the single step will
99 * be for the instruction we have the kprobe on, if we dont its
100 * possible we'd get the single step reported for an exception handler
101 * like Decrementer or External Interrupt */
102 regs->msr &= ~MSR_EE;
98 regs->msr |= MSR_SE; 103 regs->msr |= MSR_SE;
99 104
100 /* 105 /*
@@ -376,6 +381,10 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
376 if (!cur) 381 if (!cur)
377 return 0; 382 return 0;
378 383
384 /* make sure we got here for instruction we have a kprobe on */
385 if (((unsigned long)cur->ainsn.insn + 4) != regs->nip)
386 return 0;
387
379 if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { 388 if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
380 kcb->kprobe_status = KPROBE_HIT_SSDONE; 389 kcb->kprobe_status = KPROBE_HIT_SSDONE;
381 cur->post_handler(cur, regs, 0); 390 cur->post_handler(cur, regs, 0);