From 809120663f9526aaea0f3345039f40bcdedf9873 Mon Sep 17 00:00:00 2001 From: Jon Medhurst Date: Sat, 2 Jul 2011 15:51:03 +0100 Subject: [PATCH] --- yaml --- r: 258343 b: refs/heads/master c: a9c3c29e72cc459be0ecd597f0af11a67713175b h: refs/heads/master i: 258341: 213029e2060837fd7461f8dacbb73f19a0b6cafa 258339: b358bac6ff062bbf7d9d511592b30d6f111c58a0 258335: ad50c0ac3b9d6008411b2dff1b0a022bc57d4004 v: v3 --- [refs] | 2 +- trunk/arch/arm/kernel/kprobes-thumb.c | 37 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e0286efb67fc..49ec28d14860 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 059987ffa7f8905fada25c8af1734e254209c55d +refs/heads/master: a9c3c29e72cc459be0ecd597f0af11a67713175b diff --git a/trunk/arch/arm/kernel/kprobes-thumb.c b/trunk/arch/arm/kernel/kprobes-thumb.c index e1cef8273126..b457da0e7397 100644 --- a/trunk/arch/arm/kernel/kprobes-thumb.c +++ b/trunk/arch/arm/kernel/kprobes-thumb.c @@ -26,6 +26,31 @@ */ #define current_cond(cpsr) ((cpsr >> 12) & 0xf) +/* + * Return the PC value for a probe in thumb code. + * This is the address of the probed instruction plus 4. + * We subtract one because the address will have bit zero set to indicate + * a pointer to thumb code. + */ +static inline unsigned long __kprobes thumb_probe_pc(struct kprobe *p) +{ + return (unsigned long)p->addr - 1 + 4; +} + +static void __kprobes +t16_simulate_bxblx(struct kprobe *p, struct pt_regs *regs) +{ + kprobe_opcode_t insn = p->opcode; + unsigned long pc = thumb_probe_pc(p); + int rm = (insn >> 3) & 0xf; + unsigned long rmv = (rm == 15) ? pc : regs->uregs[rm]; + + if (insn & (1 << 7)) /* BLX ? */ + regs->ARM_lr = (unsigned long)p->addr + 2; + + bx_write_pc(rmv, regs); +} + static unsigned long __kprobes t16_emulate_loregs(struct kprobe *p, struct pt_regs *regs) { @@ -131,6 +156,18 @@ const union decode_item kprobe_decode_thumb16_table[] = { /* MVN (register) 0100 0011 10xx xxxx */ DECODE_EMULATE (0xfc00, 0x4000, t16_emulate_loregs_noitrwflags), + /* + * Special data instructions and branch and exchange + * 0100 01xx xxxx xxxx + */ + + /* BLX pc 0100 0111 1111 1xxx */ + DECODE_REJECT (0xfff8, 0x47f8), + + /* BX (register) 0100 0111 0xxx xxxx */ + /* BLX (register) 0100 0111 1xxx xxxx */ + DECODE_SIMULATE (0xff00, 0x4700, t16_simulate_bxblx), + /* * Miscellaneous 16-bit instructions * 1011 xxxx xxxx xxxx