Re: [RFC PATCH 18/18] target/riscv: Pass first/last to pmp_hart_has_privs

Alistair <[email protected]>
Newsgroups org.nongnu.qemu-arm,org.nongnu.qemu-devel,org.nongnu.qemu-riscv
Message-ID <[email protected]>
On Sat, 2026-08-15 at 13:37 -0700, Richard Henderson wrote:
> This eliminates an ambiguity with size == 0 and also
> aligns with the underlying hw representation.
> 
> Signed-off-by: Richard Henderson <[email protected]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  target/riscv/tcg/pmp.h        |  5 ++---
>  target/riscv/tcg/cpu_helper.c |  2 +-
>  target/riscv/tcg/pmp.c        | 24 ++++--------------------
>  3 files changed, 7 insertions(+), 24 deletions(-)
> 
> diff --git a/target/riscv/tcg/pmp.h b/target/riscv/tcg/pmp.h
> index 4c95c2767a..eacb5b5349 100644
> --- a/target/riscv/tcg/pmp.h
> +++ b/target/riscv/tcg/pmp.h
> @@ -70,9 +70,8 @@ typedef struct {
>  
>  typedef struct CPUArchState CPURISCVState;
>  
> -bool pmp_hart_has_privs(CPURISCVState *env, hwaddr addr,
> -                        int size, pmp_priv_t privs,
> -                        pmp_priv_t *allowed_privs,
> +bool pmp_hart_has_privs(CPURISCVState *env, hwaddr first, hwaddr
> last,
> +                        pmp_priv_t privs, pmp_priv_t *allowed_privs,
>                          privilege_mode_t mode);
>  uint64_t pmp_get_tlb_size(CPURISCVState *env, hwaddr addr);
>  void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
> diff --git a/target/riscv/tcg/cpu_helper.c
> b/target/riscv/tcg/cpu_helper.c
> index fb1250a4b8..7ef5ab5277 100644
> --- a/target/riscv/tcg/cpu_helper.c
> +++ b/target/riscv/tcg/cpu_helper.c
> @@ -916,7 +916,7 @@ static int get_physical_address_pmp(CPURISCVState
> *env, int *prot,
>          return TRANSLATE_SUCCESS;
>      }
>  
> -    pmp_has_privs = pmp_hart_has_privs(env, first, last - first + 1,
> +    pmp_has_privs = pmp_hart_has_privs(env, first, last,
>                                         1 << access_type, &pmp_priv,
> mode);
>      if (!pmp_has_privs) {
>          *prot = 0;
> diff --git a/target/riscv/tcg/pmp.c b/target/riscv/tcg/pmp.c
> index fc035c95cf..d3cbb2cb2e 100644
> --- a/target/riscv/tcg/pmp.c
> +++ b/target/riscv/tcg/pmp.c
> @@ -372,12 +372,10 @@ static bool
> pmp_hart_has_privs_default(CPURISCVState *env, pmp_priv_t privs,
>   * pmpcfg but is not acted upon during access checks. Cache
> attributes
>   * have no functional impact in QEMU emulation.
>   */
> -bool pmp_hart_has_privs(CPURISCVState *env, hwaddr addr,
> -                        int size, pmp_priv_t privs,
> -                        pmp_priv_t *allowed_privs,
> +bool pmp_hart_has_privs(CPURISCVState *env, hwaddr first, hwaddr
> last,
> +                        pmp_priv_t privs, pmp_priv_t *allowed_privs,
>                          privilege_mode_t mode)
>  {
> -    int pmp_size = 0;
>      uint8_t pmp_regions = riscv_cpu_cfg(env)->pmp_regions;
>  
>      /* Short cut if no rules */
> @@ -385,20 +383,6 @@ bool pmp_hart_has_privs(CPURISCVState *env,
> hwaddr addr,
>          return pmp_hart_has_privs_default(env, privs, allowed_privs,
> mode);
>      }
>  
> -    if (size == 0) {
> -        if (riscv_cpu_cfg(env)->mmu) {
> -            /*
> -             * If size is unknown (0), assume that all bytes
> -             * from addr to the end of the page will be accessed.
> -             */
> -            pmp_size = -(addr | TARGET_PAGE_MASK);
> -        } else {
> -            pmp_size = 2 << riscv_cpu_mxl(env);
> -        }
> -    } else {
> -        pmp_size = size;
> -    }
> -
>      /*
>       * 1.10 draft priv spec states there is an implicit order
>       * from low to high
> @@ -410,8 +394,8 @@ bool pmp_hart_has_privs(CPURISCVState *env,
> hwaddr addr,
>              continue;
>          }
>  
> -        s = pmp_is_in_range(env, i, addr);
> -        e = pmp_is_in_range(env, i, addr + pmp_size - 1);
> +        s = pmp_is_in_range(env, i, first);
> +        e = pmp_is_in_range(env, i, last);
>  
>          /* fully inside */
>          if (s && e) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.