|
@@ -149,9 +149,9 @@ t32_decode_ldmstm(probes_opcode_t insn, struct arch_probes_insn *asi,
|
|
|
enum probes_insn ret = kprobe_decode_ldmstm(insn, asi, d);
|
|
|
|
|
|
/* Fixup modified instruction to have halfwords in correct order...*/
|
|
|
- insn = asi->insn[0];
|
|
|
- ((u16 *)asi->insn)[0] = insn >> 16;
|
|
|
- ((u16 *)asi->insn)[1] = insn & 0xffff;
|
|
|
+ insn = __mem_to_opcode_arm(asi->insn[0]);
|
|
|
+ ((u16 *)asi->insn)[0] = __opcode_to_mem_thumb16(insn >> 16);
|
|
|
+ ((u16 *)asi->insn)[1] = __opcode_to_mem_thumb16(insn & 0xffff);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -516,7 +516,7 @@ t16_decode_hiregs(probes_opcode_t insn, struct arch_probes_insn *asi,
|
|
|
{
|
|
|
insn &= ~0x00ff;
|
|
|
insn |= 0x001; /* Set Rdn = R1 and Rm = R0 */
|
|
|
- ((u16 *)asi->insn)[0] = insn;
|
|
|
+ ((u16 *)asi->insn)[0] = __opcode_to_mem_thumb16(insn);
|
|
|
asi->insn_handler = t16_emulate_hiregs;
|
|
|
return INSN_GOOD;
|
|
|
}
|
|
@@ -547,8 +547,10 @@ t16_decode_push(probes_opcode_t insn, struct arch_probes_insn *asi,
|
|
|
* and call it with R9=SP and LR in the register list represented
|
|
|
* by R8.
|
|
|
*/
|
|
|
- ((u16 *)asi->insn)[0] = 0xe929; /* 1st half STMDB R9!,{} */
|
|
|
- ((u16 *)asi->insn)[1] = insn & 0x1ff; /* 2nd half (register list) */
|
|
|
+ /* 1st half STMDB R9!,{} */
|
|
|
+ ((u16 *)asi->insn)[0] = __opcode_to_mem_thumb16(0xe929);
|
|
|
+ /* 2nd half (register list) */
|
|
|
+ ((u16 *)asi->insn)[1] = __opcode_to_mem_thumb16(insn & 0x1ff);
|
|
|
asi->insn_handler = t16_emulate_push;
|
|
|
return INSN_GOOD;
|
|
|
}
|
|
@@ -600,8 +602,10 @@ t16_decode_pop(probes_opcode_t insn, struct arch_probes_insn *asi,
|
|
|
* and call it with R9=SP and PC in the register list represented
|
|
|
* by R8.
|
|
|
*/
|
|
|
- ((u16 *)asi->insn)[0] = 0xe8b9; /* 1st half LDMIA R9!,{} */
|
|
|
- ((u16 *)asi->insn)[1] = insn & 0x1ff; /* 2nd half (register list) */
|
|
|
+ /* 1st half LDMIA R9!,{} */
|
|
|
+ ((u16 *)asi->insn)[0] = __opcode_to_mem_thumb16(0xe8b9);
|
|
|
+ /* 2nd half (register list) */
|
|
|
+ ((u16 *)asi->insn)[1] = __opcode_to_mem_thumb16(insn & 0x1ff);
|
|
|
asi->insn_handler = insn & 0x100 ? t16_emulate_pop_pc
|
|
|
: t16_emulate_pop_nopc;
|
|
|
return INSN_GOOD;
|