aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2020-05-10 01:31:34 -0700
committerAndrew Waterman <andrew@sifive.com>2020-05-10 01:42:57 -0700
commit0212b6d66f9f321732480b20b368ee0882415314 (patch)
tree8a73ed94ed67cc8daeab88b2cc2be779eede6be2 /riscv
parent9b579a624c03d42490468c0e8a98873940ae510e (diff)
downloadspike-0212b6d66f9f321732480b20b368ee0882415314.zip
spike-0212b6d66f9f321732480b20b368ee0882415314.tar.gz
spike-0212b6d66f9f321732480b20b368ee0882415314.tar.bz2
Implement coarse-grain PMP matching logic
Diffstat (limited to 'riscv')
-rw-r--r--riscv/mmu.cc12
1 files changed, 6 insertions, 6 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 3b0eb0d..b038f23 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -204,15 +204,15 @@ reg_t mmu_t::pmp_ok(reg_t addr, reg_t len, access_type type, reg_t mode)
return true;
reg_t base = 0;
- for (size_t i = 0; i < proc->state.max_pmp; i++) {
- reg_t tor = proc->state.pmpaddr[i] << PMP_SHIFT;
+ for (size_t i = 0; i < proc->n_pmp; i++) {
+ reg_t tor = (proc->state.pmpaddr[i] & proc->pmp_tor_mask()) << PMP_SHIFT;
uint8_t cfg = proc->state.pmpcfg[i];
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] << 1) | (!is_na4);
+ reg_t mask = (proc->state.pmpaddr[i] << 1) | (!is_na4) | ~proc->pmp_tor_mask();
mask = ~(mask & ~(mask + 1)) << PMP_SHIFT;
// Check each 4-byte sector of the access
@@ -255,8 +255,8 @@ reg_t mmu_t::pmp_homogeneous(reg_t addr, reg_t len)
return true;
reg_t base = 0;
- for (size_t i = 0; i < proc->state.max_pmp; i++) {
- reg_t tor = proc->state.pmpaddr[i] << PMP_SHIFT;
+ for (size_t i = 0; i < proc->n_pmp; i++) {
+ reg_t tor = (proc->state.pmpaddr[i] & proc->pmp_tor_mask()) << PMP_SHIFT;
uint8_t cfg = proc->state.pmpcfg[i];
if (cfg & PMP_A) {
@@ -270,7 +270,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] << 1) | (!is_na4);
+ reg_t mask = (proc->state.pmpaddr[i] << 1) | (!is_na4) | ~proc->pmp_tor_mask();
mask = ~(mask & ~(mask + 1)) << PMP_SHIFT;
bool mask_homogeneous = ~(mask << 1) & len;
bool napot_homogeneous = mask_homogeneous || ((addr ^ tor) / len) != 0;