Skip to content

Commit 20e63d9

Browse files
committed
Simplify PMP control code by removing pmpMatchEntry
I think this extra function was unnecessary and just made the code harder to follow.
1 parent fd99207 commit 20e63d9

File tree

1 file changed

+12
-19
lines changed

1 file changed

+12
-19
lines changed

model/riscv_pmp_control.sail

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,6 @@ function pmpMatchAddr(
7979
}
8080
}
8181

82-
enum pmpMatch = {PMP_Success, PMP_Continue, PMP_Fail}
83-
84-
function pmpMatchEntry(addr: physaddr, width: xlenbits, acc: AccessType(ext_access_type), priv: Privilege,
85-
ent: Pmpcfg_ent, pmpaddr: xlenbits, prev_pmpaddr: xlenbits) -> pmpMatch = {
86-
match pmpMatchAddr(addr, width, ent, pmpaddr, prev_pmpaddr) {
87-
PMP_NoMatch => PMP_Continue,
88-
PMP_PartialMatch => PMP_Fail,
89-
PMP_Match => if pmpCheckRWX(ent, acc) | (priv == Machine & not(pmpLocked(ent)))
90-
then PMP_Success
91-
else PMP_Fail
92-
}
93-
}
94-
9582
/* priority checks */
9683

9784
function accessToFault(acc : AccessType(ext_access_type)) -> ExceptionType =
@@ -112,12 +99,18 @@ function pmpCheck forall 'n, 0 < 'n <= max_mem_access . (
11299
let width : xlenbits = to_bits(width);
113100

114101
foreach (i from 0 to 63) {
115-
let prev_pmpaddr = (if i > 0 then pmpReadAddrReg(i - 1) else zeros());
116-
match pmpMatchEntry(addr, width, acc, priv, pmpcfg_n[i], pmpReadAddrReg(i), prev_pmpaddr) {
117-
PMP_Success => { return None(); },
118-
PMP_Fail => { return Some(accessToFault(acc)); },
119-
PMP_Continue => (),
120-
}
102+
let prev_pmpaddr = if i > 0 then pmpReadAddrReg(i - 1) else zeros();
103+
let cfg = pmpcfg_n[i];
104+
105+
match pmpMatchAddr(addr, width, cfg, pmpReadAddrReg(i), prev_pmpaddr) {
106+
PMP_NoMatch => (),
107+
PMP_PartialMatch => return Some(accessToFault(acc)),
108+
PMP_Match => return (
109+
if pmpCheckRWX(cfg, acc) | (priv == Machine & not(pmpLocked(cfg)))
110+
then None()
111+
else Some(accessToFault(acc))
112+
),
113+
};
121114
};
122115
if priv == Machine then None() else Some(accessToFault(acc))
123116
}

0 commit comments

Comments
 (0)