From 2bf74857f0f7f3a63e029d7c7ecaf3d4523a846e Mon Sep 17 00:00:00 2001 From: Weiwei Li Date: Wed, 6 Jul 2022 10:45:04 +0800 Subject: add support for csrs of smstateen extensions --- riscv/processor.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'riscv/processor.cc') diff --git a/riscv/processor.cc b/riscv/processor.cc index 7ffc8d1..1c33911 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -397,6 +397,28 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) const reg_t henvcfg_init = (proc->extension_enabled(EXT_SVPBMT) ? HENVCFG_PBMTE : 0); csrmap[CSR_HENVCFG] = henvcfg = std::make_shared(proc, CSR_HENVCFG, henvcfg_mask, henvcfg_init, menvcfg); + if (proc->extension_enabled_const(EXT_SMSTATEEN)) { + const reg_t sstateen0_mask = (proc->extension_enabled(EXT_ZFINX) ? SSTATEEN0_FCSR : 0) | SSTATEEN0_CS; + const reg_t hstateen0_mask = sstateen0_mask | HSTATEEN0_SENVCFG | HSTATEEN_SSTATEEN; + const reg_t mstateen0_mask = hstateen0_mask; + for (int i = 0; i < 4; i++) { + const reg_t mstateen_mask = i == 0 ? mstateen0_mask : MSTATEEN_HSTATEEN; + csrmap[CSR_MSTATEEN0 + i] = mstateen[i] = std::make_shared(proc, CSR_MSTATEEN0 + i, mstateen_mask, 0); + if (xlen == 32) { + csrmap[CSR_MSTATEEN0H + i] = std::make_shared(proc, CSR_MSTATEEN0H + i, -1, mstateen[i]); + } + + const reg_t hstateen_mask = i == 0 ? hstateen0_mask : HSTATEEN_SSTATEEN; + csrmap[CSR_HSTATEEN0 + i] = hstateen[i] = std::make_shared(proc, CSR_HSTATEEN0 + i, hstateen_mask, 0, i); + if (xlen == 32) { + csrmap[CSR_HSTATEEN0H + i] = std::make_shared(proc, CSR_HSTATEEN0H + i, -1, hstateen[i]); + } + + const reg_t sstateen_mask = i == 0 ? sstateen0_mask : 0; + csrmap[CSR_SSTATEEN0 + i] = sstateen[i] = std::make_shared(proc, CSR_HSTATEEN0 + i, sstateen_mask, 0, i); + } + } + serialized = false; #ifdef RISCV_ENABLE_COMMITLOG -- cgit v1.1