linux-user/mips: write the floating-point registers to a core dump

Write an NT_FPREGSET note for MIPS and MIPS64, matching the kernel's
elf_fpregset_t layout (ELF_NFPREG = 33): fpr[0..31] hold f0-f31, and
fcsr occupies the low 32 bits of slot 32.  The pad field rounds the
struct to 33 × 8 bytes = 264 bytes.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
Matt Turner 2026-08-05 13:15:04 -04:00 committed by Helge Deller
parent 2304a65529
commit bc22871fc0
3 changed files with 34 additions and 0 deletions

View file

@ -130,6 +130,14 @@ const char *get_elf_base_platform(CPUState *cs)
#undef MATCH_PLATFORM_INSN
void elf_core_copy_fpregs(target_elf_fpregset_t *r, const CPUMIPSState *env)
{
for (int i = 0; i < 32; i++) {
r->fpr[i] = tswap64(env->active_fpu.fpr[i].d);
}
r->fcsr = tswap32(env->active_fpu.fcr31);
}
/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs. */
#ifndef TARGET_MIPS64
void elf_core_copy_regs(target_elf_gregset_t *r, const CPUMIPSState *env)

View file

@ -26,4 +26,17 @@ typedef struct target_elf_gregset_t {
};
} target_elf_gregset_t;
#define HAVE_ELF_CORE_FPREGS 1
/*
* Matches the kernel's elf_fpregset_t (ELF_NFPREG = 33):
* fpr[0..31] hold f0-f31; fcsr occupies the low 32 bits of slot 32.
* pad rounds the struct to 33 × 8 bytes = 264 bytes.
*/
typedef struct target_elf_fpregset_t {
uint64_t fpr[32];
uint32_t fcsr;
uint32_t pad;
} target_elf_fpregset_t;
#endif

View file

@ -32,4 +32,17 @@ typedef struct target_elf_gregset_t {
};
} target_elf_gregset_t;
#define HAVE_ELF_CORE_FPREGS 1
/*
* Matches the kernel's elf_fpregset_t (ELF_NFPREG = 33):
* fpr[0..31] hold f0-f31; fcsr occupies the low 32 bits of slot 32.
* pad rounds the struct to 33 × 8 bytes = 264 bytes.
*/
typedef struct target_elf_fpregset_t {
uint64_t fpr[32];
uint32_t fcsr;
uint32_t pad;
} target_elf_fpregset_t;
#endif