On Sat, Apr 15, 2023 at 6:32 AM Weiwei Li <liwei...@iscas.ac.cn> wrote: > > > On 2023/4/15 00:01, Mayuresh Chitale wrote: > > If smstateen is implemented and smtateen0.fcsr is clear and misa.F > > is off then the floating point operations must return illegal > > instruction exception or virtual instruction trap, if relevant. > > > > Signed-off-by: Mayuresh Chitale <mchit...@ventanamicro.com> > > --- > > target/riscv/csr.c | 23 +++++++++++++++++++++++ > > 1 file changed, 23 insertions(+) > > > > diff --git a/target/riscv/csr.c b/target/riscv/csr.c > > index f4d2dcfdc8..8ae9e95f9f 100644 > > --- a/target/riscv/csr.c > > +++ b/target/riscv/csr.c > > @@ -82,6 +82,10 @@ static RISCVException fs(CPURISCVState *env, int csrno) > > !riscv_cpu_cfg(env)->ext_zfinx) { > > return RISCV_EXCP_ILLEGAL_INST; > > } > > + > > + if (!env->debugger && !riscv_cpu_fp_enabled(env)) { > > + return smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR); > > + } > > #endif > > return RISCV_EXCP_NONE; > > } > > @@ -2081,6 +2085,9 @@ static RISCVException write_mstateen0(CPURISCVState > > *env, int csrno, > > target_ulong new_val) > > { > > uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG; > > + if (!riscv_has_ext(env, RVF)) { > > + wr_mask |= SMSTATEEN0_FCSR; > > + } > > > > return write_mstateen(env, csrno, wr_mask, new_val); > > } > > @@ -2117,6 +2124,10 @@ static RISCVException write_mstateen0h(CPURISCVState > > *env, int csrno, > > { > > uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG; > > > > + if (!riscv_has_ext(env, RVF)) { > > + wr_mask |= SMSTATEEN0_FCSR; > > + } > > + > > FCSR is bit 1 of mstateen0. So it seems unnecessary to be added to > wr_mask for mstateen0h. > > Similar to hstateen0h. > > Otherwise, Reviewed-by: Weiwei Li <liwei...@iscas.ac.cn> > Thanks, I will make the change above in the next version. > Weiwei Li > > return write_mstateenh(env, csrno, wr_mask, new_val); > > } > > > > @@ -2154,6 +2165,10 @@ static RISCVException write_hstateen0(CPURISCVState > > *env, int csrno, > > { > > uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG; > > > > + if (!riscv_has_ext(env, RVF)) { > > + wr_mask |= SMSTATEEN0_FCSR; > > + } > > + > > return write_hstateen(env, csrno, wr_mask, new_val); > > } > > > > @@ -2193,6 +2208,10 @@ static RISCVException write_hstateen0h(CPURISCVState > > *env, int csrno, > > { > > uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG; > > > > + if (!riscv_has_ext(env, RVF)) { > > + wr_mask |= SMSTATEEN0_FCSR; > > + } > > + > > return write_hstateenh(env, csrno, wr_mask, new_val); > > } > > > > @@ -2240,6 +2259,10 @@ static RISCVException write_sstateen0(CPURISCVState > > *env, int csrno, > > { > > uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG; > > > > + if (!riscv_has_ext(env, RVF)) { > > + wr_mask |= SMSTATEEN0_FCSR; > > + } > > + > > return write_sstateen(env, csrno, wr_mask, new_val); > > } > > >