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:
parent
093ce837e1
commit
e9c39713ea
@ -697,16 +697,16 @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,
|
||||
int mode)
|
||||
{
|
||||
pmp_priv_t pmp_priv;
|
||||
int pmp_index = -1;
|
||||
bool pmp_has_privs;
|
||||
|
||||
if (!riscv_cpu_cfg(env)->pmp) {
|
||||
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
return TRANSLATE_SUCCESS;
|
||||
}
|
||||
|
||||
pmp_index = pmp_hart_has_privs(env, addr, size, 1 << access_type,
|
||||
&pmp_priv, mode);
|
||||
if (pmp_index < 0) {
|
||||
pmp_has_privs = pmp_hart_has_privs(env, addr, size, 1 << access_type,
|
||||
&pmp_priv, mode);
|
||||
if (!pmp_has_privs) {
|
||||
*prot = 0;
|
||||
return TRANSLATE_PMP_FAIL;
|
||||
}
|
||||
|
@ -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
|
||||
* Return PMP rule index if a pmp rule match
|
||||
* Return MAX_RISCV_PMPS if default match
|
||||
* Return negtive value if no match
|
||||
* Return true if a pmp rule match or default match
|
||||
* Return false if no match
|
||||
*/
|
||||
int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
|
||||
target_ulong size, pmp_priv_t privs,
|
||||
pmp_priv_t *allowed_privs, target_ulong mode)
|
||||
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
|
||||
target_ulong size, pmp_priv_t privs,
|
||||
pmp_priv_t *allowed_privs, target_ulong mode)
|
||||
{
|
||||
int i = 0;
|
||||
int ret = -1;
|
||||
bool ret = false;
|
||||
int pmp_size = 0;
|
||||
target_ulong s = 0;
|
||||
target_ulong e = 0;
|
||||
|
||||
/* Short cut if no rules */
|
||||
if (0 == pmp_get_num_rules(env)) {
|
||||
if (pmp_hart_has_privs_default(env, addr, size, privs,
|
||||
allowed_privs, mode)) {
|
||||
ret = MAX_RISCV_PMPS;
|
||||
}
|
||||
return ret;
|
||||
return pmp_hart_has_privs_default(env, addr, size, privs,
|
||||
allowed_privs, mode);
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
@ -345,7 +341,7 @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
|
||||
if ((s + e) == 1) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"pmp violation - access is partially inside\n");
|
||||
ret = -1;
|
||||
ret = false;
|
||||
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
|
||||
* finding default privileges.
|
||||
*/
|
||||
ret = i;
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* No rule matched */
|
||||
if (ret == -1) {
|
||||
if (pmp_hart_has_privs_default(env, addr, size, privs,
|
||||
allowed_privs, mode)) {
|
||||
ret = MAX_RISCV_PMPS;
|
||||
}
|
||||
if (!ret) {
|
||||
ret = pmp_hart_has_privs_default(env, addr, size, privs,
|
||||
allowed_privs, mode);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -72,10 +72,10 @@ target_ulong mseccfg_csr_read(CPURISCVState *env);
|
||||
void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
|
||||
target_ulong val);
|
||||
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
|
||||
int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
|
||||
target_ulong size, pmp_priv_t privs,
|
||||
pmp_priv_t *allowed_privs,
|
||||
target_ulong mode);
|
||||
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
|
||||
target_ulong size, pmp_priv_t privs,
|
||||
pmp_priv_t *allowed_privs,
|
||||
target_ulong mode);
|
||||
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_nums(CPURISCVState *env);
|
||||
|
Loading…
Reference in New Issue
Block a user