ARM: kprobes: Add condition code checking to Thumb emulation
authorJon Medhurst <tixy@yxit.co.uk>
Wed, 20 Apr 2011 18:29:52 +0000 (19:29 +0100)
committerTixy <tixy@medhuaa1.miniserver.com>
Wed, 13 Jul 2011 17:32:42 +0000 (17:32 +0000)
Signed-off-by: Jon Medhurst <tixy@yxit.co.uk>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
arch/arm/kernel/kprobes-thumb.c

index ac6b2d138ee5223dfd7d95b9d65a2c9777e80f8a..24a188b1601a6eb0948f97d18bb9cb2dfc1ddd4c 100644 (file)
 
 #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;
 }