Re: [PATCH 2/2] target/riscv: Clear mstatus.MPRV when leaving M-mode for priv spec 1.12+

2022-12-07 Thread Alistair Francis
On Wed, Dec 7, 2022 at 7:11 PM Bin Meng  wrote:
>
> Since priv spec v1.12, MRET and SRET now clear mstatus.MPRV when
> leaving M-mode.
>
> Signed-off-by: Bin Meng 

Thanks!

Applied to riscv-to-apply.next

Alistair

>
> ---
>
>  target/riscv/op_helper.c | 6 ++
>  1 file changed, 6 insertions(+)
>
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index a047d38152..878bcb03b8 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -154,6 +154,9 @@ target_ulong helper_sret(CPURISCVState *env)
>  get_field(mstatus, MSTATUS_SPIE));
>  mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
>  mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
> +if (env->priv_ver >= PRIV_VERSION_1_12_0) {
> +mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> +}
>  env->mstatus = mstatus;
>
>  if (riscv_has_ext(env, RVH) && !riscv_cpu_virt_enabled(env)) {
> @@ -203,6 +206,9 @@ target_ulong helper_mret(CPURISCVState *env)
>  mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>  mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>  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);
> +}
>  env->mstatus = mstatus;
>  riscv_cpu_set_mode(env, prev_priv);
>
> --
> 2.34.1
>
>



Re: [PATCH 2/2] target/riscv: Clear mstatus.MPRV when leaving M-mode for priv spec 1.12+

2022-12-07 Thread Alistair Francis
On Wed, Dec 7, 2022 at 7:11 PM Bin Meng  wrote:
>
> Since priv spec v1.12, MRET and SRET now clear mstatus.MPRV when
> leaving M-mode.
>
> Signed-off-by: Bin Meng 

Reviewed-by: Alistair Francis 

Alistair

>
> ---
>
>  target/riscv/op_helper.c | 6 ++
>  1 file changed, 6 insertions(+)
>
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index a047d38152..878bcb03b8 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -154,6 +154,9 @@ target_ulong helper_sret(CPURISCVState *env)
>  get_field(mstatus, MSTATUS_SPIE));
>  mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
>  mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
> +if (env->priv_ver >= PRIV_VERSION_1_12_0) {
> +mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
> +}
>  env->mstatus = mstatus;
>
>  if (riscv_has_ext(env, RVH) && !riscv_cpu_virt_enabled(env)) {
> @@ -203,6 +206,9 @@ target_ulong helper_mret(CPURISCVState *env)
>  mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
>  mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
>  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);
> +}
>  env->mstatus = mstatus;
>  riscv_cpu_set_mode(env, prev_priv);
>
> --
> 2.34.1
>
>



[PATCH 2/2] target/riscv: Clear mstatus.MPRV when leaving M-mode for priv spec 1.12+

2022-12-07 Thread Bin Meng
Since priv spec v1.12, MRET and SRET now clear mstatus.MPRV when
leaving M-mode.

Signed-off-by: Bin Meng 

---

 target/riscv/op_helper.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
index a047d38152..878bcb03b8 100644
--- a/target/riscv/op_helper.c
+++ b/target/riscv/op_helper.c
@@ -154,6 +154,9 @@ target_ulong helper_sret(CPURISCVState *env)
 get_field(mstatus, MSTATUS_SPIE));
 mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
 mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
+if (env->priv_ver >= PRIV_VERSION_1_12_0) {
+mstatus = set_field(mstatus, MSTATUS_MPRV, 0);
+}
 env->mstatus = mstatus;
 
 if (riscv_has_ext(env, RVH) && !riscv_cpu_virt_enabled(env)) {
@@ -203,6 +206,9 @@ target_ulong helper_mret(CPURISCVState *env)
 mstatus = set_field(mstatus, MSTATUS_MPIE, 1);
 mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
 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);
+}
 env->mstatus = mstatus;
 riscv_cpu_set_mode(env, prev_priv);
 
-- 
2.34.1