From: Jon Medhurst Date: Wed, 20 Apr 2011 18:29:52 +0000 (+0100) Subject: ARM: kprobes: Add condition code checking to Thumb emulation X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=eaf4f33feca2704ad1d06f1ef6b427712c506cc0;p=linux-beck.git ARM: kprobes: Add condition code checking to Thumb emulation Signed-off-by: Jon Medhurst Acked-by: Nicolas Pitre --- diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c index ac6b2d138ee5..24a188b1601a 100644 --- a/arch/arm/kernel/kprobes-thumb.c +++ b/arch/arm/kernel/kprobes-thumb.c @@ -13,14 +13,36 @@ #include "kprobes.h" + +/* + * True if current instruction is in an IT block. + */ +#define in_it_block(cpsr) ((cpsr & 0x06000c00) != 0x00000000) + +/* + * Return the condition code to check for the currently executing instruction. + * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if + * in_it_block returns true. + */ +#define current_cond(cpsr) ((cpsr >> 12) & 0xf) + +static unsigned long __kprobes thumb_check_cc(unsigned long cpsr) +{ + if (unlikely(in_it_block(cpsr))) + return kprobe_condition_checks[current_cond(cpsr)](cpsr); + return true; +} + enum kprobe_insn __kprobes thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) { + asi->insn_check_cc = thumb_check_cc; return INSN_REJECTED; } enum kprobe_insn __kprobes thumb32_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) { + asi->insn_check_cc = thumb_check_cc; return INSN_REJECTED; }