Message ID | f1725ddb8d69edf68ddd2d6e1b6688cd7b2ba550.1575914822.git.alistair.francis@wdc.com |
---|---|
State | New |
Headers | show |
Series | Add RISC-V Hypervisor Extension v0.5 | expand |
On Mon, 09 Dec 2019 10:11:56 PST (-0800), Alistair Francis wrote: > mark_fs_dirty() is the only place in translate.c that uses the > virt_enabled bool. Let's respect the contents of MSTATUS.MPRV and > HSTATUS.SPRV when setting the bool as this is used for 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(-) > > diff --git a/target/riscv/translate.c b/target/riscv/translate.c > index 1d879b34db..dd93e12b45 100644 > --- a/target/riscv/translate.c > +++ b/target/riscv/translate.c > @@ -748,7 +748,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 Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 1d879b34db..dd93e12b45 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -748,7 +748,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
mark_fs_dirty() is the only place in translate.c that uses the virt_enabled bool. Let's respect the contents of MSTATUS.MPRV and HSTATUS.SPRV when setting the bool as this is used for 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(-)