target/arm_disassembler: add exception related disassembly
Add ERET/HVC/SMC disassebly decoding flow, below is testing result > mdw 0x5c 4 0x0000005c: e160006e e1400072 e1600073 ee110f10 > arm disassemble 0x5c 4 0x0000005c 0xe160006e ERET 0x00000060 0xe1400072 HVC 0x0002 0x00000064 0xe1600073 SMC 0x0003 0x00000068 0xee110f10 MRC p15, 0x00, r0, c1, c0, 0x00 > Change-Id: I1beccff885b5b37747edd0b2e9fb2297ce466a00 Signed-off-by: pierre Kuo <vichy.kuo@gmail.com> Reviewed-on: http://openocd.zylin.com/2548 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>__archive__
parent
e00a56bede
commit
5e005f4129
|
@ -1403,17 +1403,46 @@ static int evaluate_misc_instr(uint32_t opcode,
|
|||
Rn);
|
||||
}
|
||||
|
||||
/* Software breakpoints */
|
||||
/* exception return */
|
||||
if ((opcode & 0x0000000f0) == 0x00000060) {
|
||||
if (((opcode & 0x600000) >> 21) == 3)
|
||||
instruction->type = ARM_ERET;
|
||||
snprintf(instruction->text,
|
||||
128,
|
||||
"0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\tERET",
|
||||
address,
|
||||
opcode);
|
||||
}
|
||||
|
||||
/* exception generate instructions */
|
||||
if ((opcode & 0x0000000f0) == 0x00000070) {
|
||||
uint32_t immediate;
|
||||
instruction->type = ARM_BKPT;
|
||||
immediate = ((opcode & 0x000fff00) >> 4) | (opcode & 0xf);
|
||||
uint32_t immediate = 0;
|
||||
char *mnemonic = NULL;
|
||||
|
||||
switch ((opcode & 0x600000) >> 21) {
|
||||
case 0x1:
|
||||
instruction->type = ARM_BKPT;
|
||||
mnemonic = "BRKT";
|
||||
immediate = ((opcode & 0x000fff00) >> 4) | (opcode & 0xf);
|
||||
break;
|
||||
case 0x2:
|
||||
instruction->type = ARM_HVC;
|
||||
mnemonic = "HVC";
|
||||
immediate = ((opcode & 0x000fff00) >> 4) | (opcode & 0xf);
|
||||
break;
|
||||
case 0x3:
|
||||
instruction->type = ARM_SMC;
|
||||
mnemonic = "SMC";
|
||||
immediate = (opcode & 0xf);
|
||||
break;
|
||||
}
|
||||
|
||||
snprintf(instruction->text,
|
||||
128,
|
||||
"0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\tBKPT 0x%4.4" PRIx32 "",
|
||||
"0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\t%s 0x%4.4" PRIx32 "",
|
||||
address,
|
||||
opcode,
|
||||
mnemonic,
|
||||
immediate);
|
||||
}
|
||||
|
||||
|
|
|
@ -84,9 +84,14 @@ enum arm_instruction_type {
|
|||
/* Miscellaneous instructions */
|
||||
ARM_CLZ,
|
||||
|
||||
/* Exception return instructions */
|
||||
ARM_ERET,
|
||||
|
||||
/* Exception generating instructions */
|
||||
ARM_BKPT,
|
||||
ARM_SWI,
|
||||
ARM_HVC,
|
||||
ARM_SMC,
|
||||
|
||||
/* Coprocessor instructions */
|
||||
ARM_CDP,
|
||||
|
|
Loading…
Reference in New Issue