On Wed, May 20, 2026 at 02:36:06PM +0800, Jay Chang wrote:
> Replace manual bit manipulation for better readability:
> 
> - TOR: Use ROUND_DOWN() to clear lower bits
> - NAPOT: Use deposit64() to set lower bits
> 
> Signed-off-by: Jay Chang <[email protected]>
Reviewed-by: Chao Liu <[email protected]>

> ---
>  target/riscv/pmp.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
> index 8adf7c9719..58a8923d0d 100644
> --- a/target/riscv/pmp.c
> +++ b/target/riscv/pmp.c
> @@ -247,8 +247,9 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t 
> pmp_index)
>      case PMP_AMATCH_TOR:
>          /* Bits pmpaddr[G-1:0] do not affect the TOR address-matching logic. 
> */
>          if (g >= 1) {
> -            prev_addr &= ~((1ULL << g) - 1ULL);
> -            this_addr &= ~((1ULL << g) - 1ULL);
> +            uint64_t granule = 1ULL << g;
> +            prev_addr = ROUND_DOWN(prev_addr, granule);
> +            this_addr = ROUND_DOWN(this_addr, granule);
>          }
>          if (prev_addr >= this_addr) {
>              sa = ea = 0u;
> @@ -641,13 +642,14 @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, 
> uint32_t addr_index)
>          case PMP_AMATCH_TOR:
>              /* Bit [g-1:0] read all zero */
>              if (g >= 1 && g < TARGET_LONG_BITS) {
> -                val &= ~((1ULL << g) - 1ULL);
> +                uint64_t granule = 1ULL << g;
> +                val = ROUND_DOWN(val, granule);
>              }
>              break;
>          case PMP_AMATCH_NAPOT:
>              /* Bit [g-2:0] read all one */
>              if (g >= 2 && g < TARGET_LONG_BITS) {
> -                val |= ((1ULL << (g - 1)) - 1ULL);
> +                val = deposit64(val, 0, g - 1, -1ULL);
>              }
>              break;
>          default:
> -- 
> 2.48.1
> 

Reply via email to