From f248da70ef7a22076d31fac1693bdb1698463ec2 Mon Sep 17 00:00:00 2001 From: Jon Medhurst Date: Sat, 2 Jul 2011 16:30:43 +0100 Subject: [PATCH] --- yaml --- r: 258351 b: refs/heads/master c: 396b41f68d937a0c48ba624186ed06288b35bb4e h: refs/heads/master i: 258349: d55f1b782f3ae7ca336c008a771caf947d0f67ae 258347: 28db7dc9bb489c0fe285857ac4ecdb752e2c52bb 258343: 809120663f9526aaea0f3345039f40bcdedf9873 258335: ad50c0ac3b9d6008411b2dff1b0a022bc57d4004 v: v3 --- [refs] | 2 +- trunk/arch/arm/kernel/kprobes-thumb.c | 38 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e7272ff6910c..20e138059703 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 444956677eccfcdfe05de761e1286f62c423ce88 +refs/heads/master: 396b41f68d937a0c48ba624186ed06288b35bb4e diff --git a/trunk/arch/arm/kernel/kprobes-thumb.c b/trunk/arch/arm/kernel/kprobes-thumb.c index 997fc6d59a40..d3133fd2d4e8 100644 --- a/trunk/arch/arm/kernel/kprobes-thumb.c +++ b/trunk/arch/arm/kernel/kprobes-thumb.c @@ -141,6 +141,35 @@ t16_decode_it(kprobe_opcode_t insn, struct arch_specific_insn *asi) return INSN_GOOD_NO_SLOT; } +static void __kprobes +t16_simulate_cond_branch(struct kprobe *p, struct pt_regs *regs) +{ + kprobe_opcode_t insn = p->opcode; + unsigned long pc = thumb_probe_pc(p); + long offset = insn & 0x7f; + offset -= insn & 0x80; /* Apply sign bit */ + regs->ARM_pc = pc + (offset * 2); +} + +static enum kprobe_insn __kprobes +t16_decode_cond_branch(kprobe_opcode_t insn, struct arch_specific_insn *asi) +{ + int cc = (insn >> 8) & 0xf; + asi->insn_check_cc = kprobe_condition_checks[cc]; + asi->insn_handler = t16_simulate_cond_branch; + return INSN_GOOD_NO_SLOT; +} + +static void __kprobes +t16_simulate_branch(struct kprobe *p, struct pt_regs *regs) +{ + kprobe_opcode_t insn = p->opcode; + unsigned long pc = thumb_probe_pc(p); + long offset = insn & 0x3ff; + offset -= insn & 0x400; /* Apply sign bit */ + regs->ARM_pc = pc + (offset * 2); +} + static unsigned long __kprobes t16_emulate_loregs(struct kprobe *p, struct pt_regs *regs) { @@ -472,6 +501,15 @@ const union decode_item kprobe_decode_thumb16_table[] = { /* SVC 1101 1111 xxxx xxxx */ DECODE_REJECT (0xfe00, 0xde00), + /* Conditional branch 1101 xxxx xxxx xxxx */ + DECODE_CUSTOM (0xf000, 0xd000, t16_decode_cond_branch), + + /* + * Unconditional branch + * B 1110 0xxx xxxx xxxx + */ + DECODE_SIMULATE (0xf800, 0xe000, t16_simulate_branch), + DECODE_END };