mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
target/riscv: pmp: exit csr writes early if value was not changed
Signed-off-by: Loïc Lefort <loic@rivosinc.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Message-ID: <20250313193011.720075-5-loic@rivosinc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
committed by
Alistair Francis
parent
19cf1a7d9e
commit
0c60c531f5
+15
-7
@@ -142,6 +142,11 @@ static inline uint8_t pmp_read_cfg(CPURISCVState *env, uint32_t pmp_index)
|
||||
static bool pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
|
||||
{
|
||||
if (pmp_index < MAX_RISCV_PMPS) {
|
||||
if (env->pmp_state.pmp[pmp_index].cfg_reg == val) {
|
||||
/* no change */
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pmp_is_readonly(env, pmp_index)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"ignoring pmpcfg write - read only\n");
|
||||
@@ -529,6 +534,11 @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
|
||||
bool is_next_cfg_tor = false;
|
||||
|
||||
if (addr_index < MAX_RISCV_PMPS) {
|
||||
if (env->pmp_state.pmp[addr_index].addr_reg == val) {
|
||||
/* no change */
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* In TOR mode, need to check the lock bit of the next pmp
|
||||
* (if there is a next).
|
||||
@@ -545,14 +555,12 @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
|
||||
}
|
||||
|
||||
if (!pmp_is_readonly(env, addr_index)) {
|
||||
if (env->pmp_state.pmp[addr_index].addr_reg != val) {
|
||||
env->pmp_state.pmp[addr_index].addr_reg = val;
|
||||
pmp_update_rule_addr(env, addr_index);
|
||||
if (is_next_cfg_tor) {
|
||||
pmp_update_rule_addr(env, addr_index + 1);
|
||||
}
|
||||
tlb_flush(env_cpu(env));
|
||||
env->pmp_state.pmp[addr_index].addr_reg = val;
|
||||
pmp_update_rule_addr(env, addr_index);
|
||||
if (is_next_cfg_tor) {
|
||||
pmp_update_rule_addr(env, addr_index + 1);
|
||||
}
|
||||
tlb_flush(env_cpu(env));
|
||||
} else {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"ignoring pmpaddr write - read only\n");
|
||||
|
||||
Reference in New Issue
Block a user