fixed function 'arch_check_insn_thumb'
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 6 Nov 2012 09:37:20 +0000 (13:37 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 6 Nov 2012 09:37:20 +0000 (13:37 +0400)
added ignoring CBZ/CBNZ instruction

kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/arch/asm-arm/dbi_kprobes.h

index e29bf36..524fd92 100644 (file)
@@ -460,6 +460,7 @@ int arch_check_insn_thumb (struct arch_specific_insn *ainsn)
                THUMB2_INSN_MATCH (BL, ainsn->insn_thumb[0]) ||
                THUMB_INSN_MATCH (B1, ainsn->insn_thumb[0]) ||
                THUMB_INSN_MATCH (B2, ainsn->insn_thumb[0]) ||
+               THUMB_INSN_MATCH (CBZ, ainsn->insn_thumb[0]) ||
                THUMB2_INSN_MATCH (B1, ainsn->insn_thumb[0]) ||
                THUMB2_INSN_MATCH (B2, ainsn->insn_thumb[0]) ||
                THUMB2_INSN_MATCH (BLX1, ainsn->insn_thumb[0]) ||
@@ -674,7 +675,8 @@ int arch_prepare_uprobe (struct kprobe *p, struct task_struct *task, int atomic)
                return -EFAULT;
        }
        if ((p->safe_arm == -1) && (p->safe_thumb == -1)) {
-               printk("Error in %s at %d: failed arch_copy_trampoline_*_uprobe() (both)\n", __FILE__, __LINE__);
+               printk("Error in %s at %d: failed arch_copy_trampoline_*_uprobe() (both) addr=%p, inst=%x\n",
+                       __FILE__, __LINE__, p->addr, p->opcode);
                if (!write_proc_vm_atomic (task, (unsigned long) p->addr, &p->opcode, sizeof (p->opcode)))
                        panic ("Failed to write memory %p!\n", p->addr);
                free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm);
index faf8367..42ca319 100644 (file)
@@ -158,6 +158,9 @@ static inline int dbi_fp_backtrace(struct task_struct *task, unsigned long *buf,
 # define MASK_THUMB_INSN_B2            0xF800                  // 11111xxxxxxxxxxx
 # define PTRN_THUMB_INSN_B2            0xE000                  // 11100xxxxxxxxxxx                                             // b label
 
+# define MASK_THUMB_INSN_CBZ           0xF500                  // 1111x1x1xxxxxxxx
+# define PTRN_THUMB_INSN_CBZ           0xB100                  // 1011x0x1xxxxxxxx                                             // CBZ/CBNZ
+
 # define MASK_THUMB2_INSN_B1           0xD000F800              // 11x1xxxxxxxxxxxx 11111xxxxxxxxxxx                            // swapped
 # define PTRN_THUMB2_INSN_B1           0x8000F000              // 10x0xxxxxxxxxxxx 11110xxxxxxxxxxx                            // swapped