From 7ccd0fd3002b297d8bda4b4cd1ec2a6b7987111c Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Fri, 27 Jan 2023 10:32:26 -0800 Subject: Enable Svadu control bits in menvcfg and henvcfg Add in the support for the HADE fields in menvcfg and henvcfg based off of the svadu ISA string. This only allows for the writable HADE bits being exposed when the svadu ISA string is employed. No other behavior is implemented. --- riscv/csrs.h | 3 ++- riscv/processor.cc | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/riscv/csrs.h b/riscv/csrs.h index 31ba11b..5dab1fc 100644 --- a/riscv/csrs.h +++ b/riscv/csrs.h @@ -453,12 +453,13 @@ class masked_csr_t: public basic_csr_t { // 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 { public: henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg); reg_t read() const noexcept override { - return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE)) & masked_csr_t::read(); + return (menvcfg->read() | ~(MENVCFG_PBMTE | MENVCFG_STCE | MENVCFG_HADE)) & masked_csr_t::read(); } virtual void verify_permissions(insn_t insn, bool write) const override; diff --git a/riscv/processor.cc b/riscv/processor.cc index 27ca995..81ae0ce 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -434,6 +434,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) if (proc->extension_enabled_const('U')) { const reg_t menvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? MENVCFG_CBCFE | MENVCFG_CBIE : 0) | (proc->extension_enabled(EXT_ZICBOZ) ? MENVCFG_CBZE : 0) | + (proc->extension_enabled(EXT_SVADU) ? MENVCFG_HADE: 0) | (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); @@ -449,6 +450,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) csrmap[CSR_SENVCFG] = senvcfg = std::make_shared(proc, CSR_SENVCFG, senvcfg_mask, 0); const reg_t henvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? HENVCFG_CBCFE | HENVCFG_CBIE : 0) | (proc->extension_enabled(EXT_ZICBOZ) ? HENVCFG_CBZE : 0) | + (proc->extension_enabled(EXT_SVADU) ? HENVCFG_HADE: 0) | (proc->extension_enabled(EXT_SVPBMT) ? HENVCFG_PBMTE : 0) | (proc->extension_enabled(EXT_SSTC) ? HENVCFG_STCE : 0); const reg_t henvcfg_init = (proc->extension_enabled(EXT_SVPBMT) ? HENVCFG_PBMTE : 0); -- cgit v1.1