Factor rx_exception_name() out of rx_cpu_do_interrupt() and register it as the CPUClass::exception_name() handler, so the common exception logging can resolve RX exception codes to names.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- target/rx/cpu.h | 1 + target/rx/cpu.c | 1 + target/rx/helper.c | 53 ++++++++++++++++++++++++++++------------------ 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/target/rx/cpu.h b/target/rx/cpu.h index 0d9f4898a26..06208380621 100644 --- a/target/rx/cpu.h +++ b/target/rx/cpu.h @@ -147,6 +147,7 @@ struct RXCPUClass { #define CPU_RESOLVING_TYPE TYPE_RX_CPU const char *rx_crname(uint8_t cr); +const char *rx_exception_name(int excp); void rx_cpu_do_interrupt(CPUState *cpu); bool rx_cpu_exec_interrupt(CPUState *cpu, int int_req); hwaddr rx_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr); diff --git a/target/rx/cpu.c b/target/rx/cpu.c index 9b8473d71cf..bcaf6659ac5 100644 --- a/target/rx/cpu.c +++ b/target/rx/cpu.c @@ -245,6 +245,7 @@ static void rx_cpu_class_init(ObjectClass *klass, const void *data) &rcc->parent_phases); cc->class_by_name = rx_cpu_class_by_name; + cc->exception_name = rx_exception_name; cc->dump_state = rx_cpu_dump_state; cc->set_pc = rx_cpu_set_pc; cc->get_pc = rx_cpu_get_pc; diff --git a/target/rx/helper.c b/target/rx/helper.c index bc76dd28ab3..fd662b1b5b9 100644 --- a/target/rx/helper.c +++ b/target/rx/helper.c @@ -24,6 +24,37 @@ #include "hw/core/irq.h" #include "qemu/plugin.h" +const char *rx_exception_name(int excp) +{ + const char *name; + + switch (excp) { + case RX_EXCP_PRIVILEGE_VIOLATION: + name = "privilege violation"; + break; + case RX_EXCP_ACCESS: + name = "access exception"; + break; + case RX_EXCP_ILLEGAL_INSTRUCTION: + name = "illegal instruction"; + break; + case RX_EXCP_FPU: + name = "fpu exception"; + break; + case RX_EXCP_NMI: + name = "non-maskable interrupt"; + break; + case RX_EXCP_TRAP_BASE ... RX_EXCP_TRAP_BASE + RX_EXCP_TRAP_COUNT - 1: + name = "unconditional trap"; + break; + default: + name = "unknown exception"; + break; + } + + return name; +} + void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte) { if (env->psw_pm == 0) { @@ -79,7 +110,6 @@ void rx_cpu_do_interrupt(CPUState *cs) qemu_log_mask(CPU_LOG_INT, "interrupt 0x%02x raised\n", env->ack_irq); } else { uint32_t vec = cs->exception_index; - const char *expname = "unknown exception"; env->isp -= 4; cpu_stl_le_data(env, env->isp, save_psw); @@ -100,27 +130,8 @@ void rx_cpu_do_interrupt(CPUState *cs) qemu_plugin_vcpu_exception_cb(cs, last_pc); } - switch (vec) { - case RX_EXCP_PRIVILEGE_VIOLATION: - expname = "privilege violation"; - break; - case RX_EXCP_ACCESS: - expname = "access exception"; - break; - case RX_EXCP_ILLEGAL_INSTRUCTION: - expname = "illegal instruction"; - break; - case RX_EXCP_FPU: - expname = "fpu exception"; - break; - case RX_EXCP_NMI: - expname = "non-maskable interrupt"; - break; - case RX_EXCP_TRAP_BASE ... RX_EXCP_TRAP_BASE + RX_EXCP_TRAP_COUNT - 1: - expname = "unconditional trap"; - } qemu_log_mask(CPU_LOG_INT, "exception 0x%02x [%s] raised\n", - (vec & 0xff), expname); + (vec & 0xff), rx_exception_name(vec)); } env->regs[0] = env->isp; } -- 2.55.0
