linux-user/alpha: add coredump support

Define HAVE_ELF_CORE_DUMP and target_elf_gregset_t in target_elf.h,
mirroring the kernel's elf_gregset_t (ELF_NGREG = 66): r0-r31
[0..31], f0-f31 [32..63], pc [64], unique [65].  Implement
elf_core_copy_regs() in elfload.c to populate the gregset from
CPUAlphaState.

Without this, bprm->core_dump is NULL for Alpha 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-alpha process instead of an Alpha guest core.

v2: Store thread unique field, same as in Linux kernel. Added by Helge &
suggested by Richard.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Helge Deller <deller@gmx.de>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Matt Turner
2026-05-25 17:53:08 -04:00
committed by Helge Deller
parent 6e0aa9f6c7
commit 9db18ed063
2 changed files with 25 additions and 0 deletions

View File

@@ -3,8 +3,20 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "loader.h"
#include "target_elf.h"
void elf_core_copy_regs(target_elf_gregset_t *r, const CPUAlphaState *env)
{
int i;
for (i = 0; i < 31; i++) {
r->regs[i] = tswap64(env->ir[i]);
}
r->pc = tswap64(env->pc);
r->unique = tswap64(env->unique);
}
const char *get_elf_cpu_model(uint32_t eflags)
{
return "ev67";

View File

@@ -11,4 +11,17 @@
#define ELF_CLASS ELFCLASS64
#define ELF_MACHINE EM_ALPHA
#define HAVE_ELF_CORE_DUMP 1
/*
* Matches the kernel's elf_gregset_t (ELF_NGREG = 33):
* r0-r30 at indices 0-30, pc at 31, ps at 32.
* r31 (hardwired zero) is not stored; pc occupies index 31.
*/
typedef struct target_elf_gregset_t {
abi_ulong regs[31]; /* integer registers r0-r30 [0..30] */
abi_ulong pc; /* program counter [31] */
abi_ulong unique; /* thread's UNIQUE field [32] */
} target_elf_gregset_t;
#endif