[PATCH] powerpc/kprobes: fix singlestep out-of-line
We currently single-step inline if the instruction on which a kprobe is inserted is a trap variant. - variants (such as tdnei, used by BUG()) typically evaluate a condition and cause a trap only if the condition is satisfied. - kprobes uses the unconditional "trap" (0x7fe00008) and single-stepping again on this instruction, resulting in another trap without evaluating the condition is obviously incorrect. Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
054d8ff377
Коммит
0ccde0a290
|
@ -90,15 +90,15 @@ void __kprobes arch_remove_kprobe(struct kprobe *p)
|
||||||
|
|
||||||
static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
kprobe_opcode_t insn = *p->ainsn.insn;
|
|
||||||
|
|
||||||
regs->msr |= MSR_SE;
|
regs->msr |= MSR_SE;
|
||||||
|
|
||||||
/* single step inline if it is a trap variant */
|
/*
|
||||||
if (is_trap(insn))
|
* On powerpc we should single step on the original
|
||||||
regs->nip = (unsigned long)p->addr;
|
* instruction even if the probed insn is a trap
|
||||||
else
|
* variant as values in regs could play a part in
|
||||||
regs->nip = (unsigned long)p->ainsn.insn;
|
* if the trap is taken or not
|
||||||
|
*/
|
||||||
|
regs->nip = (unsigned long)p->ainsn.insn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче