aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/csrs.cc5
-rw-r--r--riscv/csrs.h3
2 files changed, 8 insertions, 0 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index 4900581..4a612e5 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -1549,6 +1549,11 @@ void henvcfg_csr_t::verify_permissions(insn_t insn, bool write) const {
masked_csr_t::verify_permissions(insn, write);
}
+bool henvcfg_csr_t::unlogged_write(const reg_t val) noexcept {
+ const reg_t mask = menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_ADUE);
+ return envcfg_csr_t::unlogged_write((masked_csr_t::read() & ~mask) | (val & mask));
+}
+
stimecmp_csr_t::stimecmp_csr_t(processor_t* const proc, const reg_t addr, const reg_t imask):
basic_csr_t(proc, addr, 0), intr_mask(imask) {
}
diff --git a/riscv/csrs.h b/riscv/csrs.h
index 990c301..2595243 100644
--- a/riscv/csrs.h
+++ b/riscv/csrs.h
@@ -490,6 +490,9 @@ class henvcfg_csr_t final: public envcfg_csr_t {
virtual void verify_permissions(insn_t insn, bool write) const override;
+ protected:
+ virtual bool unlogged_write(const reg_t val) noexcept override;
+
private:
csr_t_p menvcfg;
};