diff options
author | Scott Johnson <scott.johnson@arilinc.com> | 2023-07-25 10:27:35 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-25 10:27:35 -0500 |
commit | 4d0171931c4e8f03d9038da98eb4003789b1ac4c (patch) | |
tree | 57170ac29fa337198900c104dc388fed4018f3ee | |
parent | 5e375b98d9a8aeddbeb4befe7a569b88c80ef037 (diff) | |
parent | e7e188011182a60c94bf2b35c94f02795d906da4 (diff) | |
download | riscv-isa-sim-4d0171931c4e8f03d9038da98eb4003789b1ac4c.zip riscv-isa-sim-4d0171931c4e8f03d9038da98eb4003789b1ac4c.tar.gz riscv-isa-sim-4d0171931c4e8f03d9038da98eb4003789b1ac4c.tar.bz2 |
Merge pull request #1416 from YenHaoChen/pr-xenvcfg-cbie
Legalize xenvcfg.CBIE
-rw-r--r-- | riscv/csrs.cc | 17 | ||||
-rw-r--r-- | riscv/csrs.h | 11 | ||||
-rw-r--r-- | riscv/processor.cc | 2 |
3 files changed, 25 insertions, 5 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 7ea07d1..34c03a5 100644 --- a/riscv/csrs.cc +++ b/riscv/csrs.cc @@ -901,9 +901,22 @@ bool masked_csr_t::unlogged_write(const reg_t val) noexcept { return basic_csr_t::unlogged_write((read() & ~mask) | (val & mask)); } +envcfg_csr_t::envcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, + const reg_t init): + masked_csr_t(proc, addr, mask, init) { + // In unlogged_write() we WARLize this field for all three of [msh]envcfg + assert(MENVCFG_CBIE == SENVCFG_CBIE && MENVCFG_CBIE == HENVCFG_CBIE); +} + +bool envcfg_csr_t::unlogged_write(const reg_t val) noexcept { + const reg_t cbie_reserved = 2; // Reserved value of xenvcfg.CBIE + const reg_t adjusted_val = get_field(val, MENVCFG_CBIE) != cbie_reserved ? val : set_field(val, MENVCFG_CBIE, 0); + return masked_csr_t::unlogged_write(adjusted_val); +} + // implement class henvcfg_csr_t henvcfg_csr_t::henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg): - masked_csr_t(proc, addr, mask, init), + envcfg_csr_t(proc, addr, mask, init), menvcfg(menvcfg) { } @@ -1463,7 +1476,7 @@ void sstateen_csr_t::verify_permissions(insn_t insn, bool write) const { // implement class senvcfg_csr_t senvcfg_csr_t::senvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init): - masked_csr_t(proc, addr, mask, init) { + envcfg_csr_t(proc, addr, mask, init) { } void senvcfg_csr_t::verify_permissions(insn_t insn, bool write) const { diff --git a/riscv/csrs.h b/riscv/csrs.h index 07d6d82..e483ea3 100644 --- a/riscv/csrs.h +++ b/riscv/csrs.h @@ -458,10 +458,17 @@ class masked_csr_t: public basic_csr_t { const reg_t mask; }; +class envcfg_csr_t: public masked_csr_t { + public: + envcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init); + protected: + virtual bool unlogged_write(const reg_t val) noexcept override; +}; + // henvcfg.pbmte is read_only 0 when menvcfg.pbmte = 0 // henvcfg.stce is read_only 0 when menvcfg.stce = 0 // henvcfg.hade is read_only 0 when menvcfg.hade = 0 -class henvcfg_csr_t final: public masked_csr_t { +class henvcfg_csr_t final: public envcfg_csr_t { public: henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg); @@ -752,7 +759,7 @@ class sstateen_csr_t: public hstateen_csr_t { virtual bool unlogged_write(const reg_t val) noexcept override; }; -class senvcfg_csr_t final: public masked_csr_t { +class senvcfg_csr_t final: public envcfg_csr_t { public: senvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init); virtual void verify_permissions(insn_t insn, bool write) const override; diff --git a/riscv/processor.cc b/riscv/processor.cc index e81375a..2f458bf 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -445,7 +445,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) (proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0) | (proc->extension_enabled(EXT_SSTC) ? MENVCFG_STCE : 0); const reg_t menvcfg_init = (proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0); - menvcfg = std::make_shared<masked_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, menvcfg_init); + menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, menvcfg_init); if (xlen == 32) { csrmap[CSR_MENVCFG] = std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg); csrmap[CSR_MENVCFGH] = std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg); |