@samitouri / QOSamiQemu / commits / ac02839c2f

target/riscv: Improve PMP address alignment readability

Replace manual bit manipulation for better readability: - TOR: Use ROUND_DOWN() to clear lower bits - NAPOT: Use deposit64() to set lower bits Signed-off-by: Jay Chang <jay.chang@sifive.com> Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com> Message-ID: <20260520063606.36600-3-jay.chang@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Jay Chang committed May 20, 2026 at 14:36 UTC ac02839c2ff42a1d2a5096156087ce05a9f38386
1 file changed +6 -4
target/riscv/pmp.c
+6 -4
@@ -247,8 +247,9 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
247 case PMP_AMATCH_TOR:
248 /* Bits pmpaddr[G-1:0] do not affect the TOR address-matching logic. */
249 if (g >= 1) {
250 - prev_addr &= ~((1ULL << g) - 1ULL);
251 - this_addr &= ~((1ULL << g) - 1ULL);
250 + uint64_t granule = 1ULL << g;
251 + prev_addr = ROUND_DOWN(prev_addr, granule);
252 + this_addr = ROUND_DOWN(this_addr, granule);
253 }
254 if (prev_addr >= this_addr) {
255 sa = ea = 0u;
@@ -641,13 +642,14 @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index)
642 case PMP_AMATCH_TOR:
643 /* Bit [g-1:0] read all zero */
644 if (g >= 1 && g < TARGET_LONG_BITS) {
644 - val &= ~((1ULL << g) - 1ULL);
645 + uint64_t granule = 1ULL << g;
646 + val = ROUND_DOWN(val, granule);
647 }
648 break;
649 case PMP_AMATCH_NAPOT:
650 /* Bit [g-2:0] read all one */
651 if (g >= 2 && g < TARGET_LONG_BITS) {
650 - val |= ((1ULL << (g - 1)) - 1ULL);
652 + val = deposit64(val, 0, g - 1, -1ULL);
653 }
654 break;
655 default: