diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 6b4a571d..26b31c0f 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -491,15 +491,15 @@ bool mmu_t::pmp_ok(reg_t addr, reg_t len, access_type type, reg_t mode, bool hlv return true; reg_t gran = reg_t(1) << proc->lg_pmp_granularity; - auto first_addr_aligned = addr & -gran; - auto last_addr_aligned = (addr + len - 1) & -gran; + reg_t addr_aligned = addr & -gran; + reg_t len_aligned = ((addr + len + gran - 1) & -gran) - addr_aligned; for (size_t i = 0; i < proc->n_pmp; i++) { // Check each PMP-granularity sector of the access bool any_match = false; bool all_match = true; - for (reg_t cur_addr = first_addr_aligned; cur_addr <= last_addr_aligned; cur_addr += gran) { - bool match = proc->state.pmpaddr[i]->match4(cur_addr); + for (reg_t offset = 0; offset < len_aligned; offset += gran) { + bool match = proc->state.pmpaddr[i]->match4(addr_aligned + offset); any_match |= match; all_match &= match; }