Implement xtensa_exception_name() and register it as the CPUClass::exception_name() handler, so the common exception logging can resolve Xtensa exception codes to names.
Use the new helper in xtensa_cpu_do_interrupt(). Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- target/xtensa/cpu.h | 2 ++ target/xtensa/cpu.c | 26 ++++++++++++++++++++++++++ target/xtensa/exc_helper.c | 3 ++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h index 49d6ad9083d..3440c27862b 100644 --- a/target/xtensa/cpu.h +++ b/target/xtensa/cpu.h @@ -262,6 +262,8 @@ enum { EXC_MAX }; +const char *xtensa_exception_name(int excp); + enum { ILLEGAL_INSTRUCTION_CAUSE = 0, SYSCALL_CAUSE, diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c index 7c25b9ab707..d5ad9466c0d 100644 --- a/target/xtensa/cpu.c +++ b/target/xtensa/cpu.c @@ -239,6 +239,31 @@ static void xtensa_cpu_disas_set_info(const CPUState *cs, : BFD_ENDIAN_LITTLE; } +const char *xtensa_exception_name(int excp) +{ + static const char * const excp_names[] = { + [EXC_RESET0] = "reset", + [EXC_RESET1] = "reset", + [EXC_MEMORY_ERROR] = "memory error", + [EXC_WINDOW_OVERFLOW4] = "window overflow", + [EXC_WINDOW_UNDERFLOW4] = "window underflow", + [EXC_WINDOW_OVERFLOW8] = "window overflow", + [EXC_WINDOW_UNDERFLOW8] = "window underflow", + [EXC_WINDOW_OVERFLOW12] = "window overflow", + [EXC_WINDOW_UNDERFLOW12] = "window underflow", + [EXC_IRQ] = "interrupt", + [EXC_KERNEL] = "kernel", + [EXC_USER] = "user", + [EXC_DOUBLE] = "double", + [EXC_DEBUG] = "debug", + }; + + if (excp < 0 || excp >= ARRAY_SIZE(excp_names) || !excp_names[excp]) { + return "unknown"; + } + return excp_names[excp]; +} + static void xtensa_cpu_realizefn(DeviceState *dev, Error **errp) { CPUState *cs = CPU(dev); @@ -348,6 +373,7 @@ static void xtensa_cpu_class_init(ObjectClass *oc, const void *data) &xcc->parent_phases); cc->class_by_name = xtensa_cpu_class_by_name; + cc->exception_name = xtensa_exception_name; cc->dump_state = xtensa_cpu_dump_state; cc->set_pc = xtensa_cpu_set_pc; cc->get_pc = xtensa_cpu_get_pc; diff --git a/target/xtensa/exc_helper.c b/target/xtensa/exc_helper.c index 7cb67d179a8..ff71e5d6462 100644 --- a/target/xtensa/exc_helper.c +++ b/target/xtensa/exc_helper.c @@ -236,9 +236,10 @@ void xtensa_cpu_do_interrupt(CPUState *cs) case EXC_USER: case EXC_DOUBLE: case EXC_DEBUG: - qemu_log_mask(CPU_LOG_INT, "%s(%d) " + qemu_log_mask(CPU_LOG_INT, "%s(%d:%s) " "pc = %08x, a0 = %08x, ps = %08x, ccount = %08x\n", __func__, cs->exception_index, + xtensa_exception_name(cs->exception_index), env->pc, env->regs[0], env->sregs[PS], env->sregs[CCOUNT]); if (env->config->exception_vector[cs->exception_index]) { -- 2.55.0
