diff mbox series

linux-user/s390x: Save/restore fpc when handling a signal

Message ID 20220817123902.585623-1-iii@linux.ibm.com
State New
Headers show
Series linux-user/s390x: Save/restore fpc when handling a signal | expand

Commit Message

Ilya Leoshkevich Aug. 17, 2022, 12:39 p.m. UTC
Linux kernel does this in fpregs_store() and fpregs_load(), so
qemu-user should do this as well.

Found by running valgrind's none/tests/s390x/test_sig.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
 linux-user/s390x/signal.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Richard Henderson Aug. 17, 2022, 1:28 p.m. UTC | #1
On 8/17/22 07:39, Ilya Leoshkevich wrote:
> Linux kernel does this in fpregs_store() and fpregs_load(), so
> qemu-user should do this as well.
> 
> Found by running valgrind's none/tests/s390x/test_sig.
> 
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
Laurent Vivier Sept. 27, 2022, 9:22 a.m. UTC | #2
Le 17/08/2022 à 14:39, Ilya Leoshkevich a écrit :
> Linux kernel does this in fpregs_store() and fpregs_load(), so
> qemu-user should do this as well.
> 
> Found by running valgrind's none/tests/s390x/test_sig.
> 
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
>   linux-user/s390x/signal.c | 2 ++
>   1 file changed, 2 insertions(+)

Applied to my linux-user-for-7.2 branch.

Thanks,
Laurent
diff mbox series

Patch

diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c
index 4979c4b017..f72165576f 100644
--- a/linux-user/s390x/signal.c
+++ b/linux-user/s390x/signal.c
@@ -146,6 +146,7 @@  static void save_sigregs(CPUS390XState *env, target_sigregs *sregs)
      * We have to store the fp registers to current->thread.fp_regs
      * to merge them with the emulated registers.
      */
+    __put_user(env->fpc, &sregs->fpregs.fpc);
     for (i = 0; i < 16; i++) {
         __put_user(*get_freg(env, i), &sregs->fpregs.fprs[i]);
     }
@@ -331,6 +332,7 @@  static void restore_sigregs(CPUS390XState *env, target_sigregs *sc)
     for (i = 0; i < 16; i++) {
         __get_user(env->aregs[i], &sc->regs.acrs[i]);
     }
+    __get_user(env->fpc, &sc->fpregs.fpc);
     for (i = 0; i < 16; i++) {
         __get_user(*get_freg(env, i), &sc->fpregs.fprs[i]);
     }