From: Peter Crosthwaite <crosthwaitepe...@gmail.com> 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 <r...@twiddle.net> Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> Signed-off-by: Andreas Färber <afaer...@suse.de> --- disas.c | 22 ++++++++++++++++++---- include/qom/cpu.h | 4 ++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/disas.c b/disas.c index 363c3bf..ff5425d 100644 --- a/disas.c +++ b/disas.c @@ -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); diff --git a/include/qom/cpu.h b/include/qom/cpu.h index b120574..20aabc9 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -23,6 +23,7 @@ #include <signal.h> #include <setjmp.h> #include "hw/qdev-core.h" +#include "disas/bfd.h" #include "exec/hwaddr.h" #include "exec/memattrs.h" #include "qemu/queue.h" @@ -117,6 +118,7 @@ struct TranslationBlock; * @cpu_exec_enter: Callback for cpu_exec preparation. * @cpu_exec_exit: Callback for cpu_exec cleanup. * @cpu_exec_interrupt: Callback for processing interrupts in cpu_exec. + * @disas_set_info: Setup architecture specific components of disassembly info * * Represents a CPU family or model. */ @@ -172,6 +174,8 @@ typedef struct CPUClass { void (*cpu_exec_enter)(CPUState *cpu); void (*cpu_exec_exit)(CPUState *cpu); bool (*cpu_exec_interrupt)(CPUState *cpu, int interrupt_request); + + void (*disas_set_info)(CPUState *cpu, disassemble_info *info); } CPUClass; #ifdef HOST_WORDS_BIGENDIAN -- 2.1.4