All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/7] Linux user patches
@ 2026-08-12 20:37 Helge Deller
  2026-08-12 20:37 ` [PULL 1/7] linux-user: implement mount_setattr(2) Helge Deller
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Helge Deller <deller@gmx.de>

The following changes since commit 3e3ccab106f879b1512f8e0d51a827dd4de30e22:

  Update version for v11.1.0-rc3 release (2026-08-04 15:36:08 -0400)

are available in the Git repository at:

  https://github.com/hdeller/qemu-hppa.git tags/linux-user-pull-request

for you to fetch changes up to ce276ab1a92cad460930fada1bc2e2e4a96f7595:

  linux-user/sh4: write the floating-point registers to a core dump (2026-08-07 18:14:13 +0200)

----------------------------------------------------------------
linux-user patches

Patches from Mat Turner to support the mount_setattr() syscall and to add
floating-point registers to core dumps on alpha, mips, hppa, riscv and sh4.

----------------------------------------------------------------

Matt Turner (7):
  linux-user: implement mount_setattr(2)
  linux-user: support writing floating-point registers to a core dump
  linux-user/alpha: write the floating-point registers to a core dump
  linux-user/mips: write the floating-point registers to a core dump
  linux-user/hppa: write the floating-point registers to a core dump
  linux-user/riscv: write the floating-point registers to a core dump
  linux-user/sh4: write the floating-point registers to a core dump

 linux-user/alpha/elfload.c     | 10 ++++++++
 linux-user/alpha/target_elf.h  | 11 +++++++++
 linux-user/elfload.c           | 19 +++++++++++++++
 linux-user/hppa/elfload.c      |  7 ++++++
 linux-user/hppa/target_elf.h   |  9 +++++++
 linux-user/loader.h            |  3 +++
 linux-user/mips/elfload.c      |  8 +++++++
 linux-user/mips/target_elf.h   | 13 ++++++++++
 linux-user/mips64/target_elf.h | 13 ++++++++++
 linux-user/riscv/elfload.c     |  9 +++++++
 linux-user/riscv/target_elf.h  | 11 +++++++++
 linux-user/sh4/elfload.c       | 10 ++++++++
 linux-user/sh4/target_elf.h    | 12 ++++++++++
 linux-user/strace.list         |  3 +++
 linux-user/syscall.c           | 44 ++++++++++++++++++++++++++++++++++
 linux-user/syscall_defs.h      | 13 ++++++++++
 16 files changed, 195 insertions(+)

-- 
2.54.0



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PULL 1/7] linux-user: implement mount_setattr(2)
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 2/7] linux-user: support writing floating-point registers to a core dump Helge Deller
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

mount_setattr() was in the syscall tables but had no implementation, so
guests always got -ENOSYS. systemd uses it when setting up per-unit
credential mounts, which fails the affected units with EXIT_CREDENTIALS.

struct mount_attr is an extensible struct like open_how, so handle it the
same way openat2() does: reject sizes smaller than the ver0 struct and
require any unknown trailing bytes to be zero. All of its fields are
64-bit, and the MOUNT_ATTR_* and MS_* propagation values are identical on
every target, so only the byte order needs fixing up.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
 linux-user/strace.list    |  3 +++
 linux-user/syscall.c      | 44 +++++++++++++++++++++++++++++++++++++++
 linux-user/syscall_defs.h | 13 ++++++++++++
 3 files changed, 60 insertions(+)

diff --git a/linux-user/strace.list b/linux-user/strace.list
index 25ace05187..e952f15d20 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1737,3 +1737,6 @@
 #ifdef TARGET_NR_fspick
 { TARGET_NR_fspick, "fspick", "%s(%d,%s,%d)", NULL, NULL },
 #endif
+#ifdef TARGET_NR_mount_setattr
+{ TARGET_NR_mount_setattr, "mount_setattr", "%s(%d,%s,%d,%p,%d)", NULL, NULL },
+#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index dc028686f4..cfa68dfbdb 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9735,6 +9735,13 @@ _syscall5(int, sys_move_mount, int, __from_dfd, const char *, __from_pathname,
            int, __to_dfd, const char *, __to_pathname, unsigned int, flag)
 #endif
 
+#if defined(TARGET_NR_mount_setattr) && defined(__NR_mount_setattr)
+#define __NR_sys_mount_setattr __NR_mount_setattr
+_syscall5(int, sys_mount_setattr, int, dfd, const char *, path,
+          unsigned int, flags, struct mount_attr_ver0 *, uattr,
+          size_t, usize)
+#endif
+
 #if defined(TARGET_NR_fsopen) && defined(__NR_fsopen)
 #define __NR_sys_fsopen __NR_fsopen
 _syscall2(int, sys_fsopen, const char *, fs_name, unsigned int, flags);
@@ -14480,6 +14487,43 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
         return do_map_shadow_stack(cpu_env, arg1, arg2, arg3);
 #endif
 
+#if defined(TARGET_NR_mount_setattr) && defined(__NR_mount_setattr)
+    case TARGET_NR_mount_setattr:
+        {
+            struct mount_attr_ver0 attr = {};
+            abi_ulong usize = arg5;
+
+            if (usize < sizeof(struct target_mount_attr_ver0)) {
+                return -TARGET_EINVAL;
+            }
+            ret = copy_struct_from_user(&attr, sizeof(attr), arg4, usize);
+            if (ret) {
+                if (ret == -TARGET_E2BIG) {
+                    qemu_log_mask(LOG_UNIMP,
+                                  "Unimplemented mount_setattr mount_attr "
+                                  "size: " TARGET_ABI_FMT_lu "\n", usize);
+                }
+                return ret;
+            }
+            /*
+             * MOUNT_ATTR_* and the MS_* propagation flags have the same
+             * values on all targets, so only byte order needs fixing up.
+             */
+            attr.attr_set = tswap64(attr.attr_set);
+            attr.attr_clr = tswap64(attr.attr_clr);
+            attr.propagation = tswap64(attr.propagation);
+            attr.userns_fd = tswap64(attr.userns_fd);
+
+            p = lock_user_string(arg2);
+            if (!p) {
+                return -TARGET_EFAULT;
+            }
+            ret = get_errno(sys_mount_setattr(arg1, p, arg3, &attr,
+                                              sizeof(attr)));
+            unlock_user(p, arg2, 0);
+        }
+        return ret;
+#endif
 #if defined(TARGET_NR_fsopen) && defined(__NR_fsopen)
     case TARGET_NR_fsopen:
         {
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index e033c7db34..e28853c93b 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2770,6 +2770,19 @@ struct target_open_how_ver0 {
     abi_ullong mode;
     abi_ullong resolve;
 };
+/* from kernel's include/uapi/linux/mount.h */
+struct mount_attr_ver0 {
+    uint64_t attr_set;
+    uint64_t attr_clr;
+    uint64_t propagation;
+    uint64_t userns_fd;
+};
+struct target_mount_attr_ver0 {
+    abi_ullong attr_set;
+    abi_ullong attr_clr;
+    abi_ullong propagation;
+    abi_ullong userns_fd;
+};
 #ifndef RESOLVE_NO_MAGICLINKS
 #define RESOLVE_NO_MAGICLINKS   0x02
 #endif
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 2/7] linux-user: support writing floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
  2026-08-12 20:37 ` [PULL 1/7] linux-user: implement mount_setattr(2) Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 3/7] linux-user/alpha: write the " Helge Deller
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

Write an NT_FPREGSET note for targets that opt in: a target_elf.h that
defines HAVE_ELF_CORE_FPREGS and target_elf_fpregset_t, and supplies an
elf_core_copy_fpregs() beside the existing elf_core_copy_regs().

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
 linux-user/elfload.c | 19 +++++++++++++++++++
 linux-user/loader.h  |  3 +++
 2 files changed, 22 insertions(+)

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index e7c56af8ed..88508deac5 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1887,6 +1887,17 @@ static void fill_elf_note_phdr(struct elf_phdr *phdr, size_t sz, off_t offset)
     bswap_phdr(phdr, 1);
 }
 
+#ifdef HAVE_ELF_CORE_FPREGS
+static void fill_fpregset_note(void *data, CPUState *cpu)
+{
+    /* Fill locally and copy: note memory is only aligned to 4. */
+    target_elf_fpregset_t fpregs = {};
+
+    elf_core_copy_fpregs(&fpregs, cpu_env(cpu));
+    memcpy(data, &fpregs, sizeof(fpregs));
+}
+#endif
+
 static void fill_prstatus_note(void *data, CPUState *cpu, int signr)
 {
     /*
@@ -2166,6 +2177,9 @@ static int elf_core_dump(int signr, const CPUArchState *env)
     offset += size_note("CORE", ts->info->auxv_len);
     offset += size_note("CORE", sizeof(struct target_elf_prpsinfo));
     offset += size_note("CORE", sizeof(struct target_elf_prstatus)) * cpus;
+#ifdef HAVE_ELF_CORE_FPREGS
+    offset += size_note("CORE", sizeof(target_elf_fpregset_t)) * cpus;
+#endif
     note_size = offset - note_offset;
     data_offset = TARGET_PAGE_ALIGN(offset);
 
@@ -2222,6 +2236,11 @@ static int elf_core_dump(int signr, const CPUArchState *env)
             dptr = fill_note(&hptr, NT_PRSTATUS, "CORE",
                              sizeof(struct target_elf_prstatus));
             fill_prstatus_note(dptr, cpu_iter, cpu_iter == cpu ? signr : 0);
+#ifdef HAVE_ELF_CORE_FPREGS
+            dptr = fill_note(&hptr, NT_FPREGSET, "CORE",
+                             sizeof(target_elf_fpregset_t));
+            fill_fpregset_note(dptr, cpu_iter);
+#endif
         }
 
         if (dump_write(fd, header, data_offset) < 0) {
diff --git a/linux-user/loader.h b/linux-user/loader.h
index da9ad28db5..5ddd140276 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -109,6 +109,9 @@ bool init_guest_commpage(void);
 
 struct target_elf_gregset_t;
 void elf_core_copy_regs(struct target_elf_gregset_t *, const CPUArchState *);
+/* Only defined by a target whose target_elf.h sets HAVE_ELF_CORE_FPREGS. */
+struct target_elf_fpregset_t;
+void elf_core_copy_fpregs(struct target_elf_fpregset_t *, const CPUArchState *);
 
 typedef struct {
     const uint8_t *image;
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 3/7] linux-user/alpha: write the floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
  2026-08-12 20:37 ` [PULL 1/7] linux-user: implement mount_setattr(2) Helge Deller
  2026-08-12 20:37 ` [PULL 2/7] linux-user: support writing floating-point registers to a core dump Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 4/7] linux-user/mips: " Helge Deller
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

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>
---
 linux-user/alpha/elfload.c    | 10 ++++++++++
 linux-user/alpha/target_elf.h | 11 +++++++++++
 2 files changed, 21 insertions(+)

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]    */
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 4/7] linux-user/mips: write the floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
                   ` (2 preceding siblings ...)
  2026-08-12 20:37 ` [PULL 3/7] linux-user/alpha: write the " Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 5/7] linux-user/hppa: " Helge Deller
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

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>
---
 linux-user/mips/elfload.c      |  8 ++++++++
 linux-user/mips/target_elf.h   | 13 +++++++++++++
 linux-user/mips64/target_elf.h | 13 +++++++++++++
 3 files changed, 34 insertions(+)

diff --git a/linux-user/mips/elfload.c b/linux-user/mips/elfload.c
index ce2c4514f3..1d62ae0a4d 100644
--- a/linux-user/mips/elfload.c
+++ b/linux-user/mips/elfload.c
@@ -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)
diff --git a/linux-user/mips/target_elf.h b/linux-user/mips/target_elf.h
index 157306f7a0..426f905d3a 100644
--- a/linux-user/mips/target_elf.h
+++ b/linux-user/mips/target_elf.h
@@ -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
diff --git a/linux-user/mips64/target_elf.h b/linux-user/mips64/target_elf.h
index 061471a0f1..efb5d97563 100644
--- a/linux-user/mips64/target_elf.h
+++ b/linux-user/mips64/target_elf.h
@@ -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
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 5/7] linux-user/hppa: write the floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
                   ` (3 preceding siblings ...)
  2026-08-12 20:37 ` [PULL 4/7] linux-user/mips: " Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 6/7] linux-user/riscv: " Helge Deller
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

Write an NT_FPREGSET note for HPPA, matching the kernel's
elf_fpregset_t layout (ELF_NFPREG = 32): fr0-fr31 as 64-bit values.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
 linux-user/hppa/elfload.c    | 7 +++++++
 linux-user/hppa/target_elf.h | 9 +++++++++
 2 files changed, 16 insertions(+)

diff --git a/linux-user/hppa/elfload.c b/linux-user/hppa/elfload.c
index ff4301b2ed..dd5b0b380e 100644
--- a/linux-user/hppa/elfload.c
+++ b/linux-user/hppa/elfload.c
@@ -17,6 +17,13 @@ const char *get_elf_platform(CPUState *cs)
     return "PARISC";
 }
 
+void elf_core_copy_fpregs(target_elf_fpregset_t *r, const CPUArchState *env)
+{
+    for (int i = 0; i < 32; i++) {
+        r->fpr[i] = tswap64(env->fr[i]);
+    }
+}
+
 void elf_core_copy_regs(target_elf_gregset_t *r, const CPUArchState *env)
 {
     int i;
diff --git a/linux-user/hppa/target_elf.h b/linux-user/hppa/target_elf.h
index 22547b1437..4357873aff 100644
--- a/linux-user/hppa/target_elf.h
+++ b/linux-user/hppa/target_elf.h
@@ -39,4 +39,13 @@ typedef struct target_elf_gregset_t {
 #define STACK_ALIGNMENT         64
 #define VDSO_HEADER             "vdso.c.inc"
 
+#define HAVE_ELF_CORE_FPREGS    1
+
+/*
+ * Matches the kernel's elf_fpregset_t (ELF_NFPREG = 32): fr0-fr31.
+ */
+typedef struct target_elf_fpregset_t {
+    uint64_t fpr[32];
+} target_elf_fpregset_t;
+
 #endif
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 6/7] linux-user/riscv: write the floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
                   ` (4 preceding siblings ...)
  2026-08-12 20:37 ` [PULL 5/7] linux-user/hppa: " Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-12 20:37 ` [PULL 7/7] linux-user/sh4: " Helge Deller
  2026-08-13  0:23 ` [PULL 0/7] Linux user patches Richard Henderson
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

Write an NT_FPREGSET note for RISC-V, matching struct __riscv_d_ext_state
from uapi/asm/ptrace.h: f0-f31 as 64-bit values followed by fcsr.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
 linux-user/riscv/elfload.c    |  9 +++++++++
 linux-user/riscv/target_elf.h | 11 +++++++++++
 2 files changed, 20 insertions(+)

diff --git a/linux-user/riscv/elfload.c b/linux-user/riscv/elfload.c
index afe103a631..1bc8beacb1 100644
--- a/linux-user/riscv/elfload.c
+++ b/linux-user/riscv/elfload.c
@@ -11,6 +11,15 @@ const char *get_elf_cpu_model(uint32_t eflags)
     return "max";
 }
 
+void elf_core_copy_fpregs(target_elf_fpregset_t *r, const CPURISCVState *env)
+{
+    for (int i = 0; i < 32; i++) {
+        r->fpr[i] = tswap64(env->fpr[i]);
+    }
+    r->fcsr = tswap32(((uint32_t)env->frm << FSR_RD_SHIFT) |
+                      (riscv_cpu_get_fflags((CPURISCVState *)env) << FSR_AEXC_SHIFT));
+}
+
 void elf_core_copy_regs(target_elf_gregset_t *r, const CPURISCVState *env)
 {
     r->pc = tswapal(env->pc);
diff --git a/linux-user/riscv/target_elf.h b/linux-user/riscv/target_elf.h
index 859f726578..185b81a2db 100644
--- a/linux-user/riscv/target_elf.h
+++ b/linux-user/riscv/target_elf.h
@@ -27,4 +27,15 @@ typedef struct target_elf_gregset_t {
     abi_ulong regs[31];
 } target_elf_gregset_t;
 
+#define HAVE_ELF_CORE_FPREGS    1
+
+/*
+ * Matches struct __riscv_d_ext_state from uapi/asm/ptrace.h:
+ *   f0-f31 as 64-bit values followed by fcsr.
+ */
+typedef struct target_elf_fpregset_t {
+    uint64_t fpr[32];
+    uint32_t fcsr;
+} target_elf_fpregset_t;
+
 #endif
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PULL 7/7] linux-user/sh4: write the floating-point registers to a core dump
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
                   ` (5 preceding siblings ...)
  2026-08-12 20:37 ` [PULL 6/7] linux-user/riscv: " Helge Deller
@ 2026-08-12 20:37 ` Helge Deller
  2026-08-13  0:23 ` [PULL 0/7] Linux user patches Richard Henderson
  7 siblings, 0 replies; 9+ messages in thread
From: Helge Deller @ 2026-08-12 20:37 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel
  Cc: Pierrick Bouvier, Philippe Mathieu-Daudé, Matt Turner,
	Laurent Vivier, Helge Deller

From: Matt Turner <mattst88@gmail.com>

Write an NT_FPREGSET note for SH4, matching struct user_fpu_struct
from arch/sh/include/asm/user.h: fr0-fr15, xf0-xf15, fpscr, fpul.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
 linux-user/sh4/elfload.c    | 10 ++++++++++
 linux-user/sh4/target_elf.h | 12 ++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/linux-user/sh4/elfload.c b/linux-user/sh4/elfload.c
index f03ce49e7d..41601626ca 100644
--- a/linux-user/sh4/elfload.c
+++ b/linux-user/sh4/elfload.c
@@ -52,6 +52,16 @@ abi_ulong get_elf_hwcap(CPUState *cs)
     return hwcap;
 }
 
+void elf_core_copy_fpregs(target_elf_fpregset_t *r, const CPUSH4State *env)
+{
+    for (int i = 0; i < 16; i++) {
+        r->fpregs[i] = tswap32(env->fregs[i]);
+        r->xfpregs[i] = tswap32(env->fregs[16 + i]);
+    }
+    r->fpscr = tswap32(env->fpscr);
+    r->fpul = tswap32(env->fpul);
+}
+
 void elf_core_copy_regs(target_elf_gregset_t *r, const CPUSH4State *env)
 {
     for (int i = 0; i < 16; i++) {
diff --git a/linux-user/sh4/target_elf.h b/linux-user/sh4/target_elf.h
index 3fcb63d409..5923022036 100644
--- a/linux-user/sh4/target_elf.h
+++ b/linux-user/sh4/target_elf.h
@@ -25,4 +25,16 @@ typedef struct target_elf_gregset_t {
     struct target_pt_regs pt;
 } target_elf_gregset_t;
 
+#define HAVE_ELF_CORE_FPREGS    1
+
+/*
+ * Matches struct user_fpu_struct from arch/sh/include/asm/user.h.
+ */
+typedef struct target_elf_fpregset_t {
+    uint32_t fpregs[16];
+    uint32_t xfpregs[16];
+    uint32_t fpscr;
+    uint32_t fpul;
+} target_elf_fpregset_t;
+
 #endif
-- 
2.54.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PULL 0/7] Linux user patches
  2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
                   ` (6 preceding siblings ...)
  2026-08-12 20:37 ` [PULL 7/7] linux-user/sh4: " Helge Deller
@ 2026-08-13  0:23 ` Richard Henderson
  7 siblings, 0 replies; 9+ messages in thread
From: Richard Henderson @ 2026-08-13  0:23 UTC (permalink / raw)
  To: qemu-devel

On 8/12/26 13:37, Helge Deller wrote:
> From: Helge Deller<deller@gmx.de>
> 
> The following changes since commit 3e3ccab106f879b1512f8e0d51a827dd4de30e22:
> 
>    Update version for v11.1.0-rc3 release (2026-08-04 15:36:08 -0400)
> 
> are available in the Git repository at:
> 
>    https://github.com/hdeller/qemu-hppa.git tags/linux-user-pull-request
> 
> for you to fetch changes up to ce276ab1a92cad460930fada1bc2e2e4a96f7595:
> 
>    linux-user/sh4: write the floating-point registers to a core dump (2026-08-07 18:14:13 +0200)
> 
> ----------------------------------------------------------------
> linux-user patches
> 
> Patches from Mat Turner to support the mount_setattr() syscall and to add
> floating-point registers to core dumps on alpha, mips, hppa, riscv and sh4.

Applied, thanks.  Please update https://wiki.qemu.org/ChangeLog/11.2 as appropriate.

r~


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-08-13  0:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-12 20:37 [PULL 0/7] Linux user patches Helge Deller
2026-08-12 20:37 ` [PULL 1/7] linux-user: implement mount_setattr(2) Helge Deller
2026-08-12 20:37 ` [PULL 2/7] linux-user: support writing floating-point registers to a core dump Helge Deller
2026-08-12 20:37 ` [PULL 3/7] linux-user/alpha: write the " Helge Deller
2026-08-12 20:37 ` [PULL 4/7] linux-user/mips: " Helge Deller
2026-08-12 20:37 ` [PULL 5/7] linux-user/hppa: " Helge Deller
2026-08-12 20:37 ` [PULL 6/7] linux-user/riscv: " Helge Deller
2026-08-12 20:37 ` [PULL 7/7] linux-user/sh4: " Helge Deller
2026-08-13  0:23 ` [PULL 0/7] Linux user patches Richard Henderson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.