Replace manual bit manipulation with alignment macros for better
readability:
- TOR: Use ROUND_DOWN() to clear lower bits
- NAPOT: Use ROUND_UP() to set lower bits
The behavior remains unchanged.
Signed-off-by: Jay Chang <jay.chang@sifive.com>
---
target/riscv/pmp.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
index c88e86cb11..119c448357 100644
--- a/target/riscv/pmp.c
+++ b/target/riscv/pmp.c
@@ -235,8 +235,9 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
case PMP_AMATCH_TOR:
/* Bits pmpaddr[G-1:0] do not affect the TOR address-matching logic. */
if (g >= 1) {
- prev_addr &= ~((1ULL << g) - 1ULL);
- this_addr &= ~((1ULL << g) - 1ULL);
+ target_ulong granule = 1ULL << g;
+ prev_addr = ROUND_DOWN(prev_addr, granule);
+ this_addr = ROUND_DOWN(this_addr, granule);
}
if (prev_addr >= this_addr) {
sa = ea = 0u;
@@ -254,7 +255,8 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
case PMP_AMATCH_NAPOT:
/* Bits [g-2:0] need to be all one to align pmp granularity */
if (g >= 2) {
- this_addr |= ((1ULL << (g - 1ULL)) - 1ULL);
+ target_ulong granule = 1ULL << (g - 1);
+ this_addr = ROUND_UP(this_addr + 1ULL, granule) - 1ULL;
}
pmp_decode_napot(this_addr, &sa, &ea);
@@ -625,13 +627,15 @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index)
case PMP_AMATCH_TOR:
/* Bit [g-1:0] read all zero */
if (g >= 1 && g < TARGET_LONG_BITS) {
- val &= ~((1ULL << g) - 1ULL);
+ target_ulong granule = 1ULL << g;
+ val = ROUND_DOWN(val, granule);
}
break;
case PMP_AMATCH_NAPOT:
/* Bit [g-2:0] read all one */
if (g >= 2 && g < TARGET_LONG_BITS) {
- val |= ((1ULL << (g - 1)) - 1ULL);
+ target_ulong granule = 1ULL << (g - 1);
+ val = ROUND_UP(val + 1ULL, granule) - 1ULL;
}
break;
default:
--
2.48.1