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]) ||
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);
# 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