On Wed, Oct 2, 2019 at 4:52 PM Palmer Dabbelt <pal...@sifive.com> wrote: > > On Fri, 23 Aug 2019 16:38:44 PDT (-0700), Alistair Francis wrote: > > Respect the contents of MSTATUS.MPRV and HSTATUS.SPRV when performing > > floating point operations when V=0. > > I'm confused as to what this has to do with floating point.
virt_enabled is only checked in mark_fs_dirty() for floating point support. Alistair > > > > > Signed-off-by: Alistair Francis <alistair.fran...@wdc.com> > > --- > > target/riscv/translate.c | 16 +++++++++++++++- > > 1 file changed, 15 insertions(+), 1 deletion(-) > > > > diff --git a/target/riscv/translate.c b/target/riscv/translate.c > > index 19771904f4..ea19ba9c5d 100644 > > --- a/target/riscv/translate.c > > +++ b/target/riscv/translate.c > > @@ -750,7 +750,21 @@ static void > > riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) > > ctx->mstatus_fs = ctx->base.tb->flags & TB_FLAGS_MSTATUS_FS; > > ctx->priv_ver = env->priv_ver; > > #if !defined(CONFIG_USER_ONLY) > > - ctx->virt_enabled = riscv_cpu_virt_enabled(env); > > + if (riscv_has_ext(env, RVH)) { > > + ctx->virt_enabled = riscv_cpu_virt_enabled(env); > > + if (env->priv_ver == PRV_M && > > + get_field(*env->mstatus, MSTATUS_MPRV) && > > + get_field(*env->mstatus, MSTATUS_MPV)) { > > + ctx->virt_enabled = true; > > + } else if (env->priv == PRV_S && > > + !riscv_cpu_virt_enabled(env) && > > + get_field(env->hstatus, HSTATUS_SPRV) && > > + get_field(env->hstatus, HSTATUS_SPV)) { > > + ctx->virt_enabled = true; > > + } > > + } else { > > + ctx->virt_enabled = false; > > + } > > #else > > ctx->virt_enabled = false; > > #endif