[PATCH RFC] target: riscv: Add Svrsw60b59b extension support

Alexandre Ghiti posted 1 patch 2 weeks, 5 days ago
target/riscv/cpu.c        | 2 ++
target/riscv/cpu_bits.h   | 3 ++-
target/riscv/cpu_cfg.h    | 1 +
target/riscv/cpu_helper.c | 3 ++-
4 files changed, 7 insertions(+), 2 deletions(-)
[PATCH RFC] target: riscv: Add Svrsw60b59b extension support
Posted by Alexandre Ghiti 2 weeks, 5 days ago
The Svrsw60b59b extension allows to free the PTE reserved bits 60 and 59
for software to use.

Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
---

I tested it by always setting the bits 60 and 59 in Linux which booted
fine.

 target/riscv/cpu.c        | 2 ++
 target/riscv/cpu_bits.h   | 3 ++-
 target/riscv/cpu_cfg.h    | 1 +
 target/riscv/cpu_helper.c | 3 ++-
 4 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 3d4bd157d2..ee89cdef46 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -219,6 +219,7 @@ const RISCVIsaExtData isa_edata_arr[] = {
     ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval),
     ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot),
     ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt),
+    ISA_EXT_DATA_ENTRY(svrsw60b59b, PRIV_VERSION_1_13_0, ext_svrsw60b59b),
     ISA_EXT_DATA_ENTRY(svukte, PRIV_VERSION_1_13_0, ext_svukte),
     ISA_EXT_DATA_ENTRY(svvptc, PRIV_VERSION_1_13_0, ext_svvptc),
     ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba),
@@ -1644,6 +1645,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
     MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
     MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false),
     MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false),
+    MULTI_EXT_CFG_BOOL("svrsw60b59b", ext_svrsw60b59b, false),
     MULTI_EXT_CFG_BOOL("svvptc", ext_svvptc, true),
 
     MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true),
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
index f97c48a394..71f9e603c5 100644
--- a/target/riscv/cpu_bits.h
+++ b/target/riscv/cpu_bits.h
@@ -663,7 +663,8 @@ typedef enum {
 #define PTE_SOFT            0x300 /* Reserved for Software */
 #define PTE_PBMT            0x6000000000000000ULL /* Page-based memory types */
 #define PTE_N               0x8000000000000000ULL /* NAPOT translation */
-#define PTE_RESERVED        0x1FC0000000000000ULL /* Reserved bits */
+#define PTE_RESERVED(svrsw60b59b)		\
+		(svrsw60b59b ? 0x07C0000000000000ULL : 0x1FC0000000000000ULL) /* Reserved bits */
 #define PTE_ATTR            (PTE_N | PTE_PBMT) /* All attributes bits */
 
 /* Page table PPN shift amount */
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
index b410b1e603..f6e4b0068a 100644
--- a/target/riscv/cpu_cfg.h
+++ b/target/riscv/cpu_cfg.h
@@ -89,6 +89,7 @@ struct RISCVCPUConfig {
     bool ext_svinval;
     bool ext_svnapot;
     bool ext_svpbmt;
+    bool ext_svrsw60b59b;
     bool ext_svvptc;
     bool ext_svukte;
     bool ext_zdinx;
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
index e1dfc4ecbf..6546cea403 100644
--- a/target/riscv/cpu_helper.c
+++ b/target/riscv/cpu_helper.c
@@ -1156,6 +1156,7 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
     bool svade = riscv_cpu_cfg(env)->ext_svade;
     bool svadu = riscv_cpu_cfg(env)->ext_svadu;
     bool adue = svadu ? env->menvcfg & MENVCFG_ADUE : !svade;
+    bool svrsw60b59b = riscv_cpu_cfg(env)->ext_svrsw60b59b;
 
     if (first_stage && two_stage && env->virt_enabled) {
         pbmte = pbmte && (env->henvcfg & HENVCFG_PBMTE);
@@ -1225,7 +1226,7 @@ restart:
         if (riscv_cpu_sxl(env) == MXL_RV32) {
             ppn = pte >> PTE_PPN_SHIFT;
         } else {
-            if (pte & PTE_RESERVED) {
+            if (pte & PTE_RESERVED(svrsw60b59b)) {
                 return TRANSLATE_FAIL;
             }
 
-- 
2.39.2
Re: [PATCH RFC] target: riscv: Add Svrsw60b59b extension support
Posted by Alexandre Ghiti 2 weeks, 5 days ago
On Fri, Mar 14, 2025 at 11:48 AM Alexandre Ghiti <alexghiti@rivosinc.com> wrote:
>
> The Svrsw60b59b extension allows to free the PTE reserved bits 60 and 59
> for software to use.

I missed that the extension had been renamed to Svrsw60*t*59b, I'll
fix that in v2 later after I collect some feedback.

Thanks,

Alex

>
> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
> ---
>
> I tested it by always setting the bits 60 and 59 in Linux which booted
> fine.
>
>  target/riscv/cpu.c        | 2 ++
>  target/riscv/cpu_bits.h   | 3 ++-
>  target/riscv/cpu_cfg.h    | 1 +
>  target/riscv/cpu_helper.c | 3 ++-
>  4 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 3d4bd157d2..ee89cdef46 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -219,6 +219,7 @@ const RISCVIsaExtData isa_edata_arr[] = {
>      ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval),
>      ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot),
>      ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt),
> +    ISA_EXT_DATA_ENTRY(svrsw60b59b, PRIV_VERSION_1_13_0, ext_svrsw60b59b),
>      ISA_EXT_DATA_ENTRY(svukte, PRIV_VERSION_1_13_0, ext_svukte),
>      ISA_EXT_DATA_ENTRY(svvptc, PRIV_VERSION_1_13_0, ext_svvptc),
>      ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba),
> @@ -1644,6 +1645,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
>      MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
>      MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false),
>      MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false),
> +    MULTI_EXT_CFG_BOOL("svrsw60b59b", ext_svrsw60b59b, false),
>      MULTI_EXT_CFG_BOOL("svvptc", ext_svvptc, true),
>
>      MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true),
> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
> index f97c48a394..71f9e603c5 100644
> --- a/target/riscv/cpu_bits.h
> +++ b/target/riscv/cpu_bits.h
> @@ -663,7 +663,8 @@ typedef enum {
>  #define PTE_SOFT            0x300 /* Reserved for Software */
>  #define PTE_PBMT            0x6000000000000000ULL /* Page-based memory types */
>  #define PTE_N               0x8000000000000000ULL /* NAPOT translation */
> -#define PTE_RESERVED        0x1FC0000000000000ULL /* Reserved bits */
> +#define PTE_RESERVED(svrsw60b59b)              \
> +               (svrsw60b59b ? 0x07C0000000000000ULL : 0x1FC0000000000000ULL) /* Reserved bits */
>  #define PTE_ATTR            (PTE_N | PTE_PBMT) /* All attributes bits */
>
>  /* Page table PPN shift amount */
> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> index b410b1e603..f6e4b0068a 100644
> --- a/target/riscv/cpu_cfg.h
> +++ b/target/riscv/cpu_cfg.h
> @@ -89,6 +89,7 @@ struct RISCVCPUConfig {
>      bool ext_svinval;
>      bool ext_svnapot;
>      bool ext_svpbmt;
> +    bool ext_svrsw60b59b;
>      bool ext_svvptc;
>      bool ext_svukte;
>      bool ext_zdinx;
> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
> index e1dfc4ecbf..6546cea403 100644
> --- a/target/riscv/cpu_helper.c
> +++ b/target/riscv/cpu_helper.c
> @@ -1156,6 +1156,7 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
>      bool svade = riscv_cpu_cfg(env)->ext_svade;
>      bool svadu = riscv_cpu_cfg(env)->ext_svadu;
>      bool adue = svadu ? env->menvcfg & MENVCFG_ADUE : !svade;
> +    bool svrsw60b59b = riscv_cpu_cfg(env)->ext_svrsw60b59b;
>
>      if (first_stage && two_stage && env->virt_enabled) {
>          pbmte = pbmte && (env->henvcfg & HENVCFG_PBMTE);
> @@ -1225,7 +1226,7 @@ restart:
>          if (riscv_cpu_sxl(env) == MXL_RV32) {
>              ppn = pte >> PTE_PPN_SHIFT;
>          } else {
> -            if (pte & PTE_RESERVED) {
> +            if (pte & PTE_RESERVED(svrsw60b59b)) {
>                  return TRANSLATE_FAIL;
>              }
>
> --
> 2.39.2
>
Re: [PATCH RFC] target: riscv: Add Svrsw60b59b extension support
Posted by Daniel Henrique Barboza 2 weeks, 5 days ago

On 3/14/25 9:11 AM, Alexandre Ghiti wrote:
> On Fri, Mar 14, 2025 at 11:48 AM Alexandre Ghiti <alexghiti@rivosinc.com> wrote:
>>
>> The Svrsw60b59b extension allows to free the PTE reserved bits 60 and 59
>> for software to use.
> 
> I missed that the extension had been renamed to Svrsw60*t*59b, I'll
> fix that in v2 later after I collect some feedback.

Just to be clear: the extension is going to be named Svrsw60t59b, not
"Svrsw60*t*59b". Correct?


Aside from that code LGTM. Thanks,

Daniel


> 
> Thanks,
> 
> Alex
> 
>>
>> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
>> ---
>>
>> I tested it by always setting the bits 60 and 59 in Linux which booted
>> fine.
>>
>>   target/riscv/cpu.c        | 2 ++
>>   target/riscv/cpu_bits.h   | 3 ++-
>>   target/riscv/cpu_cfg.h    | 1 +
>>   target/riscv/cpu_helper.c | 3 ++-
>>   4 files changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>> index 3d4bd157d2..ee89cdef46 100644
>> --- a/target/riscv/cpu.c
>> +++ b/target/riscv/cpu.c
>> @@ -219,6 +219,7 @@ const RISCVIsaExtData isa_edata_arr[] = {
>>       ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval),
>>       ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot),
>>       ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt),
>> +    ISA_EXT_DATA_ENTRY(svrsw60b59b, PRIV_VERSION_1_13_0, ext_svrsw60b59b),
>>       ISA_EXT_DATA_ENTRY(svukte, PRIV_VERSION_1_13_0, ext_svukte),
>>       ISA_EXT_DATA_ENTRY(svvptc, PRIV_VERSION_1_13_0, ext_svvptc),
>>       ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba),
>> @@ -1644,6 +1645,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
>>       MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
>>       MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false),
>>       MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false),
>> +    MULTI_EXT_CFG_BOOL("svrsw60b59b", ext_svrsw60b59b, false),
>>       MULTI_EXT_CFG_BOOL("svvptc", ext_svvptc, true),
>>
>>       MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true),
>> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
>> index f97c48a394..71f9e603c5 100644
>> --- a/target/riscv/cpu_bits.h
>> +++ b/target/riscv/cpu_bits.h
>> @@ -663,7 +663,8 @@ typedef enum {
>>   #define PTE_SOFT            0x300 /* Reserved for Software */
>>   #define PTE_PBMT            0x6000000000000000ULL /* Page-based memory types */
>>   #define PTE_N               0x8000000000000000ULL /* NAPOT translation */
>> -#define PTE_RESERVED        0x1FC0000000000000ULL /* Reserved bits */
>> +#define PTE_RESERVED(svrsw60b59b)              \
>> +               (svrsw60b59b ? 0x07C0000000000000ULL : 0x1FC0000000000000ULL) /* Reserved bits */
>>   #define PTE_ATTR            (PTE_N | PTE_PBMT) /* All attributes bits */
>>
>>   /* Page table PPN shift amount */
>> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
>> index b410b1e603..f6e4b0068a 100644
>> --- a/target/riscv/cpu_cfg.h
>> +++ b/target/riscv/cpu_cfg.h
>> @@ -89,6 +89,7 @@ struct RISCVCPUConfig {
>>       bool ext_svinval;
>>       bool ext_svnapot;
>>       bool ext_svpbmt;
>> +    bool ext_svrsw60b59b;
>>       bool ext_svvptc;
>>       bool ext_svukte;
>>       bool ext_zdinx;
>> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
>> index e1dfc4ecbf..6546cea403 100644
>> --- a/target/riscv/cpu_helper.c
>> +++ b/target/riscv/cpu_helper.c
>> @@ -1156,6 +1156,7 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
>>       bool svade = riscv_cpu_cfg(env)->ext_svade;
>>       bool svadu = riscv_cpu_cfg(env)->ext_svadu;
>>       bool adue = svadu ? env->menvcfg & MENVCFG_ADUE : !svade;
>> +    bool svrsw60b59b = riscv_cpu_cfg(env)->ext_svrsw60b59b;
>>
>>       if (first_stage && two_stage && env->virt_enabled) {
>>           pbmte = pbmte && (env->henvcfg & HENVCFG_PBMTE);
>> @@ -1225,7 +1226,7 @@ restart:
>>           if (riscv_cpu_sxl(env) == MXL_RV32) {
>>               ppn = pte >> PTE_PPN_SHIFT;
>>           } else {
>> -            if (pte & PTE_RESERVED) {
>> +            if (pte & PTE_RESERVED(svrsw60b59b)) {
>>                   return TRANSLATE_FAIL;
>>               }
>>
>> --
>> 2.39.2
>>


Re: [PATCH RFC] target: riscv: Add Svrsw60b59b extension support
Posted by Alexandre Ghiti 2 weeks, 5 days ago
On Fri, Mar 14, 2025 at 1:38 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
>
>
> On 3/14/25 9:11 AM, Alexandre Ghiti wrote:
> > On Fri, Mar 14, 2025 at 11:48 AM Alexandre Ghiti <alexghiti@rivosinc.com> wrote:
> >>
> >> The Svrsw60b59b extension allows to free the PTE reserved bits 60 and 59
> >> for software to use.
> >
> > I missed that the extension had been renamed to Svrsw60*t*59b, I'll
> > fix that in v2 later after I collect some feedback.
>
> Just to be clear: the extension is going to be named Svrsw60t59b, not
> "Svrsw60*t*59b". Correct?

Yes, I added the '*' to emphasize the subtle change :)

>
>
> Aside from that code LGTM. Thanks,

Thanks!

Alex

>
> Daniel
>
>
> >
> > Thanks,
> >
> > Alex
> >
> >>
> >> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
> >> ---
> >>
> >> I tested it by always setting the bits 60 and 59 in Linux which booted
> >> fine.
> >>
> >>   target/riscv/cpu.c        | 2 ++
> >>   target/riscv/cpu_bits.h   | 3 ++-
> >>   target/riscv/cpu_cfg.h    | 1 +
> >>   target/riscv/cpu_helper.c | 3 ++-
> >>   4 files changed, 7 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> >> index 3d4bd157d2..ee89cdef46 100644
> >> --- a/target/riscv/cpu.c
> >> +++ b/target/riscv/cpu.c
> >> @@ -219,6 +219,7 @@ const RISCVIsaExtData isa_edata_arr[] = {
> >>       ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval),
> >>       ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot),
> >>       ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt),
> >> +    ISA_EXT_DATA_ENTRY(svrsw60b59b, PRIV_VERSION_1_13_0, ext_svrsw60b59b),
> >>       ISA_EXT_DATA_ENTRY(svukte, PRIV_VERSION_1_13_0, ext_svukte),
> >>       ISA_EXT_DATA_ENTRY(svvptc, PRIV_VERSION_1_13_0, ext_svvptc),
> >>       ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba),
> >> @@ -1644,6 +1645,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
> >>       MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
> >>       MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false),
> >>       MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false),
> >> +    MULTI_EXT_CFG_BOOL("svrsw60b59b", ext_svrsw60b59b, false),
> >>       MULTI_EXT_CFG_BOOL("svvptc", ext_svvptc, true),
> >>
> >>       MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true),
> >> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
> >> index f97c48a394..71f9e603c5 100644
> >> --- a/target/riscv/cpu_bits.h
> >> +++ b/target/riscv/cpu_bits.h
> >> @@ -663,7 +663,8 @@ typedef enum {
> >>   #define PTE_SOFT            0x300 /* Reserved for Software */
> >>   #define PTE_PBMT            0x6000000000000000ULL /* Page-based memory types */
> >>   #define PTE_N               0x8000000000000000ULL /* NAPOT translation */
> >> -#define PTE_RESERVED        0x1FC0000000000000ULL /* Reserved bits */
> >> +#define PTE_RESERVED(svrsw60b59b)              \
> >> +               (svrsw60b59b ? 0x07C0000000000000ULL : 0x1FC0000000000000ULL) /* Reserved bits */
> >>   #define PTE_ATTR            (PTE_N | PTE_PBMT) /* All attributes bits */
> >>
> >>   /* Page table PPN shift amount */
> >> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> >> index b410b1e603..f6e4b0068a 100644
> >> --- a/target/riscv/cpu_cfg.h
> >> +++ b/target/riscv/cpu_cfg.h
> >> @@ -89,6 +89,7 @@ struct RISCVCPUConfig {
> >>       bool ext_svinval;
> >>       bool ext_svnapot;
> >>       bool ext_svpbmt;
> >> +    bool ext_svrsw60b59b;
> >>       bool ext_svvptc;
> >>       bool ext_svukte;
> >>       bool ext_zdinx;
> >> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
> >> index e1dfc4ecbf..6546cea403 100644
> >> --- a/target/riscv/cpu_helper.c
> >> +++ b/target/riscv/cpu_helper.c
> >> @@ -1156,6 +1156,7 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
> >>       bool svade = riscv_cpu_cfg(env)->ext_svade;
> >>       bool svadu = riscv_cpu_cfg(env)->ext_svadu;
> >>       bool adue = svadu ? env->menvcfg & MENVCFG_ADUE : !svade;
> >> +    bool svrsw60b59b = riscv_cpu_cfg(env)->ext_svrsw60b59b;
> >>
> >>       if (first_stage && two_stage && env->virt_enabled) {
> >>           pbmte = pbmte && (env->henvcfg & HENVCFG_PBMTE);
> >> @@ -1225,7 +1226,7 @@ restart:
> >>           if (riscv_cpu_sxl(env) == MXL_RV32) {
> >>               ppn = pte >> PTE_PPN_SHIFT;
> >>           } else {
> >> -            if (pte & PTE_RESERVED) {
> >> +            if (pte & PTE_RESERVED(svrsw60b59b)) {
> >>                   return TRANSLATE_FAIL;
> >>               }
> >>
> >> --
> >> 2.39.2
> >>
>