aboutsummaryrefslogtreecommitdiff
path: root/riscv/processor.cc
diff options
context:
space:
mode:
authorWeiwei Li <liweiwei@iscas.ac.cn>2022-07-06 10:45:04 +0800
committerWeiwei Li <liweiwei@iscas.ac.cn>2022-07-09 08:56:00 +0800
commit2bf74857f0f7f3a63e029d7c7ecaf3d4523a846e (patch)
treead5f41de37fa05c7097f0788cca850e2b932cf01 /riscv/processor.cc
parent9b66f89b8102f032f721fe332819325508aa3b95 (diff)
downloadspike-2bf74857f0f7f3a63e029d7c7ecaf3d4523a846e.zip
spike-2bf74857f0f7f3a63e029d7c7ecaf3d4523a846e.tar.gz
spike-2bf74857f0f7f3a63e029d7c7ecaf3d4523a846e.tar.bz2
add support for csrs of smstateen extensions
Diffstat (limited to 'riscv/processor.cc')
-rw-r--r--riscv/processor.cc22
1 files changed, 22 insertions, 0 deletions
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<henvcfg_csr_t>(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<masked_csr_t>(proc, CSR_MSTATEEN0 + i, mstateen_mask, 0);
+ if (xlen == 32) {
+ csrmap[CSR_MSTATEEN0H + i] = std::make_shared<rv32_high_csr_t>(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<hstateen_csr_t>(proc, CSR_HSTATEEN0 + i, hstateen_mask, 0, i);
+ if (xlen == 32) {
+ csrmap[CSR_HSTATEEN0H + i] = std::make_shared<rv32_high_csr_t>(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<sstateen_csr_t>(proc, CSR_HSTATEEN0 + i, sstateen_mask, 0, i);
+ }
+ }
+
serialized = false;
#ifdef RISCV_ENABLE_COMMITLOG