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