aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYenHaoChen <howard25336284@gmail.com>2024-04-09 09:13:24 +0800
committerYenHaoChen <howard25336284@gmail.com>2024-04-09 09:29:00 +0800
commita101bfebe07c92447b8239737c1a18702e63df98 (patch)
tree8a57198d32c410f260650a17ffb9c87cb62e5209
parent3427b459f88d2334368a1abbdf5a3000957f08e8 (diff)
downloadriscv-isa-sim-a101bfebe07c92447b8239737c1a18702e63df98.zip
riscv-isa-sim-a101bfebe07c92447b8239737c1a18702e63df98.tar.gz
riscv-isa-sim-a101bfebe07c92447b8239737c1a18702e63df98.tar.bz2
Ignore writes to henvcfg fields (PBMTE, STCE, and ADUE) when read-only 0
The henvcfg fields, i.e., PBMTE, STCE, and ADUE, are read-only 0 when the corresponding bits in menvcfg are 0. Besides the reading behavior, the spec also specified the writing behavior, i.e., ignoring writes. This commit ignores writes to the henvcfg fields when read-only 0. Reference: https://github.com/riscv/riscv-isa-manual/issues/1312
-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;
};