Skip to content

Commit

Permalink
target/m68k,linux-user: manage FP registers in ucontext
Browse files Browse the repository at this point in the history
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
  • Loading branch information
vivier authored and Riku Voipio committed Oct 16, 2017
1 parent 5f9cee4 commit ee46a46
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions linux-user/signal.c
Expand Up @@ -5704,6 +5704,24 @@ static void setup_frame(int sig, struct target_sigaction *ka,
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)
{
Expand All @@ -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)
{
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit ee46a46

Please sign in to comment.