For each SPARC / SPARC64 target: factor sparc_exception_name() out of sparc_cpu_do_interrupt() and register it as the CPUClass::exception_name() handler, so the common exception logging can resolve SPARC exception codes to names.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- target/sparc/cpu.h | 1 + target/sparc/cpu.c | 1 + target/sparc/int32_helper.c | 23 ++++++++++------------- target/sparc/int64_helper.c | 36 ++++++++++++++++++------------------ 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h index 31a16c2af03..3c1ba223eb2 100644 --- a/target/sparc/cpu.h +++ b/target/sparc/cpu.h @@ -583,6 +583,7 @@ extern const VMStateDescription vmstate_sparc_cpu; hwaddr sparc_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr); #endif +const char *sparc_exception_name(int excp); void sparc_cpu_do_interrupt(CPUState *cpu); int sparc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int sparc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c index ae9bdca9df8..1f9a62a8c76 100644 --- a/target/sparc/cpu.c +++ b/target/sparc/cpu.c @@ -1098,6 +1098,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, const void *data) &scc->parent_phases); cc->class_by_name = sparc_cpu_class_by_name; + cc->exception_name = sparc_exception_name; cc->list_cpus = sparc_cpu_list, cc->parse_features = sparc_cpu_parse_features; cc->dump_state = sparc_cpu_dump_state; diff --git a/target/sparc/int32_helper.c b/target/sparc/int32_helper.c index d6bb3fa1e54..2bb40d3905f 100644 --- a/target/sparc/int32_helper.c +++ b/target/sparc/int32_helper.c @@ -58,12 +58,16 @@ static const char * const excp_names[0x80] = { [TT_NCP_INSN] = "Coprocessor Disabled", }; -static const char *excp_name_str(int32_t exception_index) +const char *sparc_exception_name(int excp) { - if (exception_index < 0 || exception_index >= ARRAY_SIZE(excp_names)) { + QEMU_BUILD_BUG_ON(ARRAY_SIZE(excp_names) > 0x100); + if (excp < 0 || excp >= 0x100) { return "Unknown"; } - return excp_names[exception_index]; + if (excp >= 0x80) { + return "Trap Instruction"; + } + return excp_names[excp] ?: "Unknown"; } #if !defined(CONFIG_USER_ONLY) @@ -107,15 +111,7 @@ void sparc_cpu_do_interrupt(CPUState *cs) if (qemu_loglevel_mask(CPU_LOG_INT)) { static int count; - const char *name; - - if (intno < 0 || intno >= 0x100) { - name = "Unknown"; - } else if (intno >= 0x80) { - name = "Trap Instruction"; - } else { - name = excp_name_str(intno); - } + const char *name = sparc_exception_name(intno); qemu_log("%6d: %s (v=%02x)\n", count, name, intno); log_cpu_state(cs, 0); @@ -129,7 +125,8 @@ void sparc_cpu_do_interrupt(CPUState *cs) } else { cpu_abort(cs, "Trap 0x%02x (%s) while interrupts disabled, " "Error state", - cs->exception_index, excp_name_str(cs->exception_index)); + cs->exception_index, + sparc_exception_name(cs->exception_index)); } return; } diff --git a/target/sparc/int64_helper.c b/target/sparc/int64_helper.c index 10341e0c282..da5e214b11b 100644 --- a/target/sparc/int64_helper.c +++ b/target/sparc/int64_helper.c @@ -60,6 +60,23 @@ static const char * const excp_names[0x80] = { [TT_EXTINT | 0xf] = "External Interrupt 15", }; +const char *sparc_exception_name(int excp) +{ + QEMU_BUILD_BUG_ON(ARRAY_SIZE(excp_names) > 0x200); + if (excp < 0 || excp >= 0x200) { + return "Unknown"; + } else if (excp >= 0x180) { + return "Hyperprivileged Trap Instruction"; + } else if (excp >= 0x100) { + return "Trap Instruction"; + } else if (excp >= 0xc0) { + return "Window Fill"; + } else if (excp >= 0x80) { + return "Window Spill"; + } + return excp_names[excp] ?: "Unknown"; +} + #if !defined(CONFIG_USER_ONLY) void cpu_check_irqs(CPUSPARCState *env) { @@ -136,24 +153,7 @@ void sparc_cpu_do_interrupt(CPUState *cs) if (qemu_loglevel_mask(CPU_LOG_INT)) { static int count; - const char *name; - - if (intno < 0 || intno >= 0x1ff) { - name = "Unknown"; - } else if (intno >= 0x180) { - name = "Hyperprivileged Trap Instruction"; - } else if (intno >= 0x100) { - name = "Trap Instruction"; - } else if (intno >= 0xc0) { - name = "Window Fill"; - } else if (intno >= 0x80) { - name = "Window Spill"; - } else { - name = excp_names[intno]; - if (!name) { - name = "Unknown"; - } - } + const char *name = sparc_exception_name(intno); qemu_log("%6d: %s (v=%04x)\n", count, name, intno); log_cpu_state(cs, 0); -- 2.55.0
