target/riscv: Change the return type of pmp_hart_has_privs() to bool

We no longer need the pmp_index for matched PMP entry now.

Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-Id: <20230517091519.34439-5-liweiwei@iscas.ac.cn>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
Weiwei Li 2023-05-17 17:15:11 +08:00 committed by Alistair Francis
parent 093ce837e1
commit e9c39713ea
3 changed files with 21 additions and 27 deletions

View File

@ -697,16 +697,16 @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,
int mode) int mode)
{ {
pmp_priv_t pmp_priv; pmp_priv_t pmp_priv;
int pmp_index = -1; bool pmp_has_privs;
if (!riscv_cpu_cfg(env)->pmp) { if (!riscv_cpu_cfg(env)->pmp) {
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
return TRANSLATE_SUCCESS; return TRANSLATE_SUCCESS;
} }
pmp_index = pmp_hart_has_privs(env, addr, size, 1 << access_type, pmp_has_privs = pmp_hart_has_privs(env, addr, size, 1 << access_type,
&pmp_priv, mode); &pmp_priv, mode);
if (pmp_index < 0) { if (!pmp_has_privs) {
*prot = 0; *prot = 0;
return TRANSLATE_PMP_FAIL; return TRANSLATE_PMP_FAIL;
} }

View File

@ -296,27 +296,23 @@ static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
/* /*
* Check if the address has required RWX privs to complete desired operation * Check if the address has required RWX privs to complete desired operation
* Return PMP rule index if a pmp rule match * Return true if a pmp rule match or default match
* Return MAX_RISCV_PMPS if default match * Return false if no match
* Return negtive value if no match
*/ */
int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr, bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
target_ulong size, pmp_priv_t privs, target_ulong size, pmp_priv_t privs,
pmp_priv_t *allowed_privs, target_ulong mode) pmp_priv_t *allowed_privs, target_ulong mode)
{ {
int i = 0; int i = 0;
int ret = -1; bool ret = false;
int pmp_size = 0; int pmp_size = 0;
target_ulong s = 0; target_ulong s = 0;
target_ulong e = 0; target_ulong e = 0;
/* Short cut if no rules */ /* Short cut if no rules */
if (0 == pmp_get_num_rules(env)) { if (0 == pmp_get_num_rules(env)) {
if (pmp_hart_has_privs_default(env, addr, size, privs, return pmp_hart_has_privs_default(env, addr, size, privs,
allowed_privs, mode)) { allowed_privs, mode);
ret = MAX_RISCV_PMPS;
}
return ret;
} }
if (size == 0) { if (size == 0) {
@ -345,7 +341,7 @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
if ((s + e) == 1) { if ((s + e) == 1) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"pmp violation - access is partially inside\n"); "pmp violation - access is partially inside\n");
ret = -1; ret = false;
break; break;
} }
@ -453,17 +449,15 @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
* defined with PMP must be used. We shouldn't fallback on * defined with PMP must be used. We shouldn't fallback on
* finding default privileges. * finding default privileges.
*/ */
ret = i; ret = true;
break; break;
} }
} }
/* No rule matched */ /* No rule matched */
if (ret == -1) { if (!ret) {
if (pmp_hart_has_privs_default(env, addr, size, privs, ret = pmp_hart_has_privs_default(env, addr, size, privs,
allowed_privs, mode)) { allowed_privs, mode);
ret = MAX_RISCV_PMPS;
}
} }
return ret; return ret;

View File

@ -72,10 +72,10 @@ target_ulong mseccfg_csr_read(CPURISCVState *env);
void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index, void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
target_ulong val); target_ulong val);
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index); target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr, bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
target_ulong size, pmp_priv_t privs, target_ulong size, pmp_priv_t privs,
pmp_priv_t *allowed_privs, pmp_priv_t *allowed_privs,
target_ulong mode); target_ulong mode);
target_ulong pmp_get_tlb_size(CPURISCVState *env, target_ulong addr); target_ulong pmp_get_tlb_size(CPURISCVState *env, target_ulong addr);
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index); void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
void pmp_update_rule_nums(CPURISCVState *env); void pmp_update_rule_nums(CPURISCVState *env);