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>
33 lines
748 B
C
33 lines
748 B
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qemu.h"
|
|
#include "loader.h"
|
|
#include "target_elf.h"
|
|
|
|
|
|
const char *get_elf_cpu_model(uint32_t eflags)
|
|
{
|
|
return "max";
|
|
}
|
|
|
|
void elf_core_copy_regs(target_elf_gregset_t *r, const CPURISCVState *env)
|
|
{
|
|
r->pc = tswapal(env->pc);
|
|
for (int i = 0; i < 31; i++) {
|
|
r->regs[i] = tswapal(env->gpr[i + 1]);
|
|
}
|
|
}
|
|
|
|
abi_ulong get_elf_hwcap(CPUState *cs)
|
|
{
|
|
#define MISA_BIT(EXT) (1 << (EXT - 'A'))
|
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
|
uint32_t mask = MISA_BIT('I') | MISA_BIT('M') | MISA_BIT('A')
|
|
| MISA_BIT('F') | MISA_BIT('D') | MISA_BIT('C')
|
|
| MISA_BIT('V');
|
|
|
|
return cpu->env.misa_ext & mask;
|
|
#undef MISA_BIT
|
|
}
|