Re: [PATCH v3 10/13] target/hexagon: add COREDUMP semihosting operation
Philippe Mathieu-Daudé <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
On 20/7/26 19:41, Matheus Tavares Bernardino wrote: > Baremetal Hexagon programs invoke SYS_COREDUMP (0xCD) > through semihosting to dump CPU state on a fatal exception. > Implement the handler to decode the SSR cause field and > print the full register file, matching hexagon-sim behavior. > > Signed-off-by: Brian Cain <[email protected]> > Reviewed-by: Pierrick Bouvier <[email protected]> > Signed-off-by: Matheus Tavares Bernardino <[email protected]> > --- > target/hexagon/internal.h | 1 + > target/hexagon/cpu.c | 2 +- > target/hexagon/hexswi.c | 143 ++++++++++++++++++++++++++++++++++++++ > 3 files changed, 145 insertions(+), 1 deletion(-) > diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c > index e6b2ac1939d..06c378c5e02 100644 > --- a/target/hexagon/cpu.c > +++ b/target/hexagon/cpu.c > @@ -232,7 +232,7 @@ void hexagon_debug_qreg(CPUHexagonState *env, int regnum) > print_qreg(stdout, env, regnum, false); > } > > -static void hexagon_dump(CPUHexagonState *env, FILE *f, int flags) > +void hexagon_dump(CPUHexagonState *env, FILE *f, int flags) > { > HexagonCPU *cpu = env_archcpu(env); > > diff --git a/target/hexagon/hexswi.c b/target/hexagon/hexswi.c > index 6efc00fedf9..564a11e557a 100644 > --- a/target/hexagon/hexswi.c > +++ b/target/hexagon/hexswi.c > @@ -162,6 +162,145 @@ static void common_semi_ftell_cb(CPUState *cs, uint64_t ret, int err) > common_semi_cb(cs, ret, err); > } > > +static void coredump(CPUHexagonState *env) > +{ > + uint32_t ssr = arch_get_system_reg(env, HEX_SREG_SSR); > + FILE *f = qemu_log_trylock(); > + > + if (!f) { > + return; > + } > + > + fprintf(f, "CRASH!\n"); > + fprintf(f, "I think the exception was: "); > + switch (GET_SSR_FIELD(SSR_CAUSE, ssr)) { > + case 0x43: > + fprintf(f, "0x43, NMI"); > + break; > + case 0x42: > + fprintf(f, "0x42, Data abort"); > + break; > + case 0x44: > + fprintf(f, "0x44, Multi TLB match"); > + break; > + case HEX_CAUSE_BIU_PRECISE: > + fprintf(f, "0x%x, Bus Error (Precise BIU error)", > + HEX_CAUSE_BIU_PRECISE); > + break; [...] Should this be moved within hexagon_dump() instead? That information seems available and useful there.