target/riscv: hardwire mstatus.FS to zero when enable zfinx
Co-authored-by: ardxwe <ardxwe@gmail.com> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20220211043920.28981-3-liweiwei@iscas.ac.cn> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
89ffdcec27
commit
c163b3baf9
@ -466,9 +466,13 @@ bool riscv_cpu_vector_enabled(CPURISCVState *env)
|
||||
|
||||
void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env)
|
||||
{
|
||||
uint64_t mstatus_mask = MSTATUS_MXR | MSTATUS_SUM | MSTATUS_FS |
|
||||
uint64_t mstatus_mask = MSTATUS_MXR | MSTATUS_SUM |
|
||||
MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_SIE |
|
||||
MSTATUS64_UXL | MSTATUS_VS;
|
||||
|
||||
if (riscv_has_ext(env, RVF)) {
|
||||
mstatus_mask |= MSTATUS_FS;
|
||||
}
|
||||
bool current_virt = riscv_cpu_virt_enabled(env);
|
||||
|
||||
g_assert(riscv_has_ext(env, RVH));
|
||||
|
@ -39,7 +39,8 @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops)
|
||||
static RISCVException fs(CPURISCVState *env, int csrno)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
|
||||
if (!env->debugger && !riscv_cpu_fp_enabled(env) &&
|
||||
!RISCV_CPU(env_cpu(env))->cfg.ext_zfinx) {
|
||||
return RISCV_EXCP_ILLEGAL_INST;
|
||||
}
|
||||
#endif
|
||||
@ -302,7 +303,9 @@ static RISCVException write_fflags(CPURISCVState *env, int csrno,
|
||||
target_ulong val)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
if (riscv_has_ext(env, RVF)) {
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
}
|
||||
#endif
|
||||
riscv_cpu_set_fflags(env, val & (FSR_AEXC >> FSR_AEXC_SHIFT));
|
||||
return RISCV_EXCP_NONE;
|
||||
@ -319,7 +322,9 @@ static RISCVException write_frm(CPURISCVState *env, int csrno,
|
||||
target_ulong val)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
if (riscv_has_ext(env, RVF)) {
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
}
|
||||
#endif
|
||||
env->frm = val & (FSR_RD >> FSR_RD_SHIFT);
|
||||
return RISCV_EXCP_NONE;
|
||||
@ -337,7 +342,9 @@ static RISCVException write_fcsr(CPURISCVState *env, int csrno,
|
||||
target_ulong val)
|
||||
{
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
if (riscv_has_ext(env, RVF)) {
|
||||
env->mstatus |= MSTATUS_FS;
|
||||
}
|
||||
#endif
|
||||
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
|
||||
riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT);
|
||||
@ -653,10 +660,14 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
||||
tlb_flush(env_cpu(env));
|
||||
}
|
||||
mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE |
|
||||
MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM |
|
||||
MSTATUS_SPP | MSTATUS_MPRV | MSTATUS_SUM |
|
||||
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
||||
MSTATUS_TW | MSTATUS_VS;
|
||||
|
||||
if (riscv_has_ext(env, RVF)) {
|
||||
mask |= MSTATUS_FS;
|
||||
}
|
||||
|
||||
if (xl != MXL_RV32 || env->debugger) {
|
||||
/*
|
||||
* RV32: MPV and GVA are not in mstatus. The current plan is to
|
||||
@ -788,6 +799,10 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
|
||||
return RISCV_EXCP_NONE;
|
||||
}
|
||||
|
||||
if (!(val & RVF)) {
|
||||
env->mstatus &= ~MSTATUS_FS;
|
||||
}
|
||||
|
||||
/* flush translation cache */
|
||||
tb_flush(env_cpu(env));
|
||||
env->misa_ext = val;
|
||||
|
@ -426,6 +426,10 @@ static void mark_fs_dirty(DisasContext *ctx)
|
||||
{
|
||||
TCGv tmp;
|
||||
|
||||
if (!has_ext(ctx, RVF)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ctx->mstatus_fs != MSTATUS_FS) {
|
||||
/* Remember the state change for the rest of the TB. */
|
||||
ctx->mstatus_fs = MSTATUS_FS;
|
||||
|
Loading…
Reference in New Issue
Block a user