xref: /openbmc/qemu/include/disas/dis-asm.h (revision 2af37e791906cfda42cb9604a16d218e56994bb1)
13979fca4SMarkus Armbruster /* Interface between the opcode library and its callers.
23979fca4SMarkus Armbruster    Written by Cygnus Support, 1993.
33979fca4SMarkus Armbruster 
43979fca4SMarkus Armbruster    The opcode library (libopcodes.a) provides instruction decoders for
53979fca4SMarkus Armbruster    a large variety of instruction sets, callable with an identical
63979fca4SMarkus Armbruster    interface, for making instruction-processing programs more independent
73979fca4SMarkus Armbruster    of the instruction set being processed.  */
83979fca4SMarkus Armbruster 
937677d7dSMarkus Armbruster #ifndef DISAS_DIS_ASM_H
1037677d7dSMarkus Armbruster #define DISAS_DIS_ASM_H
113979fca4SMarkus Armbruster 
122c316f9aSPeter Maydell #include "qemu/bswap.h"
132c316f9aSPeter Maydell 
143979fca4SMarkus Armbruster typedef void *PTR;
153979fca4SMarkus Armbruster typedef uint64_t bfd_vma;
163979fca4SMarkus Armbruster typedef int64_t bfd_signed_vma;
173979fca4SMarkus Armbruster typedef uint8_t bfd_byte;
183979fca4SMarkus Armbruster #define sprintf_vma(s,x) sprintf (s, "%0" PRIx64, x)
193979fca4SMarkus Armbruster #define snprintf_vma(s,ss,x) snprintf (s, ss, "%0" PRIx64, x)
203979fca4SMarkus Armbruster 
213979fca4SMarkus Armbruster #define BFD64
223979fca4SMarkus Armbruster 
233979fca4SMarkus Armbruster enum bfd_flavour {
243979fca4SMarkus Armbruster   bfd_target_unknown_flavour,
253979fca4SMarkus Armbruster   bfd_target_aout_flavour,
263979fca4SMarkus Armbruster   bfd_target_coff_flavour,
273979fca4SMarkus Armbruster   bfd_target_ecoff_flavour,
283979fca4SMarkus Armbruster   bfd_target_elf_flavour,
293979fca4SMarkus Armbruster   bfd_target_ieee_flavour,
303979fca4SMarkus Armbruster   bfd_target_nlm_flavour,
313979fca4SMarkus Armbruster   bfd_target_oasys_flavour,
323979fca4SMarkus Armbruster   bfd_target_tekhex_flavour,
333979fca4SMarkus Armbruster   bfd_target_srec_flavour,
343979fca4SMarkus Armbruster   bfd_target_ihex_flavour,
353979fca4SMarkus Armbruster   bfd_target_som_flavour,
363979fca4SMarkus Armbruster   bfd_target_os9k_flavour,
373979fca4SMarkus Armbruster   bfd_target_versados_flavour,
383979fca4SMarkus Armbruster   bfd_target_msdos_flavour,
393979fca4SMarkus Armbruster   bfd_target_evax_flavour
403979fca4SMarkus Armbruster };
413979fca4SMarkus Armbruster 
423979fca4SMarkus Armbruster enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
433979fca4SMarkus Armbruster 
443979fca4SMarkus Armbruster enum bfd_architecture
453979fca4SMarkus Armbruster {
463979fca4SMarkus Armbruster   bfd_arch_unknown,    /* File arch not known */
473979fca4SMarkus Armbruster   bfd_arch_obscure,    /* Arch known, not one of these */
483979fca4SMarkus Armbruster   bfd_arch_m68k,       /* Motorola 68xxx */
493979fca4SMarkus Armbruster #define bfd_mach_m68000 1
503979fca4SMarkus Armbruster #define bfd_mach_m68008 2
513979fca4SMarkus Armbruster #define bfd_mach_m68010 3
523979fca4SMarkus Armbruster #define bfd_mach_m68020 4
533979fca4SMarkus Armbruster #define bfd_mach_m68030 5
543979fca4SMarkus Armbruster #define bfd_mach_m68040 6
553979fca4SMarkus Armbruster #define bfd_mach_m68060 7
563979fca4SMarkus Armbruster #define bfd_mach_cpu32  8
573979fca4SMarkus Armbruster #define bfd_mach_mcf5200  9
583979fca4SMarkus Armbruster #define bfd_mach_mcf5206e 10
593979fca4SMarkus Armbruster #define bfd_mach_mcf5307  11
603979fca4SMarkus Armbruster #define bfd_mach_mcf5407  12
613979fca4SMarkus Armbruster #define bfd_mach_mcf528x  13
623979fca4SMarkus Armbruster #define bfd_mach_mcfv4e   14
633979fca4SMarkus Armbruster #define bfd_mach_mcf521x   15
643979fca4SMarkus Armbruster #define bfd_mach_mcf5249   16
653979fca4SMarkus Armbruster #define bfd_mach_mcf547x   17
663979fca4SMarkus Armbruster #define bfd_mach_mcf548x   18
673979fca4SMarkus Armbruster   bfd_arch_vax,        /* DEC Vax */
683979fca4SMarkus Armbruster   bfd_arch_i960,       /* Intel 960 */
693979fca4SMarkus Armbruster      /* The order of the following is important.
703979fca4SMarkus Armbruster        lower number indicates a machine type that
713979fca4SMarkus Armbruster        only accepts a subset of the instructions
723979fca4SMarkus Armbruster        available to machines with higher numbers.
733979fca4SMarkus Armbruster        The exception is the "ca", which is
743979fca4SMarkus Armbruster        incompatible with all other machines except
753979fca4SMarkus Armbruster        "core". */
763979fca4SMarkus Armbruster 
773979fca4SMarkus Armbruster #define bfd_mach_i960_core      1
783979fca4SMarkus Armbruster #define bfd_mach_i960_ka_sa     2
793979fca4SMarkus Armbruster #define bfd_mach_i960_kb_sb     3
803979fca4SMarkus Armbruster #define bfd_mach_i960_mc        4
813979fca4SMarkus Armbruster #define bfd_mach_i960_xa        5
823979fca4SMarkus Armbruster #define bfd_mach_i960_ca        6
833979fca4SMarkus Armbruster #define bfd_mach_i960_jx        7
843979fca4SMarkus Armbruster #define bfd_mach_i960_hx        8
853979fca4SMarkus Armbruster 
863979fca4SMarkus Armbruster   bfd_arch_a29k,       /* AMD 29000 */
873979fca4SMarkus Armbruster   bfd_arch_sparc,      /* SPARC */
883979fca4SMarkus Armbruster #define bfd_mach_sparc                 1
893979fca4SMarkus Armbruster /* The difference between v8plus and v9 is that v9 is a true 64 bit env.  */
903979fca4SMarkus Armbruster #define bfd_mach_sparc_sparclet        2
913979fca4SMarkus Armbruster #define bfd_mach_sparc_sparclite       3
923979fca4SMarkus Armbruster #define bfd_mach_sparc_v8plus          4
933979fca4SMarkus Armbruster #define bfd_mach_sparc_v8plusa         5 /* with ultrasparc add'ns.  */
943979fca4SMarkus Armbruster #define bfd_mach_sparc_sparclite_le    6
953979fca4SMarkus Armbruster #define bfd_mach_sparc_v9              7
963979fca4SMarkus Armbruster #define bfd_mach_sparc_v9a             8 /* with ultrasparc add'ns.  */
973979fca4SMarkus Armbruster #define bfd_mach_sparc_v8plusb         9 /* with cheetah add'ns.  */
983979fca4SMarkus Armbruster #define bfd_mach_sparc_v9b             10 /* with cheetah add'ns.  */
993979fca4SMarkus Armbruster /* Nonzero if MACH has the v9 instruction set.  */
1003979fca4SMarkus Armbruster #define bfd_mach_sparc_v9_p(mach) \
1013979fca4SMarkus Armbruster   ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \
1023979fca4SMarkus Armbruster    && (mach) != bfd_mach_sparc_sparclite_le)
1033979fca4SMarkus Armbruster   bfd_arch_mips,       /* MIPS Rxxxx */
1043979fca4SMarkus Armbruster #define bfd_mach_mips3000              3000
1053979fca4SMarkus Armbruster #define bfd_mach_mips3900              3900
1063979fca4SMarkus Armbruster #define bfd_mach_mips4000              4000
1073979fca4SMarkus Armbruster #define bfd_mach_mips4010              4010
1083979fca4SMarkus Armbruster #define bfd_mach_mips4100              4100
1093979fca4SMarkus Armbruster #define bfd_mach_mips4300              4300
1103979fca4SMarkus Armbruster #define bfd_mach_mips4400              4400
1113979fca4SMarkus Armbruster #define bfd_mach_mips4600              4600
1123979fca4SMarkus Armbruster #define bfd_mach_mips4650              4650
1133979fca4SMarkus Armbruster #define bfd_mach_mips5000              5000
1143979fca4SMarkus Armbruster #define bfd_mach_mips6000              6000
1153979fca4SMarkus Armbruster #define bfd_mach_mips8000              8000
1163979fca4SMarkus Armbruster #define bfd_mach_mips10000             10000
1173979fca4SMarkus Armbruster #define bfd_mach_mips16                16
1183979fca4SMarkus Armbruster   bfd_arch_i386,       /* Intel 386 */
1193979fca4SMarkus Armbruster #define bfd_mach_i386_i386 0
1203979fca4SMarkus Armbruster #define bfd_mach_i386_i8086 1
1213979fca4SMarkus Armbruster #define bfd_mach_i386_i386_intel_syntax 2
1223979fca4SMarkus Armbruster #define bfd_mach_x86_64 3
1233979fca4SMarkus Armbruster #define bfd_mach_x86_64_intel_syntax 4
1243979fca4SMarkus Armbruster   bfd_arch_we32k,      /* AT&T WE32xxx */
1253979fca4SMarkus Armbruster   bfd_arch_tahoe,      /* CCI/Harris Tahoe */
1263979fca4SMarkus Armbruster   bfd_arch_i860,       /* Intel 860 */
1273979fca4SMarkus Armbruster   bfd_arch_romp,       /* IBM ROMP PC/RT */
1283979fca4SMarkus Armbruster   bfd_arch_alliant,    /* Alliant */
1293979fca4SMarkus Armbruster   bfd_arch_convex,     /* Convex */
1303979fca4SMarkus Armbruster   bfd_arch_m88k,       /* Motorola 88xxx */
1313979fca4SMarkus Armbruster   bfd_arch_pyramid,    /* Pyramid Technology */
1323979fca4SMarkus Armbruster   bfd_arch_h8300,      /* Hitachi H8/300 */
1333979fca4SMarkus Armbruster #define bfd_mach_h8300   1
1343979fca4SMarkus Armbruster #define bfd_mach_h8300h  2
1353979fca4SMarkus Armbruster #define bfd_mach_h8300s  3
1363979fca4SMarkus Armbruster   bfd_arch_powerpc,    /* PowerPC */
1373979fca4SMarkus Armbruster #define bfd_mach_ppc           0
1383979fca4SMarkus Armbruster #define bfd_mach_ppc64         1
1393979fca4SMarkus Armbruster #define bfd_mach_ppc_403       403
1403979fca4SMarkus Armbruster #define bfd_mach_ppc_403gc     4030
1413979fca4SMarkus Armbruster #define bfd_mach_ppc_e500      500
1423979fca4SMarkus Armbruster #define bfd_mach_ppc_505       505
1433979fca4SMarkus Armbruster #define bfd_mach_ppc_601       601
1443979fca4SMarkus Armbruster #define bfd_mach_ppc_602       602
1453979fca4SMarkus Armbruster #define bfd_mach_ppc_603       603
1463979fca4SMarkus Armbruster #define bfd_mach_ppc_ec603e    6031
1473979fca4SMarkus Armbruster #define bfd_mach_ppc_604       604
1483979fca4SMarkus Armbruster #define bfd_mach_ppc_620       620
1493979fca4SMarkus Armbruster #define bfd_mach_ppc_630       630
1503979fca4SMarkus Armbruster #define bfd_mach_ppc_750       750
1513979fca4SMarkus Armbruster #define bfd_mach_ppc_860       860
1523979fca4SMarkus Armbruster #define bfd_mach_ppc_a35       35
1533979fca4SMarkus Armbruster #define bfd_mach_ppc_rs64ii    642
1543979fca4SMarkus Armbruster #define bfd_mach_ppc_rs64iii   643
1553979fca4SMarkus Armbruster #define bfd_mach_ppc_7400      7400
1563979fca4SMarkus Armbruster   bfd_arch_rs6000,     /* IBM RS/6000 */
1573979fca4SMarkus Armbruster   bfd_arch_hppa,       /* HP PA RISC */
1583979fca4SMarkus Armbruster #define bfd_mach_hppa10        10
1593979fca4SMarkus Armbruster #define bfd_mach_hppa11        11
1603979fca4SMarkus Armbruster #define bfd_mach_hppa20        20
1613979fca4SMarkus Armbruster #define bfd_mach_hppa20w       25
1623979fca4SMarkus Armbruster   bfd_arch_d10v,       /* Mitsubishi D10V */
1633979fca4SMarkus Armbruster   bfd_arch_z8k,        /* Zilog Z8000 */
1643979fca4SMarkus Armbruster #define bfd_mach_z8001         1
1653979fca4SMarkus Armbruster #define bfd_mach_z8002         2
1663979fca4SMarkus Armbruster   bfd_arch_h8500,      /* Hitachi H8/500 */
1673979fca4SMarkus Armbruster   bfd_arch_sh,         /* Hitachi SH */
1683979fca4SMarkus Armbruster #define bfd_mach_sh            1
1693979fca4SMarkus Armbruster #define bfd_mach_sh2        0x20
1703979fca4SMarkus Armbruster #define bfd_mach_sh_dsp     0x2d
1713979fca4SMarkus Armbruster #define bfd_mach_sh2a       0x2a
1723979fca4SMarkus Armbruster #define bfd_mach_sh2a_nofpu 0x2b
1733979fca4SMarkus Armbruster #define bfd_mach_sh2e       0x2e
1743979fca4SMarkus Armbruster #define bfd_mach_sh3        0x30
1753979fca4SMarkus Armbruster #define bfd_mach_sh3_nommu  0x31
1763979fca4SMarkus Armbruster #define bfd_mach_sh3_dsp    0x3d
1773979fca4SMarkus Armbruster #define bfd_mach_sh3e       0x3e
1783979fca4SMarkus Armbruster #define bfd_mach_sh4        0x40
1793979fca4SMarkus Armbruster #define bfd_mach_sh4_nofpu  0x41
1803979fca4SMarkus Armbruster #define bfd_mach_sh4_nommu_nofpu  0x42
1813979fca4SMarkus Armbruster #define bfd_mach_sh4a       0x4a
1823979fca4SMarkus Armbruster #define bfd_mach_sh4a_nofpu 0x4b
1833979fca4SMarkus Armbruster #define bfd_mach_sh4al_dsp  0x4d
1843979fca4SMarkus Armbruster #define bfd_mach_sh5        0x50
1853979fca4SMarkus Armbruster   bfd_arch_alpha,      /* Dec Alpha */
1863979fca4SMarkus Armbruster #define bfd_mach_alpha 1
1873979fca4SMarkus Armbruster #define bfd_mach_alpha_ev4  0x10
1883979fca4SMarkus Armbruster #define bfd_mach_alpha_ev5  0x20
1893979fca4SMarkus Armbruster #define bfd_mach_alpha_ev6  0x30
1903979fca4SMarkus Armbruster   bfd_arch_arm,        /* Advanced Risc Machines ARM */
1913979fca4SMarkus Armbruster #define bfd_mach_arm_unknown  0
1923979fca4SMarkus Armbruster #define bfd_mach_arm_2        1
1933979fca4SMarkus Armbruster #define bfd_mach_arm_2a       2
1943979fca4SMarkus Armbruster #define bfd_mach_arm_3        3
1953979fca4SMarkus Armbruster #define bfd_mach_arm_3M       4
1963979fca4SMarkus Armbruster #define bfd_mach_arm_4        5
1973979fca4SMarkus Armbruster #define bfd_mach_arm_4T       6
1983979fca4SMarkus Armbruster #define bfd_mach_arm_5        7
1993979fca4SMarkus Armbruster #define bfd_mach_arm_5T       8
2003979fca4SMarkus Armbruster #define bfd_mach_arm_5TE      9
2013979fca4SMarkus Armbruster #define bfd_mach_arm_XScale   10
2023979fca4SMarkus Armbruster #define bfd_mach_arm_ep9312   11
2033979fca4SMarkus Armbruster #define bfd_mach_arm_iWMMXt   12
2043979fca4SMarkus Armbruster #define bfd_mach_arm_iWMMXt2  13
2053979fca4SMarkus Armbruster   bfd_arch_ns32k,      /* National Semiconductors ns32000 */
2063979fca4SMarkus Armbruster   bfd_arch_w65,        /* WDC 65816 */
2073979fca4SMarkus Armbruster   bfd_arch_tic30,      /* Texas Instruments TMS320C30 */
2083979fca4SMarkus Armbruster   bfd_arch_v850,       /* NEC V850 */
2093979fca4SMarkus Armbruster #define bfd_mach_v850          0
2103979fca4SMarkus Armbruster   bfd_arch_arc,        /* Argonaut RISC Core */
2113979fca4SMarkus Armbruster #define bfd_mach_arc_base 0
2123979fca4SMarkus Armbruster   bfd_arch_m32r,       /* Mitsubishi M32R/D */
2133979fca4SMarkus Armbruster #define bfd_mach_m32r          0  /* backwards compatibility */
2143979fca4SMarkus Armbruster   bfd_arch_mn10200,    /* Matsushita MN10200 */
2153979fca4SMarkus Armbruster   bfd_arch_mn10300,    /* Matsushita MN10300 */
21642f3ff00SMichael Rolnik   bfd_arch_avr,        /* AVR microcontrollers */
21742f3ff00SMichael Rolnik #define bfd_mach_avr1       1
21842f3ff00SMichael Rolnik #define bfd_mach_avr2       2
21942f3ff00SMichael Rolnik #define bfd_mach_avr25      25
22042f3ff00SMichael Rolnik #define bfd_mach_avr3       3
22142f3ff00SMichael Rolnik #define bfd_mach_avr31      31
22242f3ff00SMichael Rolnik #define bfd_mach_avr35      35
22342f3ff00SMichael Rolnik #define bfd_mach_avr4       4
22442f3ff00SMichael Rolnik #define bfd_mach_avr5       5
22542f3ff00SMichael Rolnik #define bfd_mach_avr51      51
22642f3ff00SMichael Rolnik #define bfd_mach_avr6       6
22742f3ff00SMichael Rolnik #define bfd_mach_avrtiny    100
22842f3ff00SMichael Rolnik #define bfd_mach_avrxmega1  101
22942f3ff00SMichael Rolnik #define bfd_mach_avrxmega2  102
23042f3ff00SMichael Rolnik #define bfd_mach_avrxmega3  103
23142f3ff00SMichael Rolnik #define bfd_mach_avrxmega4  104
23242f3ff00SMichael Rolnik #define bfd_mach_avrxmega5  105
23342f3ff00SMichael Rolnik #define bfd_mach_avrxmega6  106
23442f3ff00SMichael Rolnik #define bfd_mach_avrxmega7  107
2353979fca4SMarkus Armbruster   bfd_arch_microblaze, /* Xilinx MicroBlaze.  */
2363979fca4SMarkus Armbruster   bfd_arch_moxie,      /* The Moxie core.  */
2373979fca4SMarkus Armbruster   bfd_arch_ia64,      /* HP/Intel ia64 */
2383979fca4SMarkus Armbruster #define bfd_mach_ia64_elf64    64
2393979fca4SMarkus Armbruster #define bfd_mach_ia64_elf32    32
2404aea3d0cSYoshinori Sato   bfd_arch_rx,       /* Renesas RX */
2414aea3d0cSYoshinori Sato #define bfd_mach_rx            0x75
2424aea3d0cSYoshinori Sato #define bfd_mach_rx_v2         0x76
2434aea3d0cSYoshinori Sato #define bfd_mach_rx_v3         0x77
244aae1746cSSong Gao   bfd_arch_loongarch,
2453979fca4SMarkus Armbruster   bfd_arch_last
2463979fca4SMarkus Armbruster   };
2473979fca4SMarkus Armbruster #define bfd_mach_s390_31 31
2483979fca4SMarkus Armbruster #define bfd_mach_s390_64 64
2493979fca4SMarkus Armbruster 
2503979fca4SMarkus Armbruster typedef struct symbol_cache_entry
2513979fca4SMarkus Armbruster {
2523979fca4SMarkus Armbruster     const char *name;
2533979fca4SMarkus Armbruster     union
2543979fca4SMarkus Armbruster     {
2553979fca4SMarkus Armbruster         PTR p;
2563979fca4SMarkus Armbruster         bfd_vma i;
2573979fca4SMarkus Armbruster     } udata;
2583979fca4SMarkus Armbruster } asymbol;
2593979fca4SMarkus Armbruster 
260ede9a8a6SMarkus Armbruster typedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
2619edc6313SMarc-André Lureau     G_GNUC_PRINTF(2, 3);
262ede9a8a6SMarkus Armbruster 
2633979fca4SMarkus Armbruster enum dis_insn_type {
2643979fca4SMarkus Armbruster   dis_noninsn,          /* Not a valid instruction */
2653979fca4SMarkus Armbruster   dis_nonbranch,        /* Not a branch instruction */
2663979fca4SMarkus Armbruster   dis_branch,           /* Unconditional branch */
2673979fca4SMarkus Armbruster   dis_condbranch,       /* Conditional branch */
2683979fca4SMarkus Armbruster   dis_jsr,              /* Jump to subroutine */
2693979fca4SMarkus Armbruster   dis_condjsr,          /* Conditional jump to subroutine */
2703979fca4SMarkus Armbruster   dis_dref,             /* Data reference instruction */
2713979fca4SMarkus Armbruster   dis_dref2             /* Two data references in instruction */
2723979fca4SMarkus Armbruster };
2733979fca4SMarkus Armbruster 
2743979fca4SMarkus Armbruster /* This struct is passed into the instruction decoding routine,
2753979fca4SMarkus Armbruster    and is passed back out into each callback.  The various fields are used
2763979fca4SMarkus Armbruster    for conveying information from your main routine into your callbacks,
2773979fca4SMarkus Armbruster    for passing information into the instruction decoders (such as the
2783979fca4SMarkus Armbruster    addresses of the callback functions), or for passing information
2793979fca4SMarkus Armbruster    back from the instruction decoders to their callers.
2803979fca4SMarkus Armbruster 
2813979fca4SMarkus Armbruster    It must be initialized before it is first passed; this can be done
2823979fca4SMarkus Armbruster    by hand, or using one of the initialization macros below.  */
2833979fca4SMarkus Armbruster 
2843979fca4SMarkus Armbruster typedef struct disassemble_info {
2853979fca4SMarkus Armbruster   fprintf_function fprintf_func;
2863979fca4SMarkus Armbruster   FILE *stream;
2873979fca4SMarkus Armbruster   PTR application_data;
2883979fca4SMarkus Armbruster 
2893979fca4SMarkus Armbruster   /* Target description.  We could replace this with a pointer to the bfd,
2903979fca4SMarkus Armbruster      but that would require one.  There currently isn't any such requirement
2913979fca4SMarkus Armbruster      so to avoid introducing one we record these explicitly.  */
2923979fca4SMarkus Armbruster   /* The bfd_flavour.  This can be bfd_target_unknown_flavour.  */
2933979fca4SMarkus Armbruster   enum bfd_flavour flavour;
2943979fca4SMarkus Armbruster   /* The bfd_arch value.  */
2953979fca4SMarkus Armbruster   enum bfd_architecture arch;
2963979fca4SMarkus Armbruster   /* The bfd_mach value.  */
2973979fca4SMarkus Armbruster   unsigned long mach;
2983979fca4SMarkus Armbruster   /* Endianness (for bi-endian cpus).  Mono-endian cpus can ignore this.  */
2993979fca4SMarkus Armbruster   enum bfd_endian endian;
3003979fca4SMarkus Armbruster 
3013979fca4SMarkus Armbruster   /* An array of pointers to symbols either at the location being disassembled
3023979fca4SMarkus Armbruster      or at the start of the function being disassembled.  The array is sorted
3033979fca4SMarkus Armbruster      so that the first symbol is intended to be the one used.  The others are
3043979fca4SMarkus Armbruster      present for any misc. purposes.  This is not set reliably, but if it is
3053979fca4SMarkus Armbruster      not NULL, it is correct.  */
3063979fca4SMarkus Armbruster   asymbol **symbols;
3073979fca4SMarkus Armbruster   /* Number of symbols in array.  */
3083979fca4SMarkus Armbruster   int num_symbols;
3093979fca4SMarkus Armbruster 
3103979fca4SMarkus Armbruster   /* For use by the disassembler.
3113979fca4SMarkus Armbruster      The top 16 bits are reserved for public use (and are documented here).
3123979fca4SMarkus Armbruster      The bottom 16 bits are for the internal use of the disassembler.  */
3133979fca4SMarkus Armbruster   unsigned long flags;
3143979fca4SMarkus Armbruster #define INSN_HAS_RELOC  0x80000000
3153979fca4SMarkus Armbruster #define INSN_ARM_BE32   0x00010000
3163979fca4SMarkus Armbruster   PTR private_data;
3173979fca4SMarkus Armbruster 
3183979fca4SMarkus Armbruster   /* Function used to get bytes to disassemble.  MEMADDR is the
3193979fca4SMarkus Armbruster      address of the stuff to be disassembled, MYADDR is the address to
3203979fca4SMarkus Armbruster      put the bytes in, and LENGTH is the number of bytes to read.
3213979fca4SMarkus Armbruster      INFO is a pointer to this struct.
3223979fca4SMarkus Armbruster      Returns an errno value or 0 for success.  */
3233979fca4SMarkus Armbruster   int (*read_memory_func)
3243979fca4SMarkus Armbruster     (bfd_vma memaddr, bfd_byte *myaddr, int length,
3253979fca4SMarkus Armbruster         struct disassemble_info *info);
3263979fca4SMarkus Armbruster 
3273979fca4SMarkus Armbruster   /* Function which should be called if we get an error that we can't
3283979fca4SMarkus Armbruster      recover from.  STATUS is the errno value from read_memory_func and
3293979fca4SMarkus Armbruster      MEMADDR is the address that we were trying to read.  INFO is a
3303979fca4SMarkus Armbruster      pointer to this struct.  */
3313979fca4SMarkus Armbruster   void (*memory_error_func)
3323979fca4SMarkus Armbruster     (int status, bfd_vma memaddr, struct disassemble_info *info);
3333979fca4SMarkus Armbruster 
3343979fca4SMarkus Armbruster   /* Function called to print ADDR.  */
3353979fca4SMarkus Armbruster   void (*print_address_func)
3363979fca4SMarkus Armbruster     (bfd_vma addr, struct disassemble_info *info);
3373979fca4SMarkus Armbruster 
3383979fca4SMarkus Armbruster     /* Function called to print an instruction. The function is architecture
3393979fca4SMarkus Armbruster      * specific.
3403979fca4SMarkus Armbruster      */
3413979fca4SMarkus Armbruster     int (*print_insn)(bfd_vma addr, struct disassemble_info *info);
3423979fca4SMarkus Armbruster 
3433979fca4SMarkus Armbruster   /* Function called to determine if there is a symbol at the given ADDR.
3443979fca4SMarkus Armbruster      If there is, the function returns 1, otherwise it returns 0.
3453979fca4SMarkus Armbruster      This is used by ports which support an overlay manager where
3463979fca4SMarkus Armbruster      the overlay number is held in the top part of an address.  In
3473979fca4SMarkus Armbruster      some circumstances we want to include the overlay number in the
3483979fca4SMarkus Armbruster      address, (normally because there is a symbol associated with
3493979fca4SMarkus Armbruster      that address), but sometimes we want to mask out the overlay bits.  */
3503979fca4SMarkus Armbruster   int (* symbol_at_address_func)
3513979fca4SMarkus Armbruster     (bfd_vma addr, struct disassemble_info * info);
3523979fca4SMarkus Armbruster 
3533979fca4SMarkus Armbruster   /* These are for buffer_read_memory.  */
354f06176beSRichard Henderson   const bfd_byte *buffer;
3553979fca4SMarkus Armbruster   bfd_vma buffer_vma;
3563979fca4SMarkus Armbruster   int buffer_length;
3573979fca4SMarkus Armbruster 
3583979fca4SMarkus Armbruster   /* This variable may be set by the instruction decoder.  It suggests
3593979fca4SMarkus Armbruster       the number of bytes objdump should display on a single line.  If
3603979fca4SMarkus Armbruster       the instruction decoder sets this, it should always set it to
3613979fca4SMarkus Armbruster       the same value in order to get reasonable looking output.  */
3623979fca4SMarkus Armbruster   int bytes_per_line;
3633979fca4SMarkus Armbruster 
3643979fca4SMarkus Armbruster   /* the next two variables control the way objdump displays the raw data */
3653979fca4SMarkus Armbruster   /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */
3663979fca4SMarkus Armbruster   /* output will look like this:
3673979fca4SMarkus Armbruster      00:   00000000 00000000
3683979fca4SMarkus Armbruster      with the chunks displayed according to "display_endian". */
3693979fca4SMarkus Armbruster   int bytes_per_chunk;
3703979fca4SMarkus Armbruster   enum bfd_endian display_endian;
3713979fca4SMarkus Armbruster 
3723979fca4SMarkus Armbruster   /* Results from instruction decoders.  Not all decoders yet support
3733979fca4SMarkus Armbruster      this information.  This info is set each time an instruction is
3743979fca4SMarkus Armbruster      decoded, and is only valid for the last such instruction.
3753979fca4SMarkus Armbruster 
3763979fca4SMarkus Armbruster      To determine whether this decoder supports this information, set
3773979fca4SMarkus Armbruster      insn_info_valid to 0, decode an instruction, then check it.  */
3783979fca4SMarkus Armbruster 
3793979fca4SMarkus Armbruster   char insn_info_valid;         /* Branch info has been set. */
3803979fca4SMarkus Armbruster   char branch_delay_insns;      /* How many sequential insn's will run before
3813979fca4SMarkus Armbruster                                    a branch takes effect.  (0 = normal) */
3823979fca4SMarkus Armbruster   char data_size;               /* Size of data reference in insn, in bytes */
3833979fca4SMarkus Armbruster   enum dis_insn_type insn_type; /* Type of instruction */
3843979fca4SMarkus Armbruster   bfd_vma target;               /* Target address of branch or dref, if known;
3853979fca4SMarkus Armbruster                                    zero if unknown.  */
3863979fca4SMarkus Armbruster   bfd_vma target2;              /* Second target address for dref2 */
3873979fca4SMarkus Armbruster 
3883979fca4SMarkus Armbruster   /* Command line options specific to the target disassembler.  */
3893979fca4SMarkus Armbruster   char * disassembler_options;
3903979fca4SMarkus Armbruster 
391*83b4613bSAlex Bennée   /*
392*83b4613bSAlex Bennée    * When true instruct the disassembler it may preface the
393*83b4613bSAlex Bennée    * disassembly with the opcodes values if it wants to. This is
394*83b4613bSAlex Bennée    * mainly for the benefit of the plugin interface which doesn't want
395*83b4613bSAlex Bennée    * that.
396*83b4613bSAlex Bennée    */
397*83b4613bSAlex Bennée   bool show_opcodes;
398*83b4613bSAlex Bennée 
3993404e180SAleksandar Markovic   /* Field intended to be used by targets in any way they deem suitable.  */
400d02eb5bcSWeiwei Li   void *target_info;
4013404e180SAleksandar Markovic 
4023979fca4SMarkus Armbruster   /* Options for Capstone disassembly.  */
4033979fca4SMarkus Armbruster   int cap_arch;
4043979fca4SMarkus Armbruster   int cap_mode;
4053979fca4SMarkus Armbruster   int cap_insn_unit;
4063979fca4SMarkus Armbruster   int cap_insn_split;
4073979fca4SMarkus Armbruster 
4083979fca4SMarkus Armbruster } disassemble_info;
4093979fca4SMarkus Armbruster 
4103979fca4SMarkus Armbruster /* Standard disassemblers.  Disassemble one instruction at the given
4113979fca4SMarkus Armbruster    target address.  Return number of bytes processed.  */
4123979fca4SMarkus Armbruster typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
4133979fca4SMarkus Armbruster 
4143979fca4SMarkus Armbruster int print_insn_tci(bfd_vma, disassemble_info*);
4153979fca4SMarkus Armbruster int print_insn_big_mips         (bfd_vma, disassemble_info*);
4163979fca4SMarkus Armbruster int print_insn_little_mips      (bfd_vma, disassemble_info*);
4173979fca4SMarkus Armbruster int print_insn_nanomips         (bfd_vma, disassemble_info*);
4183979fca4SMarkus Armbruster int print_insn_m68k             (bfd_vma, disassemble_info*);
4193979fca4SMarkus Armbruster int print_insn_z8001            (bfd_vma, disassemble_info*);
4203979fca4SMarkus Armbruster int print_insn_z8002            (bfd_vma, disassemble_info*);
4213979fca4SMarkus Armbruster int print_insn_h8300            (bfd_vma, disassemble_info*);
4223979fca4SMarkus Armbruster int print_insn_h8300h           (bfd_vma, disassemble_info*);
4233979fca4SMarkus Armbruster int print_insn_h8300s           (bfd_vma, disassemble_info*);
4243979fca4SMarkus Armbruster int print_insn_h8500            (bfd_vma, disassemble_info*);
4253979fca4SMarkus Armbruster int print_insn_arm_a64          (bfd_vma, disassemble_info*);
4263979fca4SMarkus Armbruster int print_insn_alpha            (bfd_vma, disassemble_info*);
4273979fca4SMarkus Armbruster disassembler_ftype arc_get_disassembler (int, int);
4283979fca4SMarkus Armbruster int print_insn_sparc            (bfd_vma, disassemble_info*);
4293979fca4SMarkus Armbruster int print_insn_big_a29k         (bfd_vma, disassemble_info*);
4303979fca4SMarkus Armbruster int print_insn_little_a29k      (bfd_vma, disassemble_info*);
4313979fca4SMarkus Armbruster int print_insn_i960             (bfd_vma, disassemble_info*);
4323979fca4SMarkus Armbruster int print_insn_sh               (bfd_vma, disassemble_info*);
4333979fca4SMarkus Armbruster int print_insn_shl              (bfd_vma, disassemble_info*);
4343979fca4SMarkus Armbruster int print_insn_hppa             (bfd_vma, disassemble_info*);
4353979fca4SMarkus Armbruster int print_insn_m32r             (bfd_vma, disassemble_info*);
4363979fca4SMarkus Armbruster int print_insn_m88k             (bfd_vma, disassemble_info*);
4373979fca4SMarkus Armbruster int print_insn_mn10200          (bfd_vma, disassemble_info*);
4383979fca4SMarkus Armbruster int print_insn_mn10300          (bfd_vma, disassemble_info*);
4393979fca4SMarkus Armbruster int print_insn_ns32k            (bfd_vma, disassemble_info*);
4403979fca4SMarkus Armbruster int print_insn_big_powerpc      (bfd_vma, disassemble_info*);
4413979fca4SMarkus Armbruster int print_insn_little_powerpc   (bfd_vma, disassemble_info*);
4423979fca4SMarkus Armbruster int print_insn_rs6000           (bfd_vma, disassemble_info*);
4433979fca4SMarkus Armbruster int print_insn_w65              (bfd_vma, disassemble_info*);
4443979fca4SMarkus Armbruster int print_insn_d10v             (bfd_vma, disassemble_info*);
4453979fca4SMarkus Armbruster int print_insn_v850             (bfd_vma, disassemble_info*);
4463979fca4SMarkus Armbruster int print_insn_tic30            (bfd_vma, disassemble_info*);
4473979fca4SMarkus Armbruster int print_insn_microblaze       (bfd_vma, disassemble_info*);
4483979fca4SMarkus Armbruster int print_insn_ia64             (bfd_vma, disassemble_info*);
4493979fca4SMarkus Armbruster int print_insn_xtensa           (bfd_vma, disassemble_info*);
4503979fca4SMarkus Armbruster int print_insn_riscv32          (bfd_vma, disassemble_info*);
4513979fca4SMarkus Armbruster int print_insn_riscv64          (bfd_vma, disassemble_info*);
452332dab68SFrédéric Pétrot int print_insn_riscv128         (bfd_vma, disassemble_info*);
4534aea3d0cSYoshinori Sato int print_insn_rx(bfd_vma, disassemble_info *);
454a00cfed0STaylor Simpson int print_insn_hexagon(bfd_vma, disassemble_info *);
455aae1746cSSong Gao int print_insn_loongarch(bfd_vma, disassemble_info *);
4563979fca4SMarkus Armbruster 
457f343346bSRichard Henderson #ifdef CONFIG_CAPSTONE
458f343346bSRichard Henderson bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size);
459f06176beSRichard Henderson bool cap_disas_host(disassemble_info *info, const void *code, size_t size);
460f343346bSRichard Henderson bool cap_disas_monitor(disassemble_info *info, uint64_t pc, int count);
461f343346bSRichard Henderson bool cap_disas_plugin(disassemble_info *info, uint64_t pc, size_t size);
462f343346bSRichard Henderson #else
463f343346bSRichard Henderson # define cap_disas_target(i, p, s)  false
464f343346bSRichard Henderson # define cap_disas_host(i, p, s)    false
465f343346bSRichard Henderson # define cap_disas_monitor(i, p, c) false
466f343346bSRichard Henderson # define cap_disas_plugin(i, p, c)  false
467f343346bSRichard Henderson #endif /* CONFIG_CAPSTONE */
468f343346bSRichard Henderson 
4693979fca4SMarkus Armbruster #ifndef ATTRIBUTE_UNUSED
4703979fca4SMarkus Armbruster #define ATTRIBUTE_UNUSED __attribute__((unused))
4713979fca4SMarkus Armbruster #endif
4723979fca4SMarkus Armbruster 
4733979fca4SMarkus Armbruster /* from libbfd */
4743979fca4SMarkus Armbruster 
bfd_getl64(const bfd_byte * addr)47586944d1dSRichard Henderson static inline bfd_vma bfd_getl64(const bfd_byte *addr)
47686944d1dSRichard Henderson {
47786944d1dSRichard Henderson     return ldq_le_p(addr);
47886944d1dSRichard Henderson }
47986944d1dSRichard Henderson 
bfd_getl32(const bfd_byte * addr)48086944d1dSRichard Henderson static inline bfd_vma bfd_getl32(const bfd_byte *addr)
48186944d1dSRichard Henderson {
48286944d1dSRichard Henderson     return (uint32_t)ldl_le_p(addr);
48386944d1dSRichard Henderson }
48486944d1dSRichard Henderson 
bfd_getl16(const bfd_byte * addr)48586944d1dSRichard Henderson static inline bfd_vma bfd_getl16(const bfd_byte *addr)
48686944d1dSRichard Henderson {
48786944d1dSRichard Henderson     return lduw_le_p(addr);
48886944d1dSRichard Henderson }
48986944d1dSRichard Henderson 
bfd_getb32(const bfd_byte * addr)49086944d1dSRichard Henderson static inline bfd_vma bfd_getb32(const bfd_byte *addr)
49186944d1dSRichard Henderson {
49286944d1dSRichard Henderson     return (uint32_t)ldl_be_p(addr);
49386944d1dSRichard Henderson }
49486944d1dSRichard Henderson 
bfd_getb16(const bfd_byte * addr)49586944d1dSRichard Henderson static inline bfd_vma bfd_getb16(const bfd_byte *addr)
49686944d1dSRichard Henderson {
49786944d1dSRichard Henderson     return lduw_be_p(addr);
49886944d1dSRichard Henderson }
49986944d1dSRichard Henderson 
5003979fca4SMarkus Armbruster typedef bool bfd_boolean;
5013979fca4SMarkus Armbruster 
50237677d7dSMarkus Armbruster #endif /* DISAS_DIS_ASM_H */
503