All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: Richard Henderson <richard.henderson@linaro.org>,
	Laurent Vivier <laurent@vivier.eu>
Subject: [PULL 25/59] linux-user/sparc: Save and restore fpu in signal frame
Date: Tue, 18 May 2021 07:30:57 +0200	[thread overview]
Message-ID: <20210518053131.87212-26-laurent@vivier.eu> (raw)
In-Reply-To: <20210518053131.87212-1-laurent@vivier.eu>

From: Richard Henderson <richard.henderson@linaro.org>

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210426025334.1168495-19-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/sparc/signal.c | 84 ++++++++++++++++++++++++---------------
 1 file changed, 51 insertions(+), 33 deletions(-)

diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index 57dbc72c9949..59bb4495121e 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -43,26 +43,25 @@ struct target_stackf {
     abi_ulong xargs[8];
 };
 
-typedef struct {
-    abi_ulong  si_float_regs[32];
-    unsigned   long si_fsr;
-    unsigned   long si_fpqdepth;
+struct target_siginfo_fpu {
+    /* It is more convenient for qemu to move doubles, not singles. */
+    uint64_t si_double_regs[16];
+    uint32_t si_fsr;
+    uint32_t si_fpqdepth;
     struct {
-        unsigned long *insn_addr;
-        unsigned long insn;
+        uint32_t insn_addr;
+        uint32_t insn;
     } si_fpqueue [16];
-} qemu_siginfo_fpu_t;
-
+};
 
 struct target_signal_frame {
     struct target_stackf ss;
     struct target_pt_regs regs;
-    uint32_t            si_mask;
-    abi_ulong           fpu_save;
-    uint32_t            insns[2] QEMU_ALIGNED(8);
-    abi_ulong           extramask[TARGET_NSIG_WORDS - 1];
-    abi_ulong           extra_size; /* Should be 0 */
-    qemu_siginfo_fpu_t fpu_state;
+    uint32_t si_mask;
+    abi_ulong fpu_save;
+    uint32_t insns[2] QEMU_ALIGNED(8);
+    abi_ulong extramask[TARGET_NSIG_WORDS - 1];
+    abi_ulong extra_size; /* Should be 0 */
 };
 
 static abi_ulong get_sigframe(struct target_sigaction *sa,
@@ -163,33 +162,51 @@ static void save_reg_win(struct target_reg_window *win, CPUSPARCState *env)
     }
 }
 
-#define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
+static void save_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
+{
+    int i;
+
+    for (i = 0; i < 16; ++i) {
+        __put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
+    }
+    __put_user(env->fsr, &fpu->si_fsr);
+    __put_user(0, &fpu->si_fpqdepth);
+}
+
+static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
+{
+    int i;
+
+    for (i = 0; i < 16; ++i) {
+        __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
+    }
+    __get_user(env->fsr, &fpu->si_fsr);
+}
 
 void setup_frame(int sig, struct target_sigaction *ka,
                  target_sigset_t *set, CPUSPARCState *env)
 {
     abi_ulong sf_addr;
     struct target_signal_frame *sf;
-    int sigframe_size, i;
+    size_t sf_size = sizeof(*sf) + sizeof(struct target_siginfo_fpu);
+    int i;
 
     /* 1. Make sure everything is clean */
-    //synchronize_user_stack();
 
-    sigframe_size = NF_ALIGNEDSZ;
-    sf_addr = get_sigframe(ka, env, sigframe_size);
+    sf_addr = get_sigframe(ka, env, sf_size);
     trace_user_setup_frame(env, sf_addr);
 
-    sf = lock_user(VERIFY_WRITE, sf_addr,
-                   sizeof(struct target_signal_frame), 0);
+    sf = lock_user(VERIFY_WRITE, sf_addr, sf_size, 0);
     if (!sf) {
         goto sigsegv;
     }
+
     /* 2. Save the current process state */
     save_pt_regs(&sf->regs, env);
     __put_user(0, &sf->extra_size);
 
-    //save_fpu_state(regs, &sf->fpu_state);
-    //__put_user(&sf->fpu_state, &sf->fpu_save);
+    save_fpu((struct target_siginfo_fpu *)(sf + 1), env);
+    __put_user(sf_addr + sizeof(*sf), &sf->fpu_save);
 
     __put_user(set->sig[0], &sf->si_mask);
     for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
@@ -226,7 +243,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
         val32 = 0x91d02010;
         __put_user(val32, &sf->insns[1]);
     }
-    unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
+    unlock_user(sf, sf_addr, sf_size);
     return;
 #if 0
 sigill_and_return:
@@ -248,7 +265,7 @@ long do_sigreturn(CPUSPARCState *env)
 {
     abi_ulong sf_addr;
     struct target_signal_frame *sf;
-    abi_ulong pc, npc;
+    abi_ulong pc, npc, ptr;
     target_sigset_t set;
     sigset_t host_set;
     int i;
@@ -276,14 +293,15 @@ long do_sigreturn(CPUSPARCState *env)
     env->pc = pc;
     env->npc = npc;
 
-    /* FIXME: implement FPU save/restore:
-     * __get_user(fpu_save, &sf->fpu_save);
-     * if (fpu_save) {
-     *     if (restore_fpu_state(env, fpu_save)) {
-     *         goto segv_and_exit;
-     *     }
-     * }
-     */
+    __get_user(ptr, &sf->fpu_save);
+    if (ptr) {
+        struct target_siginfo_fpu *fpu;
+        if ((ptr & 3) || !lock_user_struct(VERIFY_READ, fpu, ptr, 1)) {
+            goto segv_and_exit;
+        }
+        restore_fpu(fpu, env);
+        unlock_user_struct(fpu, ptr, 0);
+    }
 
     __get_user(set.sig[0], &sf->si_mask);
     for (i = 1; i < TARGET_NSIG_WORDS; i++) {
-- 
2.31.1



  parent reply	other threads:[~2021-05-18  5:59 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-18  5:30 [PULL 00/59] Linux user for 6.1 patches Laurent Vivier
2021-05-18  5:30 ` [PULL 01/59] linux-user: Remove dead code Laurent Vivier
2021-05-18  5:30 ` [PULL 02/59] linux-user: strace now handles unshare syscall args correctly Laurent Vivier
2021-05-18  5:30 ` [PULL 03/59] linux-user/arm: Split out emulate_arm_fpa11 Laurent Vivier
2021-05-18  5:30 ` [PULL 04/59] linux-user/arm: Do not emulate fpa11 in thumb mode Laurent Vivier
2021-05-18  5:30 ` [PULL 05/59] linux-user/arm: Do not fill in si_code for fpa11 exceptions Laurent Vivier
2021-05-18  5:30 ` [PULL 06/59] linux-user/arm: Simplify accumulating and raising " Laurent Vivier
2021-05-18  5:30 ` [PULL 07/59] linux-user: Add strace support for printing arguments of llseek Laurent Vivier
2021-05-18  5:30 ` [PULL 08/59] linux-user: Split out target_restore_altstack Laurent Vivier
2021-05-18  5:30 ` [PULL 09/59] linux-user: Use target_restore_altstack in all sigreturn Laurent Vivier
2021-05-18  5:30 ` [PULL 10/59] linux-user: Pass CPUArchState to do_sigaltstack Laurent Vivier
2021-05-18  5:30 ` [PULL 11/59] linux-user: Pass CPUArchState to target_restore_altstack Laurent Vivier
2021-05-18  5:30 ` [PULL 12/59] linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate Laurent Vivier
2021-05-18  5:30 ` [PULL 13/59] linux-user/sparc: Clean up init_thread Laurent Vivier
2021-05-18  5:30 ` [PULL 14/59] linux-user/sparc: Merge sparc64 target_syscall.h Laurent Vivier
2021-05-18  5:30 ` [PULL 15/59] linux-user/sparc: Merge sparc64 target_elf.h Laurent Vivier
2021-05-18  5:30 ` [PULL 16/59] linux-user/sparc: Merge sparc64 target_structs.h Laurent Vivier
2021-05-18  5:30 ` [PULL 17/59] linux-user/sparc: Merge sparc64 termbits.h Laurent Vivier
2021-05-18  5:30 ` [PULL 18/59] linux-user/sparc: Merge sparc64/ into sparc/ Laurent Vivier
2021-05-18  5:30 ` [PULL 19/59] linux-user/sparc: Remove target_sigcontext as unused Laurent Vivier
2021-05-18  5:30 ` [PULL 20/59] linux-user/sparc: Remove target_rt_signal_frame " Laurent Vivier
2021-05-18  5:30 ` [PULL 21/59] linux-user/sparc: Fix the stackframe structure Laurent Vivier
2021-05-18  5:30 ` [PULL 22/59] linux-user/sparc: Use target_pt_regs Laurent Vivier
2021-05-18  5:30 ` [PULL 23/59] linux-user/sparc: Split out save_reg_win Laurent Vivier
2021-05-18  5:30 ` [PULL 24/59] linux-user/sparc: Clean up get_sigframe Laurent Vivier
2021-05-18  5:30 ` Laurent Vivier [this message]
2021-05-18  5:30 ` [PULL 26/59] linux-user/sparc: Add rwin_save to signal frame Laurent Vivier
2021-05-18  5:30 ` [PULL 27/59] linux-user/sparc: Clean up setup_frame Laurent Vivier
2021-05-18  5:31 ` [PULL 28/59] linux-user/sparc: Minor corrections to do_sigreturn Laurent Vivier
2021-05-18  5:31 ` [PULL 29/59] linux-user/sparc: Add 64-bit support to fpu save/restore Laurent Vivier
2021-05-18  5:31 ` [PULL 30/59] linux-user/sparc: Implement sparc32 rt signals Laurent Vivier
2021-05-18  5:31 ` [PULL 31/59] linux-user/sparc: Implement sparc64 " Laurent Vivier
2021-05-18  5:31 ` [PULL 32/59] tests/tcg/sparc64: Re-enable linux-test Laurent Vivier
2021-05-18  5:31 ` [PULL 33/59] linux-user/s390x: Fix sigframe types Laurent Vivier
2021-05-18  5:31 ` [PULL 34/59] linux-user/s390x: Use uint16_t for signal retcode Laurent Vivier
2021-05-18  5:31 ` [PULL 35/59] linux-user/s390x: Remove PSW_ADDR_AMODE Laurent Vivier
2021-05-18  5:31 ` [PULL 36/59] linux-user/s390x: Remove restore_sigregs return value Laurent Vivier
2021-05-18  5:31 ` [PULL 37/59] linux-user/s390x: Fix trace in restore_regs Laurent Vivier
2021-05-18  5:31 ` [PULL 38/59] linux-user/s390x: Fix sigcontext sregs value Laurent Vivier
2021-05-18  5:31 ` [PULL 39/59] linux-user/s390x: Use tswap_sigset in setup_rt_frame Laurent Vivier
2021-05-18  5:31 ` [PULL 40/59] linux-user/s390x: Tidy save_sigregs Laurent Vivier
2021-05-18  5:31 ` [PULL 41/59] linux-user/s390x: Clean up single-use gotos in signal.c Laurent Vivier
2021-05-18  5:31 ` [PULL 42/59] linux-user/s390x: Set psw.mask properly for the signal handler Laurent Vivier
2021-05-18  5:31 ` [PULL 43/59] linux-user/s390x: Add stub sigframe argument for last_break Laurent Vivier
2021-05-18  5:31 ` [PULL 44/59] linux-user/s390x: Fix frame_addr corruption in setup_frame Laurent Vivier
2021-05-18  5:31 ` [PULL 45/59] linux-user/s390x: Add build asserts for sigset sizes Laurent Vivier
2021-05-18  5:31 ` [PULL 46/59] linux-user/s390x: Clean up signal.c Laurent Vivier
2021-05-18  5:31 ` [PULL 47/59] linux-user/s390x: Handle vector regs in signal stack Laurent Vivier
2021-05-18  5:31 ` [PULL 48/59] linux-user: Add copy_file_range to strace.list Laurent Vivier
2021-05-18  5:31 ` [PULL 49/59] linux-user: Fix erroneous conversion in copy_file_range Laurent Vivier
2021-05-18  5:31 ` [PULL 50/59] linux-user: use GDateTime for formatting timestamp for core file Laurent Vivier
2021-05-18  5:31 ` [PULL 51/59] linux-user/alpha: Fix rt sigframe return Laurent Vivier
2021-05-18  5:31 ` [PULL 52/59] linux-user/alpha: Rename the sigaction restorer field Laurent Vivier
2021-05-18  5:31 ` [PULL 53/59] linux-user: Pass ka_restorer to do_sigaction Laurent Vivier
2021-05-18  5:31 ` [PULL 54/59] linux-user: Honor TARGET_ARCH_HAS_SA_RESTORER in do_syscall Laurent Vivier
2021-05-18  5:31 ` [PULL 55/59] linux-user/alpha: Define TARGET_ARCH_HAS_KA_RESTORER Laurent Vivier
2021-05-18  5:31 ` [PULL 56/59] linux-user/alpha: Share code for TARGET_NR_sigaction Laurent Vivier
2021-05-18  5:31 ` [PULL 57/59] linux-user: Tidy TARGET_NR_rt_sigaction Laurent Vivier
2021-05-18  5:31 ` [PULL 58/59] linux-user/elfload: fix filling psinfo->pr_psargs Laurent Vivier
2021-05-18  5:31 ` [PULL 59/59] linux-user/elfload: add s390x core dumping support Laurent Vivier
2021-05-18 20:18 ` [PULL 00/59] Linux user for 6.1 patches Peter Maydell
2021-05-20 13:17 ` Philippe Mathieu-Daudé
  -- strict thread matches above, loose matches on Subject: below --
2021-05-17 18:13 Laurent Vivier
2021-05-17 18:13 ` [PULL 25/59] linux-user/sparc: Save and restore fpu in signal frame Laurent Vivier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210518053131.87212-26-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.