On 10/7/2026 2:44 AM, Philippe Mathieu-Daudé wrote:
> Factor alpha_exception_name() out of alpha_cpu_do_interrupt()
> and register it as the CPUClass::exception_name() handler, so
> the common exception logging can resolve Alpha exception codes
> to names.
> 
> Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
> ---
>  target/alpha/cpu.h    |  1 +
>  target/alpha/cpu.c    |  1 +
>  target/alpha/helper.c | 82 ++++++++++++++++++++++++-------------------
>  3 files changed, 48 insertions(+), 36 deletions(-)
> 
> diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
> index 378bd96d941..8f780502476 100644
> --- a/target/alpha/cpu.h
> +++ b/target/alpha/cpu.h
> @@ -284,6 +284,7 @@ void alpha_cpu_do_interrupt(CPUState *cpu);
>  bool alpha_cpu_exec_interrupt(CPUState *cpu, int int_req);
>  hwaddr alpha_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
>  #endif /* !CONFIG_USER_ONLY */
> +const char *alpha_exception_name(int exception);
>  void alpha_cpu_dump_state(CPUState *cs, FILE *f, int flags);
>  int alpha_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
>  int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
> diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
> index 12e86021663..f9936315fa2 100644
> --- a/target/alpha/cpu.c
> +++ b/target/alpha/cpu.c
> @@ -283,6 +283,7 @@ static void alpha_cpu_class_init(ObjectClass *oc, const 
> void *data)
>                                      &acc->parent_realize);
>  
>      cc->class_by_name = alpha_cpu_class_by_name;
> +    cc->exception_name = alpha_exception_name;
>      cc->dump_state = alpha_cpu_dump_state;
>      cc->set_pc = alpha_cpu_set_pc;
>      cc->get_pc = alpha_cpu_get_pc;
> diff --git a/target/alpha/helper.c b/target/alpha/helper.c
> index c3614ecafda..cedb0006892 100644
> --- a/target/alpha/helper.c
> +++ b/target/alpha/helper.c
> @@ -35,6 +35,51 @@
>  #define CONVERT_BIT(X, SRC, DST) \
>      (SRC > DST ? (X) / (SRC / DST) & (DST) : ((X) & SRC) * (DST / SRC))
>  
> +const char *alpha_exception_name(int excp)
> +{
> +    const char *name;
> +
> +    switch (excp) {
> +    case EXCP_RESET:
> +        name = "reset";
> +        break;
> +    case EXCP_MCHK:
> +        name = "mchk";
> +        break;
> +    case EXCP_SMP_INTERRUPT:
> +        name = "smp_interrupt";
> +        break;
> +    case EXCP_CLK_INTERRUPT:
> +        name = "clk_interrupt";
> +        break;
> +    case EXCP_DEV_INTERRUPT:
> +        name = "dev_interrupt";
> +        break;
> +    case EXCP_MMFAULT:
> +        name = "mmfault";
> +        break;
> +    case EXCP_UNALIGN:
> +        name = "unalign";
> +        break;
> +    case EXCP_OPCDEC:
> +        name = "opcdec";
> +        break;
> +    case EXCP_ARITH:
> +        name = "arith";
> +        break;
> +    case EXCP_FEN:
> +        name = "fen";
> +        break;
> +    case EXCP_CALL_PAL:
> +        name = "call_pal";
> +        break;
> +    default:
> +        name = "<unknown>";
> +        break;
> +    }
> +    return name;
> +}
> +
>  uint64_t cpu_alpha_load_fpcr(CPUAlphaState *env)
>  {
>      return (uint64_t)env->fpcr << 32;
> @@ -343,43 +388,8 @@ void alpha_cpu_do_interrupt(CPUState *cs)
>  
>      if (qemu_loglevel_mask(CPU_LOG_INT)) {
>          static int count;
> -        const char *name = "<unknown>";
> +        const char *name = alpha_exception_name(i);
>  
> -        switch (i) {
> -        case EXCP_RESET:
> -            name = "reset";
> -            break;
> -        case EXCP_MCHK:
> -            name = "mchk";
> -            break;
> -        case EXCP_SMP_INTERRUPT:
> -            name = "smp_interrupt";
> -            break;
> -        case EXCP_CLK_INTERRUPT:
> -            name = "clk_interrupt";
> -            break;
> -        case EXCP_DEV_INTERRUPT:
> -            name = "dev_interrupt";
> -            break;
> -        case EXCP_MMFAULT:
> -            name = "mmfault";
> -            break;
> -        case EXCP_UNALIGN:
> -            name = "unalign";
> -            break;
> -        case EXCP_OPCDEC:
> -            name = "opcdec";
> -            break;
> -        case EXCP_ARITH:
> -            name = "arith";
> -            break;
> -        case EXCP_FEN:
> -            name = "fen";
> -            break;
> -        case EXCP_CALL_PAL:
> -            name = "call_pal";
> -            break;
> -        }
>          qemu_log("INT %6d: %s(%#x) cpu=%d pc=%016"
>                   PRIx64 " sp=%016" PRIx64 "\n",
>                   ++count, name, env->error_code, cs->cpu_index,

Any reason alpha can't have it's static table like others?

Regards,
Pierrick

Reply via email to