target/riscv: Simplify helper_sret() a little bit
There are 2 paths in helper_sret() and the same mstatus update codes are replicated. Extract the common parts to simplify it a little bit. Signed-off-by: Bin Meng <bmeng@tinylab.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20221207090037.281452-1-bmeng@tinylab.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
ec2918b467
commit
2bfec53b4c
|
@ -149,21 +149,21 @@ target_ulong helper_sret(CPURISCVState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
mstatus = env->mstatus;
|
mstatus = env->mstatus;
|
||||||
|
prev_priv = get_field(mstatus, MSTATUS_SPP);
|
||||||
|
mstatus = set_field(mstatus, MSTATUS_SIE,
|
||||||
|
get_field(mstatus, MSTATUS_SPIE));
|
||||||
|
mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
|
||||||
|
mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
|
||||||
|
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)) {
|
||||||
/* We support Hypervisor extensions and virtulisation is disabled */
|
/* We support Hypervisor extensions and virtulisation is disabled */
|
||||||
target_ulong hstatus = env->hstatus;
|
target_ulong hstatus = env->hstatus;
|
||||||
|
|
||||||
prev_priv = get_field(mstatus, MSTATUS_SPP);
|
|
||||||
prev_virt = get_field(hstatus, HSTATUS_SPV);
|
prev_virt = get_field(hstatus, HSTATUS_SPV);
|
||||||
|
|
||||||
hstatus = set_field(hstatus, HSTATUS_SPV, 0);
|
hstatus = set_field(hstatus, HSTATUS_SPV, 0);
|
||||||
mstatus = set_field(mstatus, MSTATUS_SPP, 0);
|
|
||||||
mstatus = set_field(mstatus, SSTATUS_SIE,
|
|
||||||
get_field(mstatus, SSTATUS_SPIE));
|
|
||||||
mstatus = set_field(mstatus, SSTATUS_SPIE, 1);
|
|
||||||
|
|
||||||
env->mstatus = mstatus;
|
|
||||||
env->hstatus = hstatus;
|
env->hstatus = hstatus;
|
||||||
|
|
||||||
if (prev_virt) {
|
if (prev_virt) {
|
||||||
|
@ -171,14 +171,6 @@ target_ulong helper_sret(CPURISCVState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
riscv_cpu_set_virt_enabled(env, prev_virt);
|
riscv_cpu_set_virt_enabled(env, prev_virt);
|
||||||
} else {
|
|
||||||
prev_priv = get_field(mstatus, MSTATUS_SPP);
|
|
||||||
|
|
||||||
mstatus = set_field(mstatus, MSTATUS_SIE,
|
|
||||||
get_field(mstatus, MSTATUS_SPIE));
|
|
||||||
mstatus = set_field(mstatus, MSTATUS_SPIE, 1);
|
|
||||||
mstatus = set_field(mstatus, MSTATUS_SPP, PRV_U);
|
|
||||||
env->mstatus = mstatus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
riscv_cpu_set_mode(env, prev_priv);
|
riscv_cpu_set_mode(env, prev_priv);
|
||||||
|
|
Loading…
Reference in New Issue