From: Nicolas Pitre Date: Wed, 14 Jul 2010 04:21:22 +0000 (+0100) Subject: ARM: 6226/1: fix kprobe bug in ldr instruction emulation X-Git-Tag: v2.6.35-rc6~40^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0ebe25f90cd99bb1bcf622ec8a841421d48380d6;p=profile%2Fcommon%2Fkernel-common.git ARM: 6226/1: fix kprobe bug in ldr instruction emulation From: Bin Yang Cc: stable@kernel.org Signed-off-by: Bin Yang Signed-off-by: Nicolas Pitre Signed-off-by: Russell King --- diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c index da1f949..8bccbfa 100644 --- a/arch/arm/kernel/kprobes-decode.c +++ b/arch/arm/kernel/kprobes-decode.c @@ -583,13 +583,14 @@ static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs) { 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);