=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: winedbg: Add hint operators to Thumb2 disassembler.
Alexandre Julliard
julliard at winehq.org
Wed Oct 3 13:20:35 CDT 2012
Module: wine
Branch: master
Commit: 613ebcd07043a7eefc45fd92b9933f9ab334ec79
URL: http://source.winehq.org/git/wine.git/?a=commit;h=613ebcd07043a7eefc45fd92b9933f9ab334ec79
Author: André Hentschel <nerv at dawncrow.de>
Date: Wed Oct 3 00:21:38 2012 +0200
winedbg: Add hint operators to Thumb2 disassembler.
---
programs/winedbg/be_arm.c | 38 +++++++++++++++++++++++++++++++++-----
1 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/programs/winedbg/be_arm.c b/programs/winedbg/be_arm.c
index a045e49..37b3a5b 100644
--- a/programs/winedbg/be_arm.c
+++ b/programs/winedbg/be_arm.c
@@ -97,6 +97,10 @@ static char const tbl_special_regs_t2[][12] = {
"rsvd", "rsvd", "rsvd", "rsvd", "primask", "basepri", "basepri_max", "faultmask", "control"
};
+static char const tbl_hints_t2[][6] = {
+ "nop", "yield", "wfe", "wfi", "sev"
+};
+
static UINT db_get_inst(void* addr, int size)
{
UINT result = 0;
@@ -686,6 +690,28 @@ static UINT thumb2_disasm_srtrans(UINT inst, ADDRESS64 *addr)
return inst;
}
+static UINT thumb2_disasm_hint(UINT inst, ADDRESS64 *addr)
+{
+ WORD op1 = (inst >> 8) & 0x07;
+ WORD op2 = inst & 0xff;
+
+ if (op1) return inst;
+
+ if (op2 <= 4)
+ {
+ dbg_printf("\n\t%s", tbl_hints_t2[op2]);
+ return 0;
+ }
+
+ if (op2 & 0xf0)
+ {
+ dbg_printf("\n\tdbg\t#%u", get_nibble(inst, 0));
+ return 0;
+ }
+
+ return inst;
+}
+
static UINT thumb2_disasm_misc(UINT inst, ADDRESS64 *addr)
{
WORD op1 = (inst >> 20) & 0x03;
@@ -989,8 +1015,10 @@ static const struct inst_thumb16 tbl_thumb16[] = {
};
static const struct inst_arm tbl_thumb32[] = {
- { 0xf800f000, 0xf0008000, thumb2_disasm_branch },
- { 0xff90f000, 0xf3808000, thumb2_disasm_srtrans },
+ { 0xfff0f000, 0xf3e08000, thumb2_disasm_srtrans },
+ { 0xfff0f000, 0xf3808000, thumb2_disasm_srtrans },
+ { 0xfff0d000, 0xf3a08000, thumb2_disasm_hint },
+ { 0xf8008000, 0xf0008000, thumb2_disasm_branch },
{ 0xffc0f0c0, 0xfa80f080, thumb2_disasm_misc },
{ 0xff80f000, 0xfa00f000, thumb2_disasm_dataprocessingreg },
{ 0xff8000c0, 0xfb000000, thumb2_disasm_mul },
@@ -1033,7 +1061,7 @@ void be_arm_disasm_one_insn(ADDRESS64 *addr, int display)
size = ARM_INSN_SIZE;
inst = db_get_inst( memory_to_linear_addr(addr), size );
while (a_ptr->func) {
- if ((inst & a_ptr->mask) == a_ptr->pattern) {
+ if ((inst & a_ptr->mask) == a_ptr->pattern) {
matched = 1;
break;
}
@@ -1066,7 +1094,7 @@ void be_arm_disasm_one_insn(ADDRESS64 *addr, int display)
inst |= (tinst << 16);
while (t2_ptr->func) {
- if ((inst & t2_ptr->mask) == t2_ptr->pattern) {
+ if ((inst & t2_ptr->mask) == t2_ptr->pattern) {
matched = 1;
break;
}
@@ -1089,7 +1117,7 @@ void be_arm_disasm_one_insn(ADDRESS64 *addr, int display)
size = THUMB_INSN_SIZE;
while (t_ptr->func) {
- if ((tinst & t_ptr->mask) == t_ptr->pattern) {
+ if ((tinst & t_ptr->mask) == t_ptr->pattern) {
matched = 1;
break;
}
More information about the wine-cvs
mailing list