aboutsummaryrefslogtreecommitdiff
path: root/riscv/csrs.cc
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-07-18 15:10:53 -0700
committerGitHub <noreply@github.com>2022-07-18 15:10:53 -0700
commit84b9d03c088af3a92505c82ff3160d984387248c (patch)
treec9df154cb7ec58a7d15a62776cbbf0bf522170eb /riscv/csrs.cc
parent3742db886a8ae7b03c5e7e0ececf997a2fc16cfd (diff)
parentc0b3fdcbaba99576393c57607985a0009bb2ebb1 (diff)
downloadspike-84b9d03c088af3a92505c82ff3160d984387248c.zip
spike-84b9d03c088af3a92505c82ff3160d984387248c.tar.gz
spike-84b9d03c088af3a92505c82ff3160d984387248c.tar.bz2
Merge pull request #1041 from plctlab/plct-new-csrs
add support for m/henvcfgh and mconfigptr CSRs
Diffstat (limited to 'riscv/csrs.cc')
-rw-r--r--riscv/csrs.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index 69b5849..7a63cbc 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -472,15 +472,7 @@ bool sstatus_proxy_csr_t::unlogged_write(const reg_t val) noexcept {
// implement class mstatus_csr_t
mstatus_csr_t::mstatus_csr_t(processor_t* const proc, const reg_t addr):
base_status_csr_t(proc, addr),
- val(0
- | (proc->extension_enabled_const('U') && (proc->get_const_xlen() != 32) ? set_field((reg_t)0, MSTATUS_UXL, xlen_to_uxl(proc->get_const_xlen())) : 0)
- | (proc->extension_enabled_const('S') && (proc->get_const_xlen() != 32) ? set_field((reg_t)0, MSTATUS_SXL, xlen_to_uxl(proc->get_const_xlen())) : 0)
-
-#ifdef RISCV_ENABLE_DUAL_ENDIAN
- | (proc->get_mmu()->is_target_big_endian() ? MSTATUS_UBE | MSTATUS_SBE | MSTATUS_MBE : 0)
-#endif
- | 0 // initial value for mstatus
- ) {
+ val(compute_mstatus_initial_value()) {
}
bool mstatus_csr_t::unlogged_write(const reg_t val) noexcept {
@@ -488,7 +480,8 @@ bool mstatus_csr_t::unlogged_write(const reg_t val) noexcept {
const bool has_gva = has_mpv;
const reg_t mask = sstatus_write_mask
- | MSTATUS_MIE | MSTATUS_MPIE | MSTATUS_MPRV
+ | MSTATUS_MIE | MSTATUS_MPIE
+ | (proc->extension_enabled('U') ? MSTATUS_MPRV : 0)
| MSTATUS_MPP | MSTATUS_TW
| (proc->extension_enabled('S') ? MSTATUS_TSR : 0)
| (has_page ? MSTATUS_TVM : 0)
@@ -503,6 +496,17 @@ bool mstatus_csr_t::unlogged_write(const reg_t val) noexcept {
return true;
}
+reg_t mstatus_csr_t::compute_mstatus_initial_value() const noexcept {
+ const reg_t big_endian_bits = (proc->extension_enabled_const('U') ? MSTATUS_UBE : 0)
+ | (proc->extension_enabled_const('S') ? MSTATUS_SBE : 0)
+ | MSTATUS_MBE;
+ return 0
+ | (proc->extension_enabled_const('U') && (proc->get_const_xlen() != 32) ? set_field((reg_t)0, MSTATUS_UXL, xlen_to_uxl(proc->get_const_xlen())) : 0)
+ | (proc->extension_enabled_const('S') && (proc->get_const_xlen() != 32) ? set_field((reg_t)0, MSTATUS_SXL, xlen_to_uxl(proc->get_const_xlen())) : 0)
+ | (proc->get_mmu()->is_target_big_endian() ? big_endian_bits : 0)
+ | 0; // initial value for mstatus
+}
+
// implement class rv32_low_csr_t
rv32_low_csr_t::rv32_low_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig):
csr_t(proc, addr),
@@ -887,7 +891,7 @@ satp_csr_t::satp_csr_t(processor_t* const proc, const reg_t addr):
void satp_csr_t::verify_permissions(insn_t insn, bool write) const {
base_atp_csr_t::verify_permissions(insn, write);
if (get_field(state->mstatus->read(), MSTATUS_TVM))
- require(state->prv >= PRV_M);
+ require(state->prv == PRV_M);
}
virtualized_satp_csr_t::virtualized_satp_csr_t(processor_t* const proc, satp_csr_t_p orig, csr_t_p virt):