qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] target/riscv: Fix mstatus.MPP related support
@ 2023-03-30 13:58 Weiwei Li
  2023-03-30 13:58 ` [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET Weiwei Li
  2023-03-30 13:58 ` [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus Weiwei Li
  0 siblings, 2 replies; 13+ messages in thread
From: Weiwei Li @ 2023-03-30 13:58 UTC (permalink / raw)
  To: qemu-riscv, qemu-devel
  Cc: palmer, alistair.francis, bin.meng, dbarboza, zhiwei_liu,
	wangjunqiang, lazyparser, Weiwei Li

This patchset tries to fix some problems in current implementation for mstatus.MPP.
- set to the least-privileged supported mode (U if U-mode is implemented, else M) after executing mret
- legalize mpp when write to mstatus

The port is available here:
https://github.com/plctlab/plct-qemu/tree/plct-mpp-fix

Weiwei Li (2):
  target/riscv: Fix the mstatus.MPP value after executing MRET
  target/riscv: Legalize MPP value in write_mstatus

 target/riscv/cpu_helper.c |  5 +----
 target/riscv/csr.c        | 14 ++++++++++++++
 target/riscv/op_helper.c  |  3 ++-
 3 files changed, 17 insertions(+), 5 deletions(-)

-- 
2.25.1



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

* [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-03-30 13:58 [PATCH 0/2] target/riscv: Fix mstatus.MPP related support Weiwei Li
@ 2023-03-30 13:58 ` Weiwei Li
  2023-04-06  0:43   ` Alistair Francis
  2023-03-30 13:58 ` [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus Weiwei Li
  1 sibling, 1 reply; 13+ messages in thread
From: Weiwei Li @ 2023-03-30 13:58 UTC (permalink / raw)
  To: qemu-riscv, qemu-devel
  Cc: palmer, alistair.francis, bin.meng, dbarboza, zhiwei_liu,
	wangjunqiang, lazyparser, Weiwei Li

The MPP will be set to the least-privileged supported mode (U if
U-mode is implemented, else M).

Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
---
 target/riscv/op_helper.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
index 84ee018f7d..991f06d98d 100644
--- a/target/riscv/op_helper.c
+++ b/target/riscv/op_helper.c
@@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
     mstatus = set_field(mstatus, MSTATUS_MIE,
                         get_field(mstatus, MSTATUS_MPIE));
     mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
-    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
+    mstatus = set_field(mstatus, MSTATUS_MPP,
+                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
     mstatus = set_field(mstatus, MSTATUS_MPV, 0);
     if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
         mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
-- 
2.25.1



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

* [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus
  2023-03-30 13:58 [PATCH 0/2] target/riscv: Fix mstatus.MPP related support Weiwei Li
  2023-03-30 13:58 ` [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET Weiwei Li
@ 2023-03-30 13:58 ` Weiwei Li
  2023-04-06  1:26   ` Alistair Francis
  1 sibling, 1 reply; 13+ messages in thread
From: Weiwei Li @ 2023-03-30 13:58 UTC (permalink / raw)
  To: qemu-riscv, qemu-devel
  Cc: palmer, alistair.francis, bin.meng, dbarboza, zhiwei_liu,
	wangjunqiang, lazyparser, Weiwei Li

mstatus.MPP field is a WARL field, so we remain it unchanged if an
invalid value is written into it. And after this, RVH shouldn't be
passed to riscv_cpu_set_mode().

Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
---
 target/riscv/cpu_helper.c |  5 +----
 target/riscv/csr.c        | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
index f88c503cf4..46baf3ab7c 100644
--- a/target/riscv/cpu_helper.c
+++ b/target/riscv/cpu_helper.c
@@ -659,12 +659,9 @@ void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, uint32_t priv,
 
 void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
 {
-    if (newpriv > PRV_M) {
+    if (newpriv > PRV_M || newpriv == PRV_H) {
         g_assert_not_reached();
     }
-    if (newpriv == PRV_H) {
-        newpriv = PRV_U;
-    }
     if (icount_enabled() && newpriv != env->priv) {
         riscv_itrigger_update_priv(env);
     }
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index d522efc0b6..a99026c3e8 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -1238,6 +1238,18 @@ static bool validate_vm(CPURISCVState *env, target_ulong vm)
     return (vm & 0xf) <= satp_mode_max_from_map(cpu->cfg.satp_mode.map);
 }
 
+static target_ulong legalize_mpp(CPURISCVState *env, target_ulong old_mpp,
+                                 target_ulong val)
+{
+    target_ulong new_mpp = get_field(val, MSTATUS_MPP);
+    bool mpp_invalid = (new_mpp == PRV_S && !riscv_has_ext(env, RVS)) ||
+                       (new_mpp == PRV_U && !riscv_has_ext(env, RVU)) ||
+                       (new_mpp == PRV_H);
+
+    /* Remain field unchanged if new_mpp value is invalid */
+    return mpp_invalid ? set_field(val, MSTATUS_MPP, old_mpp) : val;
+}
+
 static RISCVException write_mstatus(CPURISCVState *env, int csrno,
                                     target_ulong val)
 {
@@ -1245,6 +1257,8 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
     uint64_t mask = 0;
     RISCVMXL xl = riscv_cpu_mxl(env);
 
+    val = legalize_mpp(env, get_field(mstatus, MSTATUS_MPP), val);
+
     /* flush tlb on mstatus fields that affect VM */
     if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV |
             MSTATUS_MPRV | MSTATUS_SUM)) {
-- 
2.25.1



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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-03-30 13:58 ` [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET Weiwei Li
@ 2023-04-06  0:43   ` Alistair Francis
  2023-04-06  0:56     ` liweiwei
  0 siblings, 1 reply; 13+ messages in thread
From: Alistair Francis @ 2023-04-06  0:43 UTC (permalink / raw)
  To: Weiwei Li
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>
> The MPP will be set to the least-privileged supported mode (U if
> U-mode is implemented, else M).

I don't think this is right, the spec in section 8.6.4 says this:

"MRET then in mstatus/mstatush sets MPV=0, MPP=0,
MIE=MPIE, and MPIE=1"

So it should just always be 0 (PRV_U is 0)

Alistair

>
> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
> ---
>  target/riscv/op_helper.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index 84ee018f7d..991f06d98d 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>      mstatus = set_field(mstatus, MSTATUS_MIE,
>                          get_field(mstatus, MSTATUS_MPIE));
>      mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
> +    mstatus = set_field(mstatus, MSTATUS_MPP,
> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>      mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>      if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>          mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> --
> 2.25.1
>
>


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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  0:43   ` Alistair Francis
@ 2023-04-06  0:56     ` liweiwei
  2023-04-06  1:46       ` Alistair Francis
  0 siblings, 1 reply; 13+ messages in thread
From: liweiwei @ 2023-04-06  0:56 UTC (permalink / raw)
  To: Alistair Francis, Weiwei Li
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

[-- Attachment #1: Type: text/plain, Size: 2110 bytes --]


On 2023/4/6 08:43, Alistair Francis wrote:
> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li<liweiwei@iscas.ac.cn>  wrote:
>> The MPP will be set to the least-privileged supported mode (U if
>> U-mode is implemented, else M).
> I don't think this is right, the spec in section 8.6.4 says this:

Sorry, I didn't find this section in latest release of both privilege 
and un-privilege spec

(draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).

>
> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
> MIE=MPIE, and MPIE=1"

In section 3.1.6.1, the privilege spec says this:

"An MRET or SRET instruction is used to return from a trap in M-mode or 
S-mode respectively.
When executing anxRET instruction, supposingxPP holds the valuey,xIE is 
set toxPIE; the
privilege mode is changed toy;xPIE is set to 1; andxPP is set to the 
least-privileged supported
mode (U if U-mode is implemented, else M). Ify̸=M,xRET also sets MPRV=0"

And I think PRV_U is an illegal value for MPP if U-mode is not implemented.

Regards,

Weiwei Li

> So it should just always be 0 (PRV_U is 0)
>
> Alistair
>
>> Signed-off-by: Weiwei Li<liweiwei@iscas.ac.cn>
>> Signed-off-by: Junqiang Wang<wangjunqiang@iscas.ac.cn>
>> ---
>>   target/riscv/op_helper.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
>> index 84ee018f7d..991f06d98d 100644
>> --- a/target/riscv/op_helper.c
>> +++ b/target/riscv/op_helper.c
>> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>>       mstatus = set_field(mstatus, MSTATUS_MIE,
>>                           get_field(mstatus, MSTATUS_MPIE));
>>       mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>> +    mstatus = set_field(mstatus, MSTATUS_MPP,
>> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>>       mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>>       if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>>           mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
>> --
>> 2.25.1
>>
>>

[-- Attachment #2: Type: text/html, Size: 9810 bytes --]

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

* Re: [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus
  2023-03-30 13:58 ` [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus Weiwei Li
@ 2023-04-06  1:26   ` Alistair Francis
  2023-04-06  1:35     ` liweiwei
  0 siblings, 1 reply; 13+ messages in thread
From: Alistair Francis @ 2023-04-06  1:26 UTC (permalink / raw)
  To: Weiwei Li
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>
> mstatus.MPP field is a WARL field, so we remain it unchanged if an

Only since version 1.11 of the priv spec and we do still support priv 1.10.

I think it's ok to make this change for all priv versions, as it won't
break any software running 1.10, but it's worth adding a comment or at
least a mention in the commit message.

Alistair

> invalid value is written into it. And after this, RVH shouldn't be
> passed to riscv_cpu_set_mode().
>
> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
> ---
>  target/riscv/cpu_helper.c |  5 +----
>  target/riscv/csr.c        | 14 ++++++++++++++
>  2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
> index f88c503cf4..46baf3ab7c 100644
> --- a/target/riscv/cpu_helper.c
> +++ b/target/riscv/cpu_helper.c
> @@ -659,12 +659,9 @@ void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, uint32_t priv,
>
>  void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
>  {
> -    if (newpriv > PRV_M) {
> +    if (newpriv > PRV_M || newpriv == PRV_H) {
>          g_assert_not_reached();
>      }
> -    if (newpriv == PRV_H) {
> -        newpriv = PRV_U;
> -    }
>      if (icount_enabled() && newpriv != env->priv) {
>          riscv_itrigger_update_priv(env);
>      }
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index d522efc0b6..a99026c3e8 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -1238,6 +1238,18 @@ static bool validate_vm(CPURISCVState *env, target_ulong vm)
>      return (vm & 0xf) <= satp_mode_max_from_map(cpu->cfg.satp_mode.map);
>  }
>
> +static target_ulong legalize_mpp(CPURISCVState *env, target_ulong old_mpp,
> +                                 target_ulong val)
> +{
> +    target_ulong new_mpp = get_field(val, MSTATUS_MPP);
> +    bool mpp_invalid = (new_mpp == PRV_S && !riscv_has_ext(env, RVS)) ||
> +                       (new_mpp == PRV_U && !riscv_has_ext(env, RVU)) ||
> +                       (new_mpp == PRV_H);
> +
> +    /* Remain field unchanged if new_mpp value is invalid */
> +    return mpp_invalid ? set_field(val, MSTATUS_MPP, old_mpp) : val;
> +}
> +
>  static RISCVException write_mstatus(CPURISCVState *env, int csrno,
>                                      target_ulong val)
>  {
> @@ -1245,6 +1257,8 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
>      uint64_t mask = 0;
>      RISCVMXL xl = riscv_cpu_mxl(env);
>
> +    val = legalize_mpp(env, get_field(mstatus, MSTATUS_MPP), val);
> +
>      /* flush tlb on mstatus fields that affect VM */
>      if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV |
>              MSTATUS_MPRV | MSTATUS_SUM)) {
> --
> 2.25.1
>
>


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

* Re: [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus
  2023-04-06  1:26   ` Alistair Francis
@ 2023-04-06  1:35     ` liweiwei
  0 siblings, 0 replies; 13+ messages in thread
From: liweiwei @ 2023-04-06  1:35 UTC (permalink / raw)
  To: Alistair Francis
  Cc: liweiwei, qemu-riscv, qemu-devel, palmer, alistair.francis,
	bin.meng, dbarboza, zhiwei_liu, wangjunqiang, lazyparser


On 2023/4/6 09:26, Alistair Francis wrote:
> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>> mstatus.MPP field is a WARL field, so we remain it unchanged if an
> Only since version 1.11 of the priv spec and we do still support priv 1.10.
>
> I think it's ok to make this change for all priv versions, as it won't
> break any software running 1.10, but it's worth adding a comment or at
> least a mention in the commit message.

OK. I'll add it in next version.

Regards,

Weiwei Li

>
> Alistair
>
>> invalid value is written into it. And after this, RVH shouldn't be
>> passed to riscv_cpu_set_mode().
>>
>> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
>> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
>> ---
>>   target/riscv/cpu_helper.c |  5 +----
>>   target/riscv/csr.c        | 14 ++++++++++++++
>>   2 files changed, 15 insertions(+), 4 deletions(-)
>>
>> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
>> index f88c503cf4..46baf3ab7c 100644
>> --- a/target/riscv/cpu_helper.c
>> +++ b/target/riscv/cpu_helper.c
>> @@ -659,12 +659,9 @@ void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, uint32_t priv,
>>
>>   void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
>>   {
>> -    if (newpriv > PRV_M) {
>> +    if (newpriv > PRV_M || newpriv == PRV_H) {
>>           g_assert_not_reached();
>>       }
>> -    if (newpriv == PRV_H) {
>> -        newpriv = PRV_U;
>> -    }
>>       if (icount_enabled() && newpriv != env->priv) {
>>           riscv_itrigger_update_priv(env);
>>       }
>> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
>> index d522efc0b6..a99026c3e8 100644
>> --- a/target/riscv/csr.c
>> +++ b/target/riscv/csr.c
>> @@ -1238,6 +1238,18 @@ static bool validate_vm(CPURISCVState *env, target_ulong vm)
>>       return (vm & 0xf) <= satp_mode_max_from_map(cpu->cfg.satp_mode.map);
>>   }
>>
>> +static target_ulong legalize_mpp(CPURISCVState *env, target_ulong old_mpp,
>> +                                 target_ulong val)
>> +{
>> +    target_ulong new_mpp = get_field(val, MSTATUS_MPP);
>> +    bool mpp_invalid = (new_mpp == PRV_S && !riscv_has_ext(env, RVS)) ||
>> +                       (new_mpp == PRV_U && !riscv_has_ext(env, RVU)) ||
>> +                       (new_mpp == PRV_H);
>> +
>> +    /* Remain field unchanged if new_mpp value is invalid */
>> +    return mpp_invalid ? set_field(val, MSTATUS_MPP, old_mpp) : val;
>> +}
>> +
>>   static RISCVException write_mstatus(CPURISCVState *env, int csrno,
>>                                       target_ulong val)
>>   {
>> @@ -1245,6 +1257,8 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
>>       uint64_t mask = 0;
>>       RISCVMXL xl = riscv_cpu_mxl(env);
>>
>> +    val = legalize_mpp(env, get_field(mstatus, MSTATUS_MPP), val);
>> +
>>       /* flush tlb on mstatus fields that affect VM */
>>       if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV |
>>               MSTATUS_MPRV | MSTATUS_SUM)) {
>> --
>> 2.25.1
>>
>>



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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  0:56     ` liweiwei
@ 2023-04-06  1:46       ` Alistair Francis
  2023-04-06  2:14         ` liweiwei
  0 siblings, 1 reply; 13+ messages in thread
From: Alistair Francis @ 2023-04-06  1:46 UTC (permalink / raw)
  To: liweiwei
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
>
>
> On 2023/4/6 08:43, Alistair Francis wrote:
>
> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>
> The MPP will be set to the least-privileged supported mode (U if
> U-mode is implemented, else M).
>
> I don't think this is right, the spec in section 8.6.4 says this:
>
> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec

I updated my spec, using commit
f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
Return

>
> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).

Also, you replied with a HTML email which loses the conversation
history (just see above). Can you fixup your client to reply with
plain text please

Alistair

>
> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
> MIE=MPIE, and MPIE=1"
>
> In section 3.1.6.1, the privilege spec says this:
>
> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
>
> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
>
> Regards,
>
> Weiwei Li
>
> So it should just always be 0 (PRV_U is 0)
>
> Alistair
>
> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
> ---
>  target/riscv/op_helper.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index 84ee018f7d..991f06d98d 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>      mstatus = set_field(mstatus, MSTATUS_MIE,
>                          get_field(mstatus, MSTATUS_MPIE));
>      mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
> +    mstatus = set_field(mstatus, MSTATUS_MPP,
> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>      mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>      if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>          mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> --
> 2.25.1
>
>


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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  1:46       ` Alistair Francis
@ 2023-04-06  2:14         ` liweiwei
  2023-04-06  2:24           ` Alistair Francis
  0 siblings, 1 reply; 13+ messages in thread
From: liweiwei @ 2023-04-06  2:14 UTC (permalink / raw)
  To: Alistair Francis
  Cc: liweiwei, qemu-riscv, qemu-devel, palmer, alistair.francis,
	bin.meng, dbarboza, zhiwei_liu, wangjunqiang, lazyparser


On 2023/4/6 09:46, Alistair Francis wrote:
> On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
>>
>> On 2023/4/6 08:43, Alistair Francis wrote:
>>
>> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>>
>> The MPP will be set to the least-privileged supported mode (U if
>> U-mode is implemented, else M).
>>
>> I don't think this is right, the spec in section 8.6.4 says this:
>>
>> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec
> I updated my spec, using commit
> f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
> Return

Yeah. I see it. However, this is a little different from the description 
in section 3.1.6.1.

And MPP is WARL field.  PRV_U will be an illegal value for MPP if U-mode 
is not implemented.

So I think description in section 3.1.6.1 seems more reasonable.

>
>> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).
> Also, you replied with a HTML email which loses the conversation
> history (just see above). Can you fixup your client to reply with
> plain text please

Sorry. I don't get your problem. I replied by Thunderbird. Above is the 
title for the latest release version of the spec in riscv-isa-manual 
github 
(https://github.com/riscv/riscv-isa-manual/releases/tag/draft-20230131-c0b298a).

Regards,

Weiwei Li

>
> Alistair
>
>> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
>> MIE=MPIE, and MPIE=1"
>>
>> In section 3.1.6.1, the privilege spec says this:
>>
>> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
>> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
>> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
>> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
>>
>> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
>>
>> Regards,
>>
>> Weiwei Li
>>
>> So it should just always be 0 (PRV_U is 0)
>>
>> Alistair
>>
>> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
>> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
>> ---
>>   target/riscv/op_helper.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
>> index 84ee018f7d..991f06d98d 100644
>> --- a/target/riscv/op_helper.c
>> +++ b/target/riscv/op_helper.c
>> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>>       mstatus = set_field(mstatus, MSTATUS_MIE,
>>                           get_field(mstatus, MSTATUS_MPIE));
>>       mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>> +    mstatus = set_field(mstatus, MSTATUS_MPP,
>> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>>       mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>>       if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>>           mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
>> --
>> 2.25.1
>>
>>



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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  2:14         ` liweiwei
@ 2023-04-06  2:24           ` Alistair Francis
  2023-04-06  2:39             ` liweiwei
  2023-04-06  3:01             ` liweiwei
  0 siblings, 2 replies; 13+ messages in thread
From: Alistair Francis @ 2023-04-06  2:24 UTC (permalink / raw)
  To: liweiwei
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

On Thu, Apr 6, 2023 at 12:14 PM liweiwei <liweiwei@iscas.ac.cn> wrote:
>
>
> On 2023/4/6 09:46, Alistair Francis wrote:
> > On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
> >>
> >> On 2023/4/6 08:43, Alistair Francis wrote:
> >>
> >> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
> >>
> >> The MPP will be set to the least-privileged supported mode (U if
> >> U-mode is implemented, else M).
> >>
> >> I don't think this is right, the spec in section 8.6.4 says this:
> >>
> >> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec
> > I updated my spec, using commit
> > f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
> > Return
>
> Yeah. I see it. However, this is a little different from the description
> in section 3.1.6.1.

They seem to be in conflict. It's probably worth opening an issue
against the spec to get some clarification here.

>
> And MPP is WARL field.  PRV_U will be an illegal value for MPP if U-mode
> is not implemented.

Yeah, I think you are right. It just directly goes against the mret
section. I suspect the mret section is wrong and needs to be updated

>
> So I think description in section 3.1.6.1 seems more reasonable.
>
> >
> >> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).
> > Also, you replied with a HTML email which loses the conversation
> > history (just see above). Can you fixup your client to reply with
> > plain text please
>
> Sorry. I don't get your problem. I replied by Thunderbird. Above is the

Have a look at your previous email, it's a HTML email. If I view the
source of the email I see this:

    Content-Type: text/html; charset=UTF-8

and the formatting is a little off.

This email that I'm replying to is a plain text email. I'm not sure
what happened, but try to check that your responses are plain text. I
think there is a setting in Thunderbird to just open and reply to all
emails as plain text, which is probably worth turning on

Alistair

> title for the latest release version of the spec in riscv-isa-manual
> github
> (https://github.com/riscv/riscv-isa-manual/releases/tag/draft-20230131-c0b298a).
>
> Regards,
>
> Weiwei Li
>
> >
> > Alistair
> >
> >> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
> >> MIE=MPIE, and MPIE=1"
> >>
> >> In section 3.1.6.1, the privilege spec says this:
> >>
> >> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
> >> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
> >> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
> >> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
> >>
> >> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
> >>
> >> Regards,
> >>
> >> Weiwei Li
> >>
> >> So it should just always be 0 (PRV_U is 0)
> >>
> >> Alistair
> >>
> >> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
> >> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
> >> ---
> >>   target/riscv/op_helper.c | 3 ++-
> >>   1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> >> index 84ee018f7d..991f06d98d 100644
> >> --- a/target/riscv/op_helper.c
> >> +++ b/target/riscv/op_helper.c
> >> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
> >>       mstatus = set_field(mstatus, MSTATUS_MIE,
> >>                           get_field(mstatus, MSTATUS_MPIE));
> >>       mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
> >> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
> >> +    mstatus = set_field(mstatus, MSTATUS_MPP,
> >> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
> >>       mstatus = set_field(mstatus, MSTATUS_MPV, 0);
> >>       if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
> >>           mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> >> --
> >> 2.25.1
> >>
> >>
>


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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  2:24           ` Alistair Francis
@ 2023-04-06  2:39             ` liweiwei
  2023-04-06  3:01             ` liweiwei
  1 sibling, 0 replies; 13+ messages in thread
From: liweiwei @ 2023-04-06  2:39 UTC (permalink / raw)
  To: Alistair Francis
  Cc: liweiwei, qemu-riscv, qemu-devel, palmer, alistair.francis,
	bin.meng, dbarboza, zhiwei_liu, wangjunqiang, lazyparser


On 2023/4/6 10:24, Alistair Francis wrote:
> On Thu, Apr 6, 2023 at 12:14 PM liweiwei <liweiwei@iscas.ac.cn> wrote:
>>
>> On 2023/4/6 09:46, Alistair Francis wrote:
>>> On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
>>>> On 2023/4/6 08:43, Alistair Francis wrote:
>>>>
>>>> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>>>>
>>>> The MPP will be set to the least-privileged supported mode (U if
>>>> U-mode is implemented, else M).
>>>>
>>>> I don't think this is right, the spec in section 8.6.4 says this:
>>>>
>>>> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec
>>> I updated my spec, using commit
>>> f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
>>> Return
>> Yeah. I see it. However, this is a little different from the description
>> in section 3.1.6.1.
> They seem to be in conflict. It's probably worth opening an issue
> against the spec to get some clarification here.
OK. I'll send an issue for it.
>
>> And MPP is WARL field.  PRV_U will be an illegal value for MPP if U-mode
>> is not implemented.
> Yeah, I think you are right. It just directly goes against the mret
> section. I suspect the mret section is wrong and needs to be updated
>
>> So I think description in section 3.1.6.1 seems more reasonable.
>>
>>>> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).
>>> Also, you replied with a HTML email which loses the conversation
>>> history (just see above). Can you fixup your client to reply with
>>> plain text please
>> Sorry. I don't get your problem. I replied by Thunderbird. Above is the
> Have a look at your previous email, it's a HTML email. If I view the
> source of the email I see this:
>
>      Content-Type: text/html; charset=UTF-8
>
> and the formatting is a little off.
>
> This email that I'm replying to is a plain text email. I'm not sure
> what happened, but try to check that your responses are plain text. I
> think there is a setting in Thunderbird to just open and reply to all
> emails as plain text, which is probably worth turning on

OK . Thanks! I'll try to set it later.

Regards,

Weiwei Li

>
> Alistair
>
>> title for the latest release version of the spec in riscv-isa-manual
>> github
>> (https://github.com/riscv/riscv-isa-manual/releases/tag/draft-20230131-c0b298a).
>>
>> Regards,
>>
>> Weiwei Li
>>
>>> Alistair
>>>
>>>> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
>>>> MIE=MPIE, and MPIE=1"
>>>>
>>>> In section 3.1.6.1, the privilege spec says this:
>>>>
>>>> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
>>>> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
>>>> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
>>>> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
>>>>
>>>> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
>>>>
>>>> Regards,
>>>>
>>>> Weiwei Li
>>>>
>>>> So it should just always be 0 (PRV_U is 0)
>>>>
>>>> Alistair
>>>>
>>>> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
>>>> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
>>>> ---
>>>>    target/riscv/op_helper.c | 3 ++-
>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
>>>> index 84ee018f7d..991f06d98d 100644
>>>> --- a/target/riscv/op_helper.c
>>>> +++ b/target/riscv/op_helper.c
>>>> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>>>>        mstatus = set_field(mstatus, MSTATUS_MIE,
>>>>                            get_field(mstatus, MSTATUS_MPIE));
>>>>        mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>>>> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>>>> +    mstatus = set_field(mstatus, MSTATUS_MPP,
>>>> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>>>>        mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>>>>        if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>>>>            mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
>>>> --
>>>> 2.25.1
>>>>
>>>>



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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  2:24           ` Alistair Francis
  2023-04-06  2:39             ` liweiwei
@ 2023-04-06  3:01             ` liweiwei
  2023-04-06  3:55               ` Alistair Francis
  1 sibling, 1 reply; 13+ messages in thread
From: liweiwei @ 2023-04-06  3:01 UTC (permalink / raw)
  To: Alistair Francis, liweiwei
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser


On 2023/4/6 10:24, Alistair Francis wrote:
> On Thu, Apr 6, 2023 at 12:14 PM liweiwei <liweiwei@iscas.ac.cn> wrote:
>>
>> On 2023/4/6 09:46, Alistair Francis wrote:
>>> On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
>>>> On 2023/4/6 08:43, Alistair Francis wrote:
>>>>
>>>> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
>>>>
>>>> The MPP will be set to the least-privileged supported mode (U if
>>>> U-mode is implemented, else M).
>>>>
>>>> I don't think this is right, the spec in section 8.6.4 says this:
>>>>
>>>> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec
>>> I updated my spec, using commit
>>> f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
>>> Return
>> Yeah. I see it. However, this is a little different from the description
>> in section 3.1.6.1.
> They seem to be in conflict. It's probably worth opening an issue
> against the spec to get some clarification here.

I have sent an issue for 
it(https://github.com/riscv/riscv-isa-manual/issues/1006).

However, I just find it may be not a conflict. Section 9.6.4 is the spec 
for hypervisor. And when hypervisor is supported,

S-mode, then U-mode should be supported too.

Regards,

Weiwei Li

>
>> And MPP is WARL field.  PRV_U will be an illegal value for MPP if U-mode
>> is not implemented.
> Yeah, I think you are right. It just directly goes against the mret
> section. I suspect the mret section is wrong and needs to be updated
>
>> So I think description in section 3.1.6.1 seems more reasonable.
>>
>>>> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).
>>> Also, you replied with a HTML email which loses the conversation
>>> history (just see above). Can you fixup your client to reply with
>>> plain text please
>> Sorry. I don't get your problem. I replied by Thunderbird. Above is the
> Have a look at your previous email, it's a HTML email. If I view the
> source of the email I see this:
>
>      Content-Type: text/html; charset=UTF-8
>
> and the formatting is a little off.
>
> This email that I'm replying to is a plain text email. I'm not sure
> what happened, but try to check that your responses are plain text. I
> think there is a setting in Thunderbird to just open and reply to all
> emails as plain text, which is probably worth turning on
>
> Alistair
>
>> title for the latest release version of the spec in riscv-isa-manual
>> github
>> (https://github.com/riscv/riscv-isa-manual/releases/tag/draft-20230131-c0b298a).
>>
>> Regards,
>>
>> Weiwei Li
>>
>>> Alistair
>>>
>>>> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
>>>> MIE=MPIE, and MPIE=1"
>>>>
>>>> In section 3.1.6.1, the privilege spec says this:
>>>>
>>>> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
>>>> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
>>>> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
>>>> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
>>>>
>>>> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
>>>>
>>>> Regards,
>>>>
>>>> Weiwei Li
>>>>
>>>> So it should just always be 0 (PRV_U is 0)
>>>>
>>>> Alistair
>>>>
>>>> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
>>>> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
>>>> ---
>>>>    target/riscv/op_helper.c | 3 ++-
>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
>>>> index 84ee018f7d..991f06d98d 100644
>>>> --- a/target/riscv/op_helper.c
>>>> +++ b/target/riscv/op_helper.c
>>>> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
>>>>        mstatus = set_field(mstatus, MSTATUS_MIE,
>>>>                            get_field(mstatus, MSTATUS_MPIE));
>>>>        mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>>>> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>>>> +    mstatus = set_field(mstatus, MSTATUS_MPP,
>>>> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
>>>>        mstatus = set_field(mstatus, MSTATUS_MPV, 0);
>>>>        if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
>>>>            mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
>>>> --
>>>> 2.25.1
>>>>
>>>>



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

* Re: [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET
  2023-04-06  3:01             ` liweiwei
@ 2023-04-06  3:55               ` Alistair Francis
  0 siblings, 0 replies; 13+ messages in thread
From: Alistair Francis @ 2023-04-06  3:55 UTC (permalink / raw)
  To: liweiwei
  Cc: qemu-riscv, qemu-devel, palmer, alistair.francis, bin.meng,
	dbarboza, zhiwei_liu, wangjunqiang, lazyparser

On Thu, Apr 6, 2023 at 1:02 PM liweiwei <liweiwei@iscas.ac.cn> wrote:
>
>
> On 2023/4/6 10:24, Alistair Francis wrote:
> > On Thu, Apr 6, 2023 at 12:14 PM liweiwei <liweiwei@iscas.ac.cn> wrote:
> >>
> >> On 2023/4/6 09:46, Alistair Francis wrote:
> >>> On Thu, Apr 6, 2023 at 10:56 AM liweiwei <liweiwei@iscas.ac.cn> wrote:
> >>>> On 2023/4/6 08:43, Alistair Francis wrote:
> >>>>
> >>>> On Thu, Mar 30, 2023 at 11:59 PM Weiwei Li <liweiwei@iscas.ac.cn> wrote:
> >>>>
> >>>> The MPP will be set to the least-privileged supported mode (U if
> >>>> U-mode is implemented, else M).
> >>>>
> >>>> I don't think this is right, the spec in section 8.6.4 says this:
> >>>>
> >>>> Sorry, I didn't find this section in latest release of both privilege and un-privilege spec
> >>> I updated my spec, using commit
> >>> f6b8d5c7d2dcd935b48689a337c8f5bc2be4b5e5 it's now section 9.6.4 Trap
> >>> Return
> >> Yeah. I see it. However, this is a little different from the description
> >> in section 3.1.6.1.
> > They seem to be in conflict. It's probably worth opening an issue
> > against the spec to get some clarification here.
>
> I have sent an issue for
> it(https://github.com/riscv/riscv-isa-manual/issues/1006).
>
> However, I just find it may be not a conflict. Section 9.6.4 is the spec
> for hypervisor. And when hypervisor is supported,
>
> S-mode, then U-mode should be supported too.

Ah, I didn't think to check the actual section!

Good call. I think you are right then. In which case this patch is the
correct way to go :)

Feel free to close the issue if you want to.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

>
> Regards,
>
> Weiwei Li
>
> >
> >> And MPP is WARL field.  PRV_U will be an illegal value for MPP if U-mode
> >> is not implemented.
> > Yeah, I think you are right. It just directly goes against the mret
> > section. I suspect the mret section is wrong and needs to be updated
> >
> >> So I think description in section 3.1.6.1 seems more reasonable.
> >>
> >>>> (draft-20230131-c0b298a: Clarify WFI trapping behavior (#972)).
> >>> Also, you replied with a HTML email which loses the conversation
> >>> history (just see above). Can you fixup your client to reply with
> >>> plain text please
> >> Sorry. I don't get your problem. I replied by Thunderbird. Above is the
> > Have a look at your previous email, it's a HTML email. If I view the
> > source of the email I see this:
> >
> >      Content-Type: text/html; charset=UTF-8
> >
> > and the formatting is a little off.
> >
> > This email that I'm replying to is a plain text email. I'm not sure
> > what happened, but try to check that your responses are plain text. I
> > think there is a setting in Thunderbird to just open and reply to all
> > emails as plain text, which is probably worth turning on
> >
> > Alistair
> >
> >> title for the latest release version of the spec in riscv-isa-manual
> >> github
> >> (https://github.com/riscv/riscv-isa-manual/releases/tag/draft-20230131-c0b298a).
> >>
> >> Regards,
> >>
> >> Weiwei Li
> >>
> >>> Alistair
> >>>
> >>>> "MRET then in mstatus/mstatush sets MPV=0, MPP=0,
> >>>> MIE=MPIE, and MPIE=1"
> >>>>
> >>>> In section 3.1.6.1, the privilege spec says this:
> >>>>
> >>>> "An MRET or SRET instruction is used to return from a trap in M-mode or S-mode respectively.
> >>>> When executing an xRET instruction, supposing xPP holds the value y, xIE is set to xPIE; the
> >>>> privilege mode is changed to y; xPIE is set to 1; and xPP is set to the least-privileged supported
> >>>> mode (U if U-mode is implemented, else M). If y̸=M, xRET also sets MPRV=0"
> >>>>
> >>>> And I think PRV_U is an illegal value for MPP if U-mode is not implemented.
> >>>>
> >>>> Regards,
> >>>>
> >>>> Weiwei Li
> >>>>
> >>>> So it should just always be 0 (PRV_U is 0)
> >>>>
> >>>> Alistair
> >>>>
> >>>> Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
> >>>> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
> >>>> ---
> >>>>    target/riscv/op_helper.c | 3 ++-
> >>>>    1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> >>>> index 84ee018f7d..991f06d98d 100644
> >>>> --- a/target/riscv/op_helper.c
> >>>> +++ b/target/riscv/op_helper.c
> >>>> @@ -339,7 +339,8 @@ target_ulong helper_mret(CPURISCVState *env)
> >>>>        mstatus = set_field(mstatus, MSTATUS_MIE,
> >>>>                            get_field(mstatus, MSTATUS_MPIE));
> >>>>        mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
> >>>> -    mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
> >>>> +    mstatus = set_field(mstatus, MSTATUS_MPP,
> >>>> +                        riscv_has_ext(env, RVU) ? PRV_U : PRV_M);
> >>>>        mstatus = set_field(mstatus, MSTATUS_MPV, 0);
> >>>>        if ((env->priv_ver >= PRIV_VERSION_1_12_0) && (prev_priv != PRV_M)) {
> >>>>            mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> >>>> --
> >>>> 2.25.1
> >>>>
> >>>>
>


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

end of thread, other threads:[~2023-04-06  3:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-30 13:58 [PATCH 0/2] target/riscv: Fix mstatus.MPP related support Weiwei Li
2023-03-30 13:58 ` [PATCH 1/2] target/riscv: Fix the mstatus.MPP value after executing MRET Weiwei Li
2023-04-06  0:43   ` Alistair Francis
2023-04-06  0:56     ` liweiwei
2023-04-06  1:46       ` Alistair Francis
2023-04-06  2:14         ` liweiwei
2023-04-06  2:24           ` Alistair Francis
2023-04-06  2:39             ` liweiwei
2023-04-06  3:01             ` liweiwei
2023-04-06  3:55               ` Alistair Francis
2023-03-30 13:58 ` [PATCH 2/2] target/riscv: Legalize MPP value in write_mstatus Weiwei Li
2023-04-06  1:26   ` Alistair Francis
2023-04-06  1:35     ` liweiwei

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).