Message ID | 8a628d1542d547b6d639cdba51db67590d0b56de.1566603412.git.alistair.francis@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add RISC-V Hypervisor Extension v0.4 | expand |
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. > > Signed-off-by: Alistair Francis <alistair.francis@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
On Wed, Oct 2, 2019 at 4:52 PM Palmer Dabbelt <palmer@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.francis@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
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
Respect the contents of MSTATUS.MPRV and HSTATUS.SPRV when performing floating point operations when V=0. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> --- target/riscv/translate.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)