summaryrefslogtreecommitdiff
path: root/linux-user
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2026-08-05 13:15:03 -0400
committerHelge Deller <deller@gmx.de>2026-08-07 18:14:13 +0200
commit2304a655296aa3bf5e416cf5ce33e481fb87f73a (patch)
tree53f56207541744bf9737b63f9b6de8096800672f /linux-user
parent88dfd97b8acfe41cac7304fa1b6034952f046d1d (diff)
downloadqemu-2304a655296aa3bf5e416cf5ce33e481fb87f73a.tar.gz
qemu-2304a655296aa3bf5e416cf5ce33e481fb87f73a.zip
linux-user/alpha: write the floating-point registers to a core dump
A guest core carried only the general-purpose registers, so a debugger opening one reported every floating-point register as unavailable -- including the arguments of the function that crashed. Implement HAVE_ELF_CORE_FPREGS for Alpha: define target_elf_fpregset_t to match the kernel's layout ($f0-$f30 plus the control register in the slot $f31 would occupy) and fill it from elf_core_copy_fpregs(). Checked with lldb on a core from a program that faults with live values in $f16 and $f17: both read back correctly, as does the control register. Signed-off-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Helge Deller <deller@gmx.de> Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/alpha/elfload.c10
-rw-r--r--linux-user/alpha/target_elf.h11
2 files changed, 21 insertions, 0 deletions
diff --git a/linux-user/alpha/elfload.c b/linux-user/alpha/elfload.c
index 7be9e466b6..c2517516ad 100644
--- a/linux-user/alpha/elfload.c
+++ b/linux-user/alpha/elfload.c
@@ -32,3 +32,13 @@ const char *get_elf_cpu_model(uint32_t eflags)
{
return "ev67";
}
+
+void elf_core_copy_fpregs(target_elf_fpregset_t *r, const CPUAlphaState *env)
+{
+ int i;
+
+ for (i = 0; i < 31; i++) {
+ r->fpr[i] = tswap64(env->fir[i]);
+ }
+ r->fpcr = tswap64(cpu_alpha_load_fpcr((CPUAlphaState *)env));
+}
diff --git a/linux-user/alpha/target_elf.h b/linux-user/alpha/target_elf.h
index dd90c6f783..5efe7f3174 100644
--- a/linux-user/alpha/target_elf.h
+++ b/linux-user/alpha/target_elf.h
@@ -19,6 +19,17 @@
* r0-r30 at indices 0-30, pc at 31, ps at 32.
* r31 (hardwired zero) is not stored; pc occupies index 31.
*/
+/*
+ * The floating-point note holds $f0 through $f30 and then the control
+ * register in the slot $f31 would occupy; $f31 reads as zero.
+ */
+#define HAVE_ELF_CORE_FPREGS 1
+
+typedef struct target_elf_fpregset_t {
+ uint64_t fpr[31]; /* $f0-$f30 */
+ uint64_t fpcr; /* the slot for $f31 */
+} target_elf_fpregset_t;
+
typedef struct target_elf_gregset_t {
abi_ulong regs[31]; /* integer registers r0-r30 [0..30] */
abi_ulong pc; /* program counter [31] */