aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Johnson <scott.johnson@arilinc.com>2021-02-23 17:40:39 -0800
committerAndrew Waterman <aswaterman@gmail.com>2021-09-08 07:59:02 -0700
commitd9bd31becc124d3334f6fb0908d09d2cd8b06dd1 (patch)
treeb093c47a8dc4b2d886767e41a2ae5f64f706c145
parent95824344eb56097e9bb45cab9d22ab370908c2ff (diff)
downloadriscv-isa-sim-d9bd31becc124d3334f6fb0908d09d2cd8b06dd1.zip
riscv-isa-sim-d9bd31becc124d3334f6fb0908d09d2cd8b06dd1.tar.gz
riscv-isa-sim-d9bd31becc124d3334f6fb0908d09d2cd8b06dd1.tar.bz2
Add new method match4()
To simplify calling code.
-rw-r--r--riscv/csrs.cc13
-rw-r--r--riscv/csrs.h3
-rw-r--r--riscv/mmu.cc7
3 files changed, 17 insertions, 6 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index 8c18fc2..dff846c 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -145,6 +145,19 @@ reg_t pmpaddr_csr_t::napot_mask() const noexcept {
}
+bool pmpaddr_csr_t::match4(reg_t cur_addr) const noexcept {
+ state_t* const state = proc->get_state();
+ uint8_t cfg = state->pmpcfg[pmpidx];
+ if ((cfg & PMP_A) == 0) return false;
+ reg_t base = tor_base_paddr();
+ reg_t tor = tor_paddr();
+ bool is_tor = (cfg & PMP_A) == PMP_TOR;
+ bool napot_match = ((cur_addr ^ tor) & napot_mask()) == 0;
+ bool tor_match = base <= cur_addr && cur_addr < tor;
+ return is_tor ? tor_match : napot_match;
+}
+
+
// implement class pmpcfg_csr_t
pmpcfg_csr_t::pmpcfg_csr_t(processor_t* const proc, const reg_t addr):
logged_csr_t(proc, addr) {
diff --git a/riscv/csrs.h b/riscv/csrs.h
index beabd52..ab1adf6 100644
--- a/riscv/csrs.h
+++ b/riscv/csrs.h
@@ -83,6 +83,9 @@ class pmpaddr_csr_t: public logged_csr_t {
// E.g. for 4KiB region, returns 0xffffffff_fffff000.
reg_t napot_mask() const noexcept;
+ // Does a 4-byte access at the specified address match this PMP entry?
+ bool match4(reg_t cur_addr) const noexcept;
+
protected:
virtual bool unlogged_write(const reg_t val) noexcept override;
private:
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index be3d3e0..c315a53 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -221,21 +221,16 @@ reg_t mmu_t::pmp_ok(reg_t addr, reg_t len, access_type type, reg_t mode)
return true;
for (size_t i = 0; i < proc->n_pmp; i++) {
- reg_t base = proc->state.pmpaddr[i]->tor_base_paddr();
- reg_t tor = proc->state.pmpaddr[i]->tor_paddr();
uint8_t cfg = proc->state.pmpcfg[i];
if (cfg & PMP_A) {
- bool is_tor = (cfg & PMP_A) == PMP_TOR;
// 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) & proc->state.pmpaddr[i]->napot_mask()) == 0;
- bool tor_match = base <= cur_addr && cur_addr < tor;
- bool match = is_tor ? tor_match : napot_match;
+ bool match = proc->state.pmpaddr[i]->match4(cur_addr);
any_match |= match;
all_match &= match;
}