[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 02/10] target/m68k, linux-user: manage FP registers i
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 02/10] target/m68k, linux-user: manage FP registers in ucontext |
Date: |
Wed, 18 Oct 2017 15:33:16 +0300 |
From: Laurent Vivier <address@hidden>
Signed-off-by: Laurent Vivier <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/signal.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index cc0c3fcee9..7a238aaea1 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -5704,6 +5704,24 @@ give_sigsegv:
force_sigsegv(sig);
}
+static inline void target_rt_save_fpu_state(struct target_ucontext *uc,
+ CPUM68KState *env)
+{
+ int i;
+ target_fpregset_t *fpregs = &uc->tuc_mcontext.fpregs;
+
+ __put_user(env->fpcr, &fpregs->f_fpcntl[0]);
+ __put_user(env->fpsr, &fpregs->f_fpcntl[1]);
+ /* fpiar is not emulated */
+
+ for (i = 0; i < 8; i++) {
+ uint32_t high = env->fregs[i].d.high << 16;
+ __put_user(high, &fpregs->f_fpregs[i * 3]);
+ __put_user(env->fregs[i].d.low,
+ (uint64_t *)&fpregs->f_fpregs[i * 3 + 1]);
+ }
+}
+
static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
CPUM68KState *env)
{
@@ -5730,9 +5748,32 @@ static inline int target_rt_setup_ucontext(struct
target_ucontext *uc,
__put_user(env->pc, &gregs[16]);
__put_user(sr, &gregs[17]);
+ target_rt_save_fpu_state(uc, env);
+
return 0;
}
+static inline void target_rt_restore_fpu_state(CPUM68KState *env,
+ struct target_ucontext *uc)
+{
+ int i;
+ target_fpregset_t *fpregs = &uc->tuc_mcontext.fpregs;
+ uint32_t fpcr;
+
+ __get_user(fpcr, &fpregs->f_fpcntl[0]);
+ cpu_m68k_set_fpcr(env, fpcr);
+ __get_user(env->fpsr, &fpregs->f_fpcntl[1]);
+ /* fpiar is not emulated */
+
+ for (i = 0; i < 8; i++) {
+ uint32_t high;
+ __get_user(high, &fpregs->f_fpregs[i * 3]);
+ env->fregs[i].d.high = high >> 16;
+ __get_user(env->fregs[i].d.low,
+ (uint64_t *)&fpregs->f_fpregs[i * 3 + 1]);
+ }
+}
+
static inline int target_rt_restore_ucontext(CPUM68KState *env,
struct target_ucontext *uc)
{
@@ -5764,6 +5805,8 @@ static inline int target_rt_restore_ucontext(CPUM68KState
*env,
__get_user(temp, &gregs[17]);
cpu_m68k_set_ccr(env, temp);
+ target_rt_restore_fpu_state(env, uc);
+
return 0;
badframe:
--
2.14.2
- [Qemu-devel] [PULL 00/10] linux-user update for 2.11, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 03/10] linux-user: remove duplicate break in syscall, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 05/10] tcg: Fix off-by-one in assert in page_set_flags, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 01/10] linux-user: fix O_TMPFILE handling, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 02/10] target/m68k, linux-user: manage FP registers in ucontext,
riku . voipio <=
- [Qemu-devel] [PULL 04/10] linux-user: Allow -R values up to 0xffff0000 for 32-bit ARM guests, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 07/10] linux-user/sh4: Reduce TARGET_VIRT_ADDR_SPACE_BITS to 31, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 06/10] linux-user: Tidy and enforce reserved_va initialization, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 10/10] linux-user: Fix TARGET_MTIOCTOP/MTIOCGET/MTIOCPOS values, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 09/10] linux-user/main: support dfilter, riku . voipio, 2017/10/18
- [Qemu-devel] [PULL 08/10] linux-user: Fix target FS_IOC_GETFLAGS and FS_IOC_SETFLAGS numbers, riku . voipio, 2017/10/18
- Re: [Qemu-devel] [PULL 00/10] linux-user update for 2.11, Peter Maydell, 2017/10/19
- Re: [Qemu-devel] [PULL 00/10] linux-user update for 2.11, no-reply, 2017/10/22