aboutsummaryrefslogtreecommitdiff
path: root/riscv/processor.cc
diff options
context:
space:
mode:
authorScott Johnson <scott.johnson@arilinc.com>2022-07-13 09:48:23 -0700
committerScott Johnson <scott.johnson@arilinc.com>2022-07-13 18:57:55 -0700
commitf85b76edd00a529b3dbda88aee2802014c09de7d (patch)
tree3fa47183e03b255db2d1bd33107b1a5b0f15d7ec /riscv/processor.cc
parent85ab2228ddb802c33a967349d69b2d948846bd01 (diff)
downloadspike-f85b76edd00a529b3dbda88aee2802014c09de7d.zip
spike-f85b76edd00a529b3dbda88aee2802014c09de7d.tar.gz
spike-f85b76edd00a529b3dbda88aee2802014c09de7d.tar.bz2
Use rv32_low_csr_t for Smstateen CSRs
Otherwise they will have the same problem as #1044
Diffstat (limited to 'riscv/processor.cc')
-rw-r--r--riscv/processor.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/riscv/processor.cc b/riscv/processor.cc
index 28129ba..d431c68 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -405,15 +405,21 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
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);
+ mstateen[i] = std::make_shared<masked_csr_t>(proc, CSR_MSTATEEN0 + i, mstateen_mask, 0);
if (xlen == 32) {
+ csrmap[CSR_MSTATEEN0 + i] = std::make_shared<rv32_low_csr_t>(proc, CSR_MSTATEEN0 + i, mstateen[i]);
csrmap[CSR_MSTATEEN0H + i] = std::make_shared<rv32_high_csr_t>(proc, CSR_MSTATEEN0H + i, mstateen[i]);
+ } else {
+ csrmap[CSR_MSTATEEN0 + i] = 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);
+ hstateen[i] = std::make_shared<hstateen_csr_t>(proc, CSR_HSTATEEN0 + i, hstateen_mask, 0, i);
if (xlen == 32) {
+ csrmap[CSR_HSTATEEN0 + i] = std::make_shared<rv32_low_csr_t>(proc, CSR_HSTATEEN0 + i, hstateen[i]);
csrmap[CSR_HSTATEEN0H + i] = std::make_shared<rv32_high_csr_t>(proc, CSR_HSTATEEN0H + i, hstateen[i]);
+ } else {
+ csrmap[CSR_HSTATEEN0 + i] = hstateen[i];
}
const reg_t sstateen_mask = i == 0 ? sstateen0_mask : 0;