| From 0ebe25f90cd99bb1bcf622ec8a841421d48380d6 Mon Sep 17 00:00:00 2001 |
| From: Nicolas Pitre <nico@fluxnic.net> |
| Date: Wed, 14 Jul 2010 05:21:22 +0100 |
| Subject: ARM: 6226/1: fix kprobe bug in ldr instruction emulation |
| |
| From: Nicolas Pitre <nico@fluxnic.net> |
| |
| commit 0ebe25f90cd99bb1bcf622ec8a841421d48380d6 upstream. |
| |
| From: Bin Yang <bin.yang@marvell.com> |
| |
| Signed-off-by: Bin Yang <bin.yang@marvell.com> |
| Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/arm/kernel/kprobes-decode.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/arch/arm/kernel/kprobes-decode.c |
| +++ b/arch/arm/kernel/kprobes-decode.c |
| @@ -583,13 +583,14 @@ static void __kprobes emulate_ldr(struct |
| { |
| insn_llret_3arg_fn_t *i_fn = (insn_llret_3arg_fn_t *)&p->ainsn.insn[0]; |
| kprobe_opcode_t insn = p->opcode; |
| + long ppc = (long)p->addr + 8; |
| union reg_pair fnr; |
| int rd = (insn >> 12) & 0xf; |
| int rn = (insn >> 16) & 0xf; |
| int rm = insn & 0xf; |
| long rdv; |
| - long rnv = regs->uregs[rn]; |
| - long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */ |
| + long rnv = (rn == 15) ? ppc : regs->uregs[rn]; |
| + long rmv = (rm == 15) ? ppc : regs->uregs[rm]; |
| long cpsr = regs->ARM_cpsr; |
| |
| fnr.dr = insnslot_llret_3arg_rflags(rnv, 0, rmv, cpsr, i_fn); |