Skip to content

Commit ea5138d

Browse files
committed
The senvcfg.SSE will read (only) as zero when menvcfg.SSE is 0
1 parent f7d0dba commit ea5138d

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

riscv/csrs.cc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,18 @@ void senvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15611561
masked_csr_t::verify_permissions(insn, write);
15621562
}
15631563

1564+
// senvcfg.sse is read_only 0 when menvcfg.sse = 0
1565+
reg_t senvcfg_csr_t::read() const noexcept {
1566+
reg_t envcfg = state->v ? state->henvcfg->read() : state->menvcfg->read();
1567+
return masked_csr_t::read() & ~(envcfg & MENVCFG_SSE ? 0 : MENVCFG_SSE);
1568+
}
1569+
1570+
bool senvcfg_csr_t::unlogged_write(const reg_t val) noexcept {
1571+
reg_t envcfg = state->v ? state->henvcfg->read() : state->menvcfg->read();
1572+
const reg_t mask = envcfg | ~MENVCFG_SSE;
1573+
return envcfg_csr_t::unlogged_write((masked_csr_t::read() & ~mask) | (val & mask));
1574+
}
1575+
15641576
void henvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15651577
if (proc->extension_enabled(EXT_SMSTATEEN)) {
15661578
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_HENVCFG))
@@ -1571,7 +1583,7 @@ void henvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15711583
}
15721584

15731585
bool henvcfg_csr_t::unlogged_write(const reg_t val) noexcept {
1574-
const reg_t mask = menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE);
1586+
const reg_t mask = menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE | MENVCFG_SSE);
15751587
return envcfg_csr_t::unlogged_write((masked_csr_t::read() & ~mask) | (val & mask));
15761588
}
15771589

riscv/csrs.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,14 +479,13 @@ class envcfg_csr_t: public masked_csr_t {
479479
// henvcfg.stce is read_only 0 when menvcfg.stce = 0
480480
// henvcfg.hade is read_only 0 when menvcfg.hade = 0
481481
// henvcfg.dte is read_only 0 when menvcfg.dte = 0
482+
// henvcfg.sse is read_only 0 when menvcfg.sse = 0
482483
class henvcfg_csr_t final: public envcfg_csr_t {
483484
public:
484485
henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg);
485-
486486
reg_t read() const noexcept override {
487-
return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE)) & masked_csr_t::read();
487+
return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE | MENVCFG_SSE)) & masked_csr_t::read();
488488
}
489-
490489
virtual void verify_permissions(insn_t insn, bool write) const override;
491490

492491
protected:
@@ -786,7 +785,11 @@ class sstateen_csr_t: public hstateen_csr_t {
786785
class senvcfg_csr_t final: public envcfg_csr_t {
787786
public:
788787
senvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init);
788+
reg_t read() const noexcept override;
789789
virtual void verify_permissions(insn_t insn, bool write) const override;
790+
791+
protected:
792+
virtual bool unlogged_write(const reg_t val) noexcept override;
790793
};
791794

792795
class stimecmp_csr_t: public basic_csr_t {

0 commit comments

Comments
 (0)