LemonBoy, could you resend a series of two patches modified as said by Richard?
Changes should be only cosmetic. Thanks, Laurent Le 10/04/2020 à 23:14, LemonBoy a écrit : > From 11d0cfe58d12e0f191b435ade88622cfceb2098a Mon Sep 17 00:00:00 2001 > From: LemonBoy <thatle...@gmail.com> > Date: Fri, 10 Apr 2020 22:55:26 +0200 > Subject: [PATCH] linux-user/sparc64: Translate flushw opcode > > The ifdef logic should unconditionally compile in the `xop == 0x2b` case > when targeting sparc64. > > Fix the handling of window spill traps by keeping cansave into account > when calculating the new CWP. > > Signed-off-by: Giuseppe Musacchio <thatle...@gmail.com> > --- > bsd-user/main.c | 4 +++- > linux-user/sparc/cpu_loop.c | 4 +++- > target/sparc/translate.c | 2 ++ > 3 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/bsd-user/main.c b/bsd-user/main.c > index 770c2b267a..d6b1c997e3 100644 > --- a/bsd-user/main.c > +++ b/bsd-user/main.c > @@ -413,7 +413,9 @@ static void save_window(CPUSPARCState *env) > save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); > env->wim = new_wim; > #else > - save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); > + /* cansave is zero if the spill trap handler is triggered by `save` and > */ > + /* nonzero if triggered by a `flushw` */ > + save_window_offset(env, cpu_cwp_dec(env, env->cwp - env->cansave - 2)); > env->cansave++; > env->canrestore--; > #endif > diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c > index 7645cc04ca..20a7401126 100644 > --- a/linux-user/sparc/cpu_loop.c > +++ b/linux-user/sparc/cpu_loop.c > @@ -69,7 +69,9 @@ static void save_window(CPUSPARCState *env) > save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); > env->wim = new_wim; > #else > - save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); > + /* cansave is zero if the spill trap handler is triggered by `save` and > */ > + /* nonzero if triggered by a `flushw` */ > + save_window_offset(env, cpu_cwp_dec(env, env->cwp - env->cansave - 2)); > env->cansave++; > env->canrestore--; > #endif > diff --git a/target/sparc/translate.c b/target/sparc/translate.c > index 9416a551cf..1a4efd4ed6 100644 > --- a/target/sparc/translate.c > +++ b/target/sparc/translate.c > @@ -3663,6 +3663,8 @@ static void disas_sparc_insn(DisasContext * dc, > unsigned int insn) > #endif > gen_store_gpr(dc, rd, cpu_tmp0); > break; > +#endif > +#if defined(TARGET_SPARC64) || !defined(CONFIG_USER_ONLY) > } else if (xop == 0x2b) { /* rdtbr / V9 flushw */ > #ifdef TARGET_SPARC64 > gen_helper_flushw(cpu_env); >