Thumb disassembly
PATCH 1/1 Thumb disassembly
The attached patch implements disassembly of arm thumb instructions in the debugging dumps.
Paul
Index: arm-dis.c
===================================================================
RCS file: /cvsroot/qemu/qemu/arm-dis.c,v
retrieving revision 1.2
arm-dis.c +5 -0
@@ -1556,6 +1556,11 @@ print_insn_arm (pc, info) } is_thumb = force_thumb; +if (pc &1 ) + { + is_thumb =1 ; + pc &= ~(bfd_vma )1 ; + }#if 0 if (!is_thumb && info->symbols !=NULL )
Index: disas.c
===================================================================
RCS file: /cvsroot/qemu/qemu/disas.c,v
retrieving revision 1.21
disas.c +18 -3
@@ -108,8 +108,20 @@ bfd_vma bfd_getb32 (const bfd_byte *addrreturn (bfd_vma ) v; } -/* Disassemble this for me please... (debugging). 'flags' is only used -for i386: non zero means 16 bit code */ +#ifdef TARGET_ARM +static int +print_insn_thumb1 (bfd_vma pc,disassemble_info *info) +{ +return print_insn_arm (pc |1 , info); +} +#endif + +/* Disassemble this for me please... (debugging). 'flags' has teh following +values: +i386 - nonzero means 16 bit code +arm - nonzero means thumb code +other targets - unused +*/ void target_disas (FILE *out,target_ulong code,target_ulong size,int flags) {target_ulong pc;
@@ -137,7 +149,10 @@ void target_disas(FILE *out, target_ulon disasm_info.mach = bfd_mach_i386_i386; print_insn = print_insn_i386;#elif defined(TARGET_ARM ) - print_insn = print_insn_arm; +if (flags) + print_insn = print_insn_thumb1; +else + print_insn = print_insn_arm;#elif defined(TARGET_SPARC ) print_insn = print_insn_sparc;#elif defined(TARGET_PPC )