aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.cc
diff options
context:
space:
mode:
authorScott Johnson <scott.johnson@arilinc.com>2021-02-23 17:23:24 -0800
committerAndrew Waterman <aswaterman@gmail.com>2021-09-08 07:59:02 -0700
commit3c676a83acfc4964d6c27d851c91f7878dd2a133 (patch)
tree8619642f41409270d6799a6fad768f2efb949363 /riscv/mmu.cc
parent6eedad425a0d08cabad4deaee52f90bf0f54bf65 (diff)
downloadspike-3c676a83acfc4964d6c27d851c91f7878dd2a133.zip
spike-3c676a83acfc4964d6c27d851c91f7878dd2a133.tar.gz
spike-3c676a83acfc4964d6c27d851c91f7878dd2a133.tar.bz2
Add napot_mask() function to simplify callers
Diffstat (limited to 'riscv/mmu.cc')
-rw-r--r--riscv/mmu.cc11
1 files changed, 2 insertions, 9 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 7afccae..841fa7e 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -227,17 +227,13 @@ reg_t mmu_t::pmp_ok(reg_t addr, reg_t len, access_type type, reg_t mode)
if (cfg & PMP_A) {
bool is_tor = (cfg & PMP_A) == PMP_TOR;
- bool is_na4 = (cfg & PMP_A) == PMP_NA4;
-
- reg_t mask = (proc->state.pmpaddr[i]->raw_value() << 1) | (!is_na4) | ~proc->pmp_tor_mask();
- mask = ~(mask & ~(mask + 1)) << PMP_SHIFT;
// Check each 4-byte sector of the access
bool any_match = false;
bool all_match = true;
for (reg_t offset = 0; offset < len; offset += 1 << PMP_SHIFT) {
reg_t cur_addr = addr + offset;
- bool napot_match = ((cur_addr ^ tor) & mask) == 0;
+ bool napot_match = ((cur_addr ^ tor) & proc->state.pmpaddr[i]->napot_mask()) == 0;
bool tor_match = base <= cur_addr && cur_addr < tor;
bool match = is_tor ? tor_match : napot_match;
any_match |= match;
@@ -278,7 +274,6 @@ reg_t mmu_t::pmp_homogeneous(reg_t addr, reg_t len)
if (cfg & PMP_A) {
bool is_tor = (cfg & PMP_A) == PMP_TOR;
- bool is_na4 = (cfg & PMP_A) == PMP_NA4;
bool begins_after_lower = addr >= base;
bool begins_after_upper = addr >= tor;
@@ -287,9 +282,7 @@ reg_t mmu_t::pmp_homogeneous(reg_t addr, reg_t len)
bool tor_homogeneous = ends_before_lower || begins_after_upper ||
(begins_after_lower && ends_before_upper);
- reg_t mask = (proc->state.pmpaddr[i]->raw_value() << 1) | (!is_na4) | ~proc->pmp_tor_mask();
- mask = ~(mask & ~(mask + 1)) << PMP_SHIFT;
- bool mask_homogeneous = ~(mask << 1) & len;
+ bool mask_homogeneous = ~(proc->state.pmpaddr[i]->napot_mask() << 1) & len;
bool napot_homogeneous = mask_homogeneous || ((addr ^ tor) / len) != 0;
if (!(is_tor ? tor_homogeneous : napot_homogeneous))