diff options
author | Peter Crosthwaite <crosthwaitepeter@gmail.com> | 2015-06-23 20:57:33 -0700 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2015-07-09 15:20:41 +0200 |
commit | 37b9de463bff4fc786bb5f0778829e68d2c97bd0 (patch) | |
tree | e58572ae930d787710ac933cea3838ee1de54641 /disas.c | |
parent | 2de295c544dda8680a82fe465c92d236d49c4d4f (diff) | |
download | qemu-37b9de463bff4fc786bb5f0778829e68d2c97bd0.zip qemu-37b9de463bff4fc786bb5f0778829e68d2c97bd0.tar.gz qemu-37b9de463bff4fc786bb5f0778829e68d2c97bd0.tar.bz2 |
disas: QOMify target specific setup
Add a QOM function hook for target-specific disassembly setup. This
allows removal of the #ifdeffery currently implementing target specific
disas setup from disas.c.
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'disas.c')
-rw-r--r-- | disas.c | 22 |
1 files changed, 18 insertions, 4 deletions
@@ -1,5 +1,6 @@ /* General "disassemble this chunk" code. Used for debugging. */ #include "config.h" +#include "qemu-common.h" #include "disas/bfd.h" #include "elf.h" #include <errno.h> @@ -198,6 +199,7 @@ static int print_insn_od_target(bfd_vma pc, disassemble_info *info) void target_disas(FILE *out, CPUState *cpu, target_ulong code, target_ulong size, int flags) { + CPUClass *cc = CPU_GET_CLASS(cpu); target_ulong pc; int count; CPUDebug s; @@ -215,6 +217,11 @@ void target_disas(FILE *out, CPUState *cpu, target_ulong code, #else s.info.endian = BFD_ENDIAN_LITTLE; #endif + + if (cc->disas_set_info) { + cc->disas_set_info(cpu, &s.info); + } + #if defined(TARGET_I386) if (flags == 2) { s.info.mach = bfd_mach_x86_64; @@ -449,6 +456,7 @@ monitor_fprintf(FILE *stream, const char *fmt, ...) void monitor_disas(Monitor *mon, CPUState *cpu, target_ulong pc, int nb_insn, int is_physical, int flags) { + CPUClass *cc = CPU_GET_CLASS(cpu); int count, i; CPUDebug s; @@ -466,6 +474,11 @@ void monitor_disas(Monitor *mon, CPUState *cpu, #else s.info.endian = BFD_ENDIAN_LITTLE; #endif + + if (cc->disas_set_info) { + cc->disas_set_info(cpu, &s.info); + } + #if defined(TARGET_I386) if (flags == 2) { s.info.mach = bfd_mach_x86_64; @@ -519,11 +532,12 @@ void monitor_disas(Monitor *mon, CPUState *cpu, #elif defined(TARGET_LM32) s.info.mach = bfd_mach_lm32; s.info.print_insn = print_insn_lm32; -#else - monitor_printf(mon, "0x" TARGET_FMT_lx - ": Asm output not supported on this arch\n", pc); - return; #endif + if (!s.info.print_insn) { + monitor_printf(mon, "0x" TARGET_FMT_lx + ": Asm output not supported on this arch\n", pc); + return; + } for(i = 0; i < nb_insn; i++) { monitor_printf(mon, "0x" TARGET_FMT_lx ": ", pc); |