aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVac Chen <vacantron@gmail.com>2025-07-06 14:55:54 +0800
committerAlistair Francis <alistair.francis@wdc.com>2025-07-30 10:59:26 +1000
commit77707bfdf871199bbee665e721ced961aaf3a798 (patch)
treec735c3eca5ba8a411d0d7d1bac153bebf2f934bb
parent9b80226ece693197af8a981b424391b68b5bc38e (diff)
downloadqemu-77707bfdf871199bbee665e721ced961aaf3a798.zip
qemu-77707bfdf871199bbee665e721ced961aaf3a798.tar.gz
qemu-77707bfdf871199bbee665e721ced961aaf3a798.tar.bz2
target/riscv: Fix pmp range wraparound on zero
pmp_is_in_range() prefers to match addresses within the interval [start, end]. To archieve this, pmpaddrX is decremented during the end address update. In TOR mode, a rule is ignored if its start address is greater than or equal to its end address. However, if pmpaddrX is set to 0, this decrement operation causes the calulated end address to wrap around to UINT_MAX. In this scenario, the address guard for this PMP entry would become ineffective. This patch addresses the issue by moving the guard check earlier, preventing the problematic wraparound when pmpaddrX is zero. Signed-off-by: Vac Chen <vacantron@gmail.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20250706065554.42953-1-vacantron@gmail.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
-rw-r--r--target/riscv/pmp.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
index 3540327..72f1372 100644
--- a/target/riscv/pmp.c
+++ b/target/riscv/pmp.c
@@ -211,11 +211,12 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
break;
case PMP_AMATCH_TOR:
- sa = prev_addr << 2; /* shift up from [xx:0] to [xx+2:2] */
- ea = (this_addr << 2) - 1u;
- if (sa > ea) {
+ if (prev_addr >= this_addr) {
sa = ea = 0u;
+ break;
}
+ sa = prev_addr << 2; /* shift up from [xx:0] to [xx+2:2] */
+ ea = (this_addr << 2) - 1u;
break;
case PMP_AMATCH_NA4: