On Fri, May 19, 2023 at 3:51 AM Mayuresh Chitale <mchit...@ventanamicro.com> wrote: > > Implement the s/h/mstateen.fcsr bit as defined in the smstateen spec > and check for it when accessing the fcsr register and its fields. > > Signed-off-by: Mayuresh Chitale <mchit...@ventanamicro.com> > Reviewed-by: Weiwei Li <liwei...@iscas.ac.cn>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/csr.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/target/riscv/csr.c b/target/riscv/csr.c > index 4451bd1263..3f6b824bd2 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; > } > @@ -2100,6 +2104,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); > } > @@ -2173,6 +2180,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); > } > > @@ -2259,6 +2270,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); > } > > -- > 2.34.1 >