All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/2] target/riscv: Fix PMP address alignment
@ 2026-05-18  7:07 Jay Chang
  2026-05-18  7:07 ` [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity Jay Chang
  2026-05-18  7:07 ` [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment Jay Chang
  0 siblings, 2 replies; 7+ messages in thread
From: Jay Chang @ 2026-05-18  7:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Jay Chang

This series fixes PMP address alignment to comply with the RISC-V
specification WARL (Write-Any, Read-Legal) semantics.

When configuring pmpcfg (TOR, NA4, or NAPOT) and pmpaddr, if the
value is smaller than the PMP granularity, it needs to be aligned
to the PMP granularity.

Changes in v4:
- Rebase riscv-to-apply.next

Changes in v3:
- Use ROUND_UP() macro for NAPOT address alignment

Changes in v2:
- Fixed commit message grammar ("it needs to be aligned")
- Use ROUND_DOWN() macro for TOR address alignment to improve
  code readability

Jay Chang (2):
  target/riscv: Align pmp size to pmp-granularity
  target/riscv: Use macros for PMP address alignment

 target/riscv/pmp.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

-- 
2.48.1



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity
  2026-05-18  7:07 [PATCH v4 0/2] target/riscv: Fix PMP address alignment Jay Chang
@ 2026-05-18  7:07 ` Jay Chang
  2026-05-18  7:13   ` Philippe Mathieu-Daudé
  2026-05-18  7:07 ` [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment Jay Chang
  1 sibling, 1 reply; 7+ messages in thread
From: Jay Chang @ 2026-05-18  7:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Jay Chang,
	Frank Chang

When configuring pmpcfg (TOR, NA4, or NAPOT) and pmpaddr, if the
value is smaller than the PMP granularity, it needs to be aligned
to the PMP granularity.

Signed-off-by: Jay Chang <jay.chang@sifive.com>
Reviewed-by: Frank Chang <frank.chang@sifive.com>
Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
---
 target/riscv/pmp.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
index a71091a316..de2157c830 100644
--- a/target/riscv/pmp.c
+++ b/target/riscv/pmp.c
@@ -179,11 +179,12 @@ static bool pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
             }
             /*
              * When granularity g >= 1 (i.e., granularity > 4 bytes),
-             * the NA4 (Naturally Aligned 4-byte) mode is not selectable
+             * the NA4 (Naturally Aligned 4-byte) mode is not selectable.
+             * In this case, an NA4 setting is reinterpreted as a NAPOT mode.
              */
             if ((riscv_cpu_cfg(env)->pmp_granularity >
                 MIN_RISCV_PMP_GRANULARITY) && (a_field == PMP_AMATCH_NA4)) {
-                    return false;
+                    val |= PMP_AMATCH;
             }
             env->pmp_state.pmp[pmp_index].cfg_reg = val;
             pmp_update_rule_addr(env, pmp_index);
@@ -263,6 +264,11 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
         break;
 
     case PMP_AMATCH_NAPOT:
+        /* Bits [g-2:0] need to be all one to align pmp granularity */
+        if (g >= 2) {
+            this_addr |= ((1ULL << (g - 1ULL)) - 1ULL);
+        }
+
         pmp_decode_napot(this_addr, &sa, &ea);
         break;
 
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment
  2026-05-18  7:07 [PATCH v4 0/2] target/riscv: Fix PMP address alignment Jay Chang
  2026-05-18  7:07 ` [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity Jay Chang
@ 2026-05-18  7:07 ` Jay Chang
  2026-05-18  7:19   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 7+ messages in thread
From: Jay Chang @ 2026-05-18  7:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Jay Chang

Replace manual bit manipulation with alignment macros for better
readability:

- TOR: Use ROUND_DOWN() to clear lower bits
- NAPOT: Use ROUND_UP() to set lower bits

The behavior remains unchanged.

Signed-off-by: Jay Chang <jay.chang@sifive.com>
---
 target/riscv/pmp.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
index de2157c830..238c7c5162 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);
+            target_ulong 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;
@@ -266,7 +267,8 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
     case PMP_AMATCH_NAPOT:
         /* Bits [g-2:0] need to be all one to align pmp granularity */
         if (g >= 2) {
-            this_addr |= ((1ULL << (g - 1ULL)) - 1ULL);
+            target_ulong granule = 1ULL << (g - 1);
+            this_addr = ROUND_UP(this_addr + 1ULL, granule) - 1ULL;
         }
 
         pmp_decode_napot(this_addr, &sa, &ea);
@@ -641,13 +643,15 @@ 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);
+                target_ulong 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);
+                target_ulong granule = 1ULL << (g - 1);
+                val = ROUND_UP(val + 1ULL, granule) - 1ULL;
             }
             break;
         default:
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity
  2026-05-18  7:07 ` [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity Jay Chang
@ 2026-05-18  7:13   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-05-18  7:13 UTC (permalink / raw)
  To: Jay Chang, qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Frank Chang

Hi,

On 18/5/26 09:07, Jay Chang wrote:
> When configuring pmpcfg (TOR, NA4, or NAPOT) and pmpaddr, if the
> value is smaller than the PMP granularity, it needs to be aligned
> to the PMP granularity.
> 
> Signed-off-by: Jay Chang <jay.chang@sifive.com>
> Reviewed-by: Frank Chang <frank.chang@sifive.com>
> Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
> ---
>   target/riscv/pmp.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)


> @@ -263,6 +264,11 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index)
>           break;
>   
>       case PMP_AMATCH_NAPOT:
> +        /* Bits [g-2:0] need to be all one to align pmp granularity */
> +        if (g >= 2) {
> +            this_addr |= ((1ULL << (g - 1ULL)) - 1ULL);

deposit64() could be easier to read here.

> +        }
> +
>           pmp_decode_napot(this_addr, &sa, &ea);
>           break;
>   



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment
  2026-05-18  7:07 ` [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment Jay Chang
@ 2026-05-18  7:19   ` Philippe Mathieu-Daudé
  2026-05-18 16:53     ` Daniel Henrique Barboza
  0 siblings, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-05-18  7:19 UTC (permalink / raw)
  To: Jay Chang, qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Anton Johansson

On 18/5/26 09:07, Jay Chang wrote:
> Replace manual bit manipulation with alignment macros for better
> readability:
> 
> - TOR: Use ROUND_DOWN() to clear lower bits
> - NAPOT: Use ROUND_UP() to set lower bits
> 
> The behavior remains unchanged.
> 
> Signed-off-by: Jay Chang <jay.chang@sifive.com>
> ---
>   target/riscv/pmp.c | 14 +++++++++-----
>   1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
> index de2157c830..238c7c5162 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);
> +            target_ulong granule = 1ULL << g;

Maybe better to directly use uint64_t, in preparation of
https://lore.kernel.org/qemu-devel/20260515180437.23620-1-anjo@rev.ng/

> +            prev_addr = ROUND_DOWN(prev_addr, granule);
> +            this_addr = ROUND_DOWN(this_addr, granule);
>           }


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment
  2026-05-18  7:19   ` Philippe Mathieu-Daudé
@ 2026-05-18 16:53     ` Daniel Henrique Barboza
  2026-05-18 17:12       ` Anton Johansson via qemu development
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Henrique Barboza @ 2026-05-18 16:53 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Jay Chang, qemu-devel, qemu-riscv
  Cc: Palmer Dabbelt, Alistair Francis, Weiwei Li, Liu Zhiwei, Chao Liu,
	Anton Johansson



On 5/18/2026 4:19 AM, Philippe Mathieu-Daudé wrote:
> On 18/5/26 09:07, Jay Chang wrote:
>> Replace manual bit manipulation with alignment macros for better
>> readability:
>>
>> - TOR: Use ROUND_DOWN() to clear lower bits
>> - NAPOT: Use ROUND_UP() to set lower bits
>>
>> The behavior remains unchanged.
>>
>> Signed-off-by: Jay Chang <jay.chang@sifive.com>
>> ---
>>   target/riscv/pmp.c | 14 +++++++++-----
>>   1 file changed, 9 insertions(+), 5 deletions(-)
>>
>> diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
>> index de2157c830..238c7c5162 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);
>> +            target_ulong granule = 1ULL << g;
> 
> Maybe better to directly use uint64_t, in preparation of
> https://lore.kernel.org/qemu-devel/20260515180437.23620-1-anjo@rev.ng/

Can we please CC qemu-riscv@nongnu.org for the next version? This might
be the first time the RISC-V reviewers are made aware that this series
exists.  It surely is my first time :D


Cheers,
Daniel


> 
>> +            prev_addr = ROUND_DOWN(prev_addr, granule);
>> +            this_addr = ROUND_DOWN(this_addr, granule);
>>           }



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment
  2026-05-18 16:53     ` Daniel Henrique Barboza
@ 2026-05-18 17:12       ` Anton Johansson via qemu development
  0 siblings, 0 replies; 7+ messages in thread
From: Anton Johansson via qemu development @ 2026-05-18 17:12 UTC (permalink / raw)
  To: Daniel Henrique Barboza
  Cc: Philippe Mathieu-Daudé, Jay Chang, qemu-devel, qemu-riscv,
	Palmer Dabbelt, Alistair Francis, Weiwei Li, Liu Zhiwei, Chao Liu

On 18/05/26, Daniel Henrique Barboza wrote:
> 
> 
> On 5/18/2026 4:19 AM, Philippe Mathieu-Daudé wrote:
> > On 18/5/26 09:07, Jay Chang wrote:
> > > Replace manual bit manipulation with alignment macros for better
> > > readability:
> > > 
> > > - TOR: Use ROUND_DOWN() to clear lower bits
> > > - NAPOT: Use ROUND_UP() to set lower bits
> > > 
> > > The behavior remains unchanged.
> > > 
> > > Signed-off-by: Jay Chang <jay.chang@sifive.com>
> > > ---
> > >   target/riscv/pmp.c | 14 +++++++++-----
> > >   1 file changed, 9 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
> > > index de2157c830..238c7c5162 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);
> > > +            target_ulong granule = 1ULL << g;
> > 
> > Maybe better to directly use uint64_t, in preparation of
> > https://lore.kernel.org/qemu-devel/20260515180437.23620-1-anjo@rev.ng/
> 
> Can we please CC qemu-riscv@nongnu.org for the next version? This might
> be the first time the RISC-V reviewers are made aware that this series
> exists.  It surely is my first time :D

That's on me, will do!:)

-- 
Anton Johansson
rev.ng Labs Srl.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-05-18 17:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-18  7:07 [PATCH v4 0/2] target/riscv: Fix PMP address alignment Jay Chang
2026-05-18  7:07 ` [PATCH v4 1/2] target/riscv: Align pmp size to pmp-granularity Jay Chang
2026-05-18  7:13   ` Philippe Mathieu-Daudé
2026-05-18  7:07 ` [PATCH v4 2/2] target/riscv: Use macros for PMP address alignment Jay Chang
2026-05-18  7:19   ` Philippe Mathieu-Daudé
2026-05-18 16:53     ` Daniel Henrique Barboza
2026-05-18 17:12       ` Anton Johansson via qemu development

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.