Message ID | 20201013151054.396481-1-georg.kotheimer@kernkonzept.com |
---|---|
State | Accepted |
Commit | ace544532c4064e995ef69ec9dc93aad62e19988 |
Headers | show |
Series | target/riscv: Fix update of hstatus.SPVP | expand |
On Tue, Oct 13, 2020 at 8:11 AM Georg Kotheimer <georg.kotheimer@kernkonzept.com> wrote: > > When trapping from virt into HS mode, hstatus.SPVP was set to > the value of sstatus.SPP, as according to the specification both > flags should be set to the same value. > However, the assignment of SPVP takes place before SPP itself is > updated, which results in SPVP having an outdated value. > > Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Thanks! Applied to riscv-to-apply.next Alistair > --- > target/riscv/cpu_helper.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c > index 904899054d..1d7d10377d 100644 > --- a/target/riscv/cpu_helper.c > +++ b/target/riscv/cpu_helper.c > @@ -932,7 +932,7 @@ void riscv_cpu_do_interrupt(CPUState *cs) > /* Trap into HS mode, from virt */ > riscv_cpu_swap_hypervisor_regs(env); > env->hstatus = set_field(env->hstatus, HSTATUS_SPVP, > - get_field(env->mstatus, SSTATUS_SPP)); > + env->priv); > env->hstatus = set_field(env->hstatus, HSTATUS_SPV, > riscv_cpu_virt_enabled(env)); > > -- > 2.25.1 > >
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 904899054d..1d7d10377d 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -932,7 +932,7 @@ void riscv_cpu_do_interrupt(CPUState *cs) /* Trap into HS mode, from virt */ riscv_cpu_swap_hypervisor_regs(env); env->hstatus = set_field(env->hstatus, HSTATUS_SPVP, - get_field(env->mstatus, SSTATUS_SPP)); + env->priv); env->hstatus = set_field(env->hstatus, HSTATUS_SPV, riscv_cpu_virt_enabled(env));
When trapping from virt into HS mode, hstatus.SPVP was set to the value of sstatus.SPP, as according to the specification both flags should be set to the same value. However, the assignment of SPVP takes place before SPP itself is updated, which results in SPVP having an outdated value. Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com> --- target/riscv/cpu_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)