@samitouri / QOSamiQemu / commits / 4b5e20839b

linux-user/riscv: add coredump support

Define HAVE_ELF_CORE_DUMP and target_elf_gregset_t in target_elf.h, mirroring struct user_regs_struct: pc followed by x1 (ra) through x31 (t6). Implement elf_core_copy_regs() in elfload.c to populate the gregset from CPURISCVState. Without this, bprm->core_dump is NULL for RISC-V targets. When a guest signal goes unhandled, dump_core_and_abort() skips the core write and falls through to die_with_signal(), which re-raises the signal to the host. The host kernel then writes an x86-64 core file for the qemu-riscv64 process instead of a RISC-V guest core. Signed-off-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Helge Deller <deller@gmx.de>

Matt Turner committed May 21, 2026 at 14:43 UTC 4b5e20839b1f5b983a64a0951a565562801a58c0
2 files changed +16
linux-user/riscv/elfload.c
+9
@@ -3,6 +3,7 @@
3 #include "qemu/osdep.h"
4 #include "qemu.h"
5 #include "loader.h"
6 +#include "target_elf.h"
7
8
9 const char *get_elf_cpu_model(uint32_t eflags)
@@ -10,6 +11,14 @@ const char *get_elf_cpu_model(uint32_t eflags)
11 return "max";
12 }
13
14 +void elf_core_copy_regs(target_elf_gregset_t *r, const CPURISCVState *env)
15 +{
16 + r->pc = tswapal(env->pc);
17 + for (int i = 0; i < 31; i++) {
18 + r->regs[i] = tswapal(env->gpr[i + 1]);
19 + }
20 +}
21 +
22 abi_ulong get_elf_hwcap(CPUState *cs)
23 {
24 #define MISA_BIT(EXT) (1 << (EXT - 'A'))
linux-user/riscv/target_elf.h
+7
@@ -19,5 +19,12 @@
19 #endif
20
21 #define HAVE_ELF_HWCAP 1
22 +#define HAVE_ELF_CORE_DUMP 1
23 +
24 +/* Mirrors struct user_regs_struct: pc followed by x1 (ra) .. x31 (t6). */
25 +typedef struct target_elf_gregset_t {
26 + abi_ulong pc;
27 + abi_ulong regs[31];
28 +} target_elf_gregset_t;
29
30 #endif