18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* General "disassemble this chunk" code. Used for debugging. */ 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "config.h" 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "dis-asm.h" 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "elf.h" 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <errno.h> 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h" 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "exec-all.h" 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "disas.h" 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Filled in by elfload.c. Simplistic, but will do for now. */ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct syminfo *syminfos = NULL; 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Get LENGTH bytes from info's buffer, at target address memaddr. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Transfer them to myaddr. */ 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbuffer_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length, 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct disassemble_info *info) 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (memaddr < info->buffer_vma 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project || memaddr + length > info->buffer_vma + info->buffer_length) 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Out of bounds. Use EIO because GDB uses it. */ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EIO; 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Get LENGTH bytes from info's buffer, at target address memaddr. 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Transfer them to myaddr. */ 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_read_memory (bfd_vma memaddr, 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bfd_byte *myaddr, 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int length, 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct disassemble_info *info) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cpu_memory_rw_debug(cpu_single_env, memaddr, myaddr, length, 0); 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Print an error message. We can assume that this is in response to 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project an error return from buffer_read_memory. */ 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerperror_memory (int status, bfd_vma memaddr, struct disassemble_info *info) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (status != EIO) 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Can't happen. */ 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*info->fprintf_func) (info->stream, "Unknown error %d\n", status); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Actually, address between memaddr and memaddr + len was 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out of bounds. */ 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*info->fprintf_func) (info->stream, 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Address 0x%" PRIx64 " is out of bounds.\n", memaddr); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This could be in a separate file, to save miniscule amounts of space 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project in statically linked executables. */ 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Just print the address is hex. This is included for completeness even 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project though both GDB and objdump provide their own (to print symbolic 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project addresses). */ 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnergeneric_print_address (bfd_vma addr, struct disassemble_info *info) 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*info->fprintf_func) (info->stream, "0x%" PRIx64, addr); 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Just return the given address. */ 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnergeneric_symbol_at_address (bfd_vma addr, struct disassemble_info *info) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 1; 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7675fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turnerbfd_vma bfd_getl64 (const bfd_byte *addr) 7775fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner{ 7875fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner unsigned long long v; 7975fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner 8075fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v = (unsigned long long) addr[0]; 8175fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[1] << 8; 8275fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[2] << 16; 8375fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[3] << 24; 8475fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[4] << 32; 8575fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[5] << 40; 8675fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[6] << 48; 8775fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner v |= (unsigned long long) addr[7] << 56; 8875fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner return (bfd_vma) v; 8975fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner} 9075fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbfd_vma bfd_getl32 (const bfd_byte *addr) 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long v; 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (unsigned long) addr[0]; 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[1] << 8; 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[2] << 16; 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[3] << 24; 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (bfd_vma) v; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbfd_vma bfd_getb32 (const bfd_byte *addr) 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long v; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (unsigned long) addr[0] << 24; 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[1] << 16; 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[2] << 8; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[3]; 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (bfd_vma) v; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbfd_vma bfd_getl16 (const bfd_byte *addr) 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long v; 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (unsigned long) addr[0]; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[1] << 8; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (bfd_vma) v; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbfd_vma bfd_getb16 (const bfd_byte *addr) 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long v; 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (unsigned long) addr[0] << 24; 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v |= (unsigned long) addr[1] << 16; 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (bfd_vma) v; 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_ARM 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprint_insn_thumb1(bfd_vma pc, disassemble_info *info) 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return print_insn_arm(pc | 1, info); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Disassemble this for me please... (debugging). 'flags' has the following 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project values: 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project i386 - nonzero means 16 bit code 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project arm - nonzero means thumb code 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ppc - nonzero means little endian 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project other targets - unused 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid target_disas(FILE *out, target_ulong code, target_ulong size, int flags) 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong pc; 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct disassemble_info disasm_info; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*print_insn)(bfd_vma pc, disassemble_info *info); 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf); 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.read_memory_func = target_read_memory; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer_vma = code; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer_length = size; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_WORDS_BIGENDIAN 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_BIG; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_LITTLE; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386) 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags == 2) 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_x86_64; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (flags == 1) 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_i386_i8086; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_i386_i386; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_i386; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_ARM) 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags) 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_thumb1; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_arm; 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC) 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_sparc; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_SPARC64 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_sparc_v9b; 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_PPC) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags >> 16) 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_LITTLE; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & 0xFFFF) { 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we have a precise definitions of the instructions set, use it */ 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = flags & 0xFFFF; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_PPC64 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_ppc64; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_ppc; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_ppc; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_M68K) 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_m68k; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_MIPS) 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_WORDS_BIGENDIAN 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_big_mips; 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_little_mips; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SH4) 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_sh4; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_sh; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_ALPHA) 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_alpha; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_alpha; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_CRIS) 2119f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner if (flags != 32) { 2129f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner disasm_info.mach = bfd_mach_cris_v0_v10; 2139f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner print_insn = print_insn_crisv10; 2149f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner } else { 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_cris_v32; 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_crisv32; 2179f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner } 2189f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner#elif defined(TARGET_S390X) 2199f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner disasm_info.mach = bfd_mach_s390_64; 2209f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner print_insn = print_insn_s390; 2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined(TARGET_MICROBLAZE) 2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner disasm_info.mach = bfd_arch_microblaze; 2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner print_insn = print_insn_microblaze; 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "0x" TARGET_FMT_lx 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ": Asm output not supported on this arch\n", code); 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (pc = code; size > 0; pc += count, size -= count) { 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "0x" TARGET_FMT_lx ": ", pc); 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project count = print_insn(pc, &disasm_info); 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t b; 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, " {"); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < count; i++) { 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_read_memory(pc + i, &b, 1, &disasm_info); 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, " %02x", b); 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, " }"); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "\n"); 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count < 0) 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (size < count) { 2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(out, 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "Disassembler disagrees with translator over instruction " 2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "decoding\n" 2525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "Please report this to qemu-devel@nongnu.org\n"); 2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Disassemble this for me please... (debugging). */ 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid disas(FILE *out, void *code, unsigned long size) 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long pc; 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count; 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct disassemble_info disasm_info; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*print_insn)(bfd_vma pc, disassemble_info *info); 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf); 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer = code; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer_vma = (unsigned long)code; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer_length = size; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27220894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_BIG; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_LITTLE; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_i386_i386; 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_i386; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__x86_64__) 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_x86_64; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_i386; 2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined(_ARCH_PPC) 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_ppc; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__alpha__) 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_alpha; 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__sparc__) 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_sparc; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || defined(__sparc_v9__) 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_sparc_v9b; 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__arm__) 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_arm; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__MIPSEB__) 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_big_mips; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__MIPSEL__) 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_little_mips; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__m68k__) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_m68k; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__s390__) 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_s390; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__hppa__) 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_hppa; 30475fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner#elif defined(__ia64__) 30575fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner print_insn = print_insn_ia64; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "0x%lx: Asm output not supported on this arch\n", 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (long) code); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (pc = (unsigned long)code; size > 0; pc += count, size -= count) { 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "0x%08lx: ", pc); 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project count = print_insn(pc, &disasm_info); 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(out, "\n"); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count < 0) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Look up symbol for debugging purpose. Returns "" if unknown. */ 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *lookup_symbol(target_ulong orig_addr) 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *symbol = ""; 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct syminfo *s; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (s = syminfos; s; s = s->next) { 3275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner symbol = s->lookup_symbol(s, orig_addr); 3285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (symbol[0] != '\0') { 3295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return symbol; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(CONFIG_USER_ONLY) 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "monitor.h" 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int monitor_disas_is_physical; 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUState *monitor_disas_env; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmonitor_read_memory (bfd_vma memaddr, bfd_byte *myaddr, int length, 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct disassemble_info *info) 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (monitor_disas_is_physical) { 3489f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner cpu_physical_memory_read(memaddr, myaddr, length); 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_memory_rw_debug(monitor_disas_env, memaddr,myaddr, length, 0); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3559f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turnerstatic int GCC_FMT_ATTR(2, 3) 3569f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turnermonitor_fprintf(FILE *stream, const char *fmt, ...) 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_list ap; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_start(ap, fmt); 3605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_vprintf((Monitor *)stream, fmt, ap); 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_end(ap); 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid monitor_disas(Monitor *mon, CPUState *env, 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project target_ulong pc, int nb_insn, int is_physical, int flags) 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count, i; 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct disassemble_info disasm_info; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*print_insn)(bfd_vma pc, disassemble_info *info); 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner INIT_DISASSEMBLE_INFO(disasm_info, (FILE *)mon, monitor_fprintf); 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_disas_env = env; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_disas_is_physical = is_physical; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.read_memory_func = monitor_read_memory; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.buffer_vma = pc; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_WORDS_BIGENDIAN 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_BIG; 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.endian = BFD_ENDIAN_LITTLE; 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386) 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags == 2) 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_x86_64; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (flags == 1) 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_i386_i8086; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_i386_i386; 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_i386; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_ARM) 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_arm; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_ALPHA) 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_alpha; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_sparc; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_SPARC64 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_sparc_v9b; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_PPC) 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_PPC64 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_ppc64; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disasm_info.mach = bfd_mach_ppc; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_ppc; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_M68K) 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_m68k; 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_MIPS) 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_WORDS_BIGENDIAN 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_big_mips; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project print_insn = print_insn_little_mips; 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 41775fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner#elif defined(TARGET_SH4) 41875fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner disasm_info.mach = bfd_mach_sh4; 41975fb4a08de4abce11ee7cf81bcddd5193eb0438dDavid Turner print_insn = print_insn_sh; 4209f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner#elif defined(TARGET_S390X) 4219f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner disasm_info.mach = bfd_mach_s390_64; 4229f6401125dc88f4ae22cdd34c65bf1d4d57ca7e1David 'Digit' Turner print_insn = print_insn_s390; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "0x" TARGET_FMT_lx 4255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ": Asm output not supported on this arch\n", pc); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < nb_insn; i++) { 4305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "0x" TARGET_FMT_lx ": ", pc); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project count = print_insn(pc, &disasm_info); 4325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "\n"); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count < 0) 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pc += count; 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 439