aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2020-01-29 20:13:23 -0800
committerAndrew Waterman <andrew@sifive.com>2020-01-29 20:13:23 -0800
commitcb254bfab5fbb6d69e5dd336798861e7c1183e52 (patch)
treefd0378f587e6ecd91901565e93ccd7dcab194eea
parent81cf0fae1d749d1828ecf0cba9ae31f5d31b7ece (diff)
downloadriscv-isa-sim-cb254bfab5fbb6d69e5dd336798861e7c1183e52.zip
riscv-isa-sim-cb254bfab5fbb6d69e5dd336798861e7c1183e52.tar.gz
riscv-isa-sim-cb254bfab5fbb6d69e5dd336798861e7c1183e52.tar.bz2
Initialize PMPs with set_csr to fix WARLness of initial value
-rw-r--r--riscv/processor.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/riscv/processor.cc b/riscv/processor.cc
index fb7476b..b34eb5c 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -254,10 +254,7 @@ void state_t::reset(reg_t max_isa)
debug_mode = false;
memset(this->pmpcfg, 0, sizeof(this->pmpcfg));
- pmpcfg[0] = PMP_R | PMP_W | PMP_X | PMP_NAPOT;
-
memset(this->pmpaddr, 0, sizeof(this->pmpaddr));
- pmpaddr[0] = ~reg_t(0);
fflags = 0;
frm = 0;
@@ -351,6 +348,12 @@ void processor_t::set_log_commits(bool value)
void processor_t::reset()
{
state.reset(max_isa);
+
+ // For backwards compatibility with software that is unaware of PMP,
+ // initialize PMP to permit unprivileged access to all of memory.
+ set_csr(CSR_PMPADDR0, ~reg_t(0));
+ set_csr(CSR_PMPCFG0, PMP_R | PMP_W | PMP_X | PMP_NAPOT);
+
state.dcsr.halt = halt_on_reset;
halt_on_reset = false;
set_csr(CSR_MSTATUS, state.mstatus);