/* check instructions that can change PC */
if (THUMB_INSN_MATCH(UNDEF, insn) ||
+ THUMB2_INSN_MATCH(BLX1, insn) ||
+ THUMB2_INSN_MATCH(BL, insn) ||
THUMB_INSN_MATCH(SWI, insn) ||
THUMB_INSN_MATCH(BREAK, insn) ||
THUMB2_INSN_MATCH(B1, insn) ||
*((unsigned short *)tramp + 16) = (addr & 0x0000ffff) | 0x1;
*((unsigned short *)tramp + 17) = addr >> 16;
- } else if (THUMB2_INSN_MATCH(BLX1, insn) ||
- THUMB2_INSN_MATCH(BL, insn)) {
- memcpy(tramp, blx_off_insn_execbuf_thumb, tramp_len);
- *((unsigned short *)tramp + 13) = 0xdeff;
- addr = branch_t32_dest(insn, vaddr);
- *((unsigned short *)tramp + 14) = (addr & 0x0000ffff);
- *((unsigned short *)tramp + 15) = addr >> 16;
- addr = vaddr + 4;
- *((unsigned short *)tramp + 16) = (addr & 0x0000ffff) | 0x1;
- *((unsigned short *)tramp + 17) = addr >> 16;
-
} else if (THUMB_INSN_MATCH(CBZ, insn)) {
memcpy(tramp, cbz_insn_execbuf_thumb, tramp_len);
*((unsigned short *)tramp + 13) = 0xdeff;
np2: nop // stored PC-4(next insn addr) hi
nop // stored PC-4(next insn addr) lo
- .global blx_off_insn_execbuf_thumb
- .align 4
-blx_off_insn_execbuf_thumb:
- push {r0}
- ldr r0, bd3
- mov lr, r0
- pop {r0}
- blx lr
- nop
- push {r0,r1}
- ldr r0, np3
- nop
- str r0, [sp, #4]
- pop {r0,pc}
- nop
- nop // ssbreak
- nop // retbreak
-bd3: nop // branch displacement hi
- nop // branch displacement lo
-np3: nop // stored PC-4(next insn addr) hi
- nop // stored PC-4(next insn addr) lo
-
.global b_cond_insn_execbuf_thumb
.align 4
b_cond_insn_execbuf_thumb:
void pc_dep_insn_execbuf_thumb(void);
void b_r_insn_execbuf_thumb(void);
void b_off_insn_execbuf_thumb(void);
-void blx_off_insn_execbuf_thumb(void);
void b_cond_insn_execbuf_thumb(void);
void cbz_insn_execbuf_thumb(void);