[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/2] target/riscv: add trace in riscv_raise_exception()
From: |
Alistair Francis |
Subject: |
Re: [PATCH 2/2] target/riscv: add trace in riscv_raise_exception() |
Date: |
Mon, 6 Jan 2025 13:01:12 +1000 |
On Fri, Dec 20, 2024 at 3:48 AM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> When using system mode we can get the CPU traps being taken via the
> 'riscv_trap' trace or the "-d int" qemu log. User mode does not a way of
> logging/showing exceptions to users.
>
> Add a trace in riscv_raise_exception() to allow qemu-riscv(32/64) users
> to check all exceptions being thrown. This is particularly useful to
> help identifying insns that are throwing SIGILLs.
>
> As it is today we need to debug their binaries to identify where the
> illegal insns are:
>
> $ ~/work/qemu/build/qemu-riscv64 -cpu rv64 ./foo.out
> Illegal instruction (core dumped)
>
> After this change users can capture the trace and use EPC to pinpoint
> the insn:
>
> $ ~/work/qemu/build/qemu-riscv64 -cpu rv64 -trace riscv_exception ./foo.out
> riscv_exception 8 (user_ecall) on epc 0x17cd2
> riscv_exception 8 (user_ecall) on epc 0x17cda
> riscv_exception 8 (user_ecall) on epc 0x17622
> (...)
> riscv_exception 2 (illegal_instruction) on epc 0x1053a
> Illegal instruction (core dumped)
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/op_helper.c | 6 ++++++
> target/riscv/trace-events | 3 +++
> 2 files changed, 9 insertions(+)
>
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index 29c104bc23..29de8eb43d 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -24,6 +24,7 @@
> #include "exec/exec-all.h"
> #include "exec/cpu_ldst.h"
> #include "exec/helper-proto.h"
> +#include "trace.h"
>
> /* Exceptions processing helpers */
> G_NORETURN void riscv_raise_exception(CPURISCVState *env,
> @@ -31,6 +32,11 @@ G_NORETURN void riscv_raise_exception(CPURISCVState *env,
> uintptr_t pc)
> {
> CPUState *cs = env_cpu(env);
> +
> + trace_riscv_exception(exception,
> + riscv_cpu_get_trap_name(exception, false),
> + env->pc);
> +
> cs->exception_index = exception;
> cpu_loop_exit_restore(cs, pc);
> }
> diff --git a/target/riscv/trace-events b/target/riscv/trace-events
> index 49ec4d3b7d..93837f82a1 100644
> --- a/target/riscv/trace-events
> +++ b/target/riscv/trace-events
> @@ -9,3 +9,6 @@ pmpaddr_csr_write(uint64_t mhartid, uint32_t addr_index,
> uint64_t val) "hart %"
>
> mseccfg_csr_read(uint64_t mhartid, uint64_t val) "hart %" PRIu64 ": read
> mseccfg, val: 0x%" PRIx64
> mseccfg_csr_write(uint64_t mhartid, uint64_t val) "hart %" PRIu64 ": write
> mseccfg, val: 0x%" PRIx64
> +
> +# op_helper.c
> +riscv_exception(uint32_t exception, const char *desc, uint64_t epc) "%u (%s)
> on epc 0x%"PRIx64""
> --
> 2.47.1
>
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [PATCH 2/2] target/riscv: add trace in riscv_raise_exception(),
Alistair Francis <=