target/riscv: Clear mstatus.MPRV when leaving M-mode for priv spec 1.12+
Since priv spec v1.12, MRET and SRET now clear mstatus.MPRV when leaving M-mode. Signed-off-by: Bin Meng <bmeng@tinylab.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20221207090037.281452-2-bmeng@tinylab.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
2bfec53b4c
commit
0ff430a5b1
|
@ -154,6 +154,9 @@ target_ulong helper_sret(CPURISCVState *env)
|
||||||
get_field(mstatus, MSTATUS_SPIE));
|
get_field(mstatus, MSTATUS_SPIE));
|
||||||
mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
|
mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
|
||||||
mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
|
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;
|
env->mstatus = mstatus;
|
||||||
|
|
||||||
if (riscv_has_ext(env, RVH) && !riscv_cpu_virt_enabled(env)) {
|
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_MPIE, 1);
|
||||||
mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
|
mstatus = set_field(mstatus, MSTATUS_MPP, PRV_U);
|
||||||
mstatus = set_field(mstatus, MSTATUS_MPV, 0);
|
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;
|
env->mstatus = mstatus;
|
||||||
riscv_cpu_set_mode(env, prev_priv);
|
riscv_cpu_set_mode(env, prev_priv);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue