Skip to content

Commit 344a860

Browse files
authored
Merge pull request #1724 from chihminchao/cif-sse-fix
The senvcfg.SSE will read (only) as zero when menvcfg.SSE is 0
2 parents f2181f0 + ea5138d commit 344a860

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
@@ -1585,6 +1585,18 @@ void senvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15851585
masked_csr_t::verify_permissions(insn, write);
15861586
}
15871587

1588+
// senvcfg.sse is read_only 0 when menvcfg.sse = 0
1589+
reg_t senvcfg_csr_t::read() const noexcept {
1590+
reg_t envcfg = state->v ? state->henvcfg->read() : state->menvcfg->read();
1591+
return masked_csr_t::read() & ~(envcfg & MENVCFG_SSE ? 0 : MENVCFG_SSE);
1592+
}
1593+
1594+
bool senvcfg_csr_t::unlogged_write(const reg_t val) noexcept {
1595+
reg_t envcfg = state->v ? state->henvcfg->read() : state->menvcfg->read();
1596+
const reg_t mask = envcfg | ~MENVCFG_SSE;
1597+
return envcfg_csr_t::unlogged_write((masked_csr_t::read() & ~mask) | (val & mask));
1598+
}
1599+
15881600
void henvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15891601
if (proc->extension_enabled(EXT_SMSTATEEN)) {
15901602
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_HENVCFG))
@@ -1595,7 +1607,7 @@ void henvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
15951607
}
15961608

15971609
bool henvcfg_csr_t::unlogged_write(const reg_t val) noexcept {
1598-
const reg_t mask = menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE);
1610+
const reg_t mask = menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE | MENVCFG_SSE);
15991611
return envcfg_csr_t::unlogged_write((masked_csr_t::read() & ~mask) | (val & mask));
16001612
}
16011613

riscv/csrs.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -481,14 +481,13 @@ class envcfg_csr_t: public masked_csr_t {
481481
// henvcfg.stce is read_only 0 when menvcfg.stce = 0
482482
// henvcfg.hade is read_only 0 when menvcfg.hade = 0
483483
// henvcfg.dte is read_only 0 when menvcfg.dte = 0
484+
// henvcfg.sse is read_only 0 when menvcfg.sse = 0
484485
class henvcfg_csr_t final: public envcfg_csr_t {
485486
public:
486487
henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg);
487-
488488
reg_t read() const noexcept override {
489-
return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE)) & masked_csr_t::read();
489+
return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE | MENVCFG_DTE | MENVCFG_SSE)) & masked_csr_t::read();
490490
}
491-
492491
virtual void verify_permissions(insn_t insn, bool write) const override;
493492

494493
protected:
@@ -788,7 +787,11 @@ class sstateen_csr_t: public hstateen_csr_t {
788787
class senvcfg_csr_t final: public envcfg_csr_t {
789788
public:
790789
senvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init);
790+
reg_t read() const noexcept override;
791791
virtual void verify_permissions(insn_t insn, bool write) const override;
792+
793+
protected:
794+
virtual bool unlogged_write(const reg_t val) noexcept override;
792795
};
793796

794797
class stimecmp_csr_t: public basic_csr_t {

0 commit comments

Comments
 (0)