From c2e5f3b91ba3013acb6256c0c66eed4abdd6832a Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Wed, 14 Jul 2010 05:21:22 +0100 Subject: [PATCH] --- yaml --- r: 200999 b: refs/heads/master c: 0ebe25f90cd99bb1bcf622ec8a841421d48380d6 h: refs/heads/master i: 200997: 3b8b8372599664505086b8c504e678591a19eafe 200995: 36b7fbe19484c81b9bc03505804aedf45ed4f1c6 200991: 2b7ab516224987f7bcc496a2b7c348c4af278b5a v: v3 --- [refs] | 2 +- trunk/arch/arm/kernel/kprobes-decode.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 0895217c2a2e..4037e2fa4a7b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d8495378e25b3ffd40d7a78effba2566f1fe65cf +refs/heads/master: 0ebe25f90cd99bb1bcf622ec8a841421d48380d6 diff --git a/trunk/arch/arm/kernel/kprobes-decode.c b/trunk/arch/arm/kernel/kprobes-decode.c index da1f94906a4e..8bccbfa693ff 100644 --- a/trunk/arch/arm/kernel/kprobes-decode.c +++ b/trunk/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);