On Wed, Jul 3, 2019 at 12:07 PM Jonathan Behrens <jonat...@fintelia.io> wrote: > > Signed-off-by: Jonathan Behrens <jonat...@fintelia.io>
>From the text in the spec it sounds like it should be an illegal instruction exception, at least for now (see below). Maybe it's worth mentioning in the commit that WFI in U-Mode is allowed if it completes within some time limit? " When S-mode is implemented, then executing WFI in U-mode causes an illegal instruction excep- tion, unless it completes within an implementation-specific, bounded time limit. A future revision of this specification might add a feature that allows S-mode to selectively permit WFI in U-mode. Such a feature would only be active when TW=0. " Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/op_helper.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c > index 331cc36232..2e5a980192 100644 > --- a/target/riscv/op_helper.c > +++ b/target/riscv/op_helper.c > @@ -129,10 +129,10 @@ target_ulong helper_mret(CPURISCVState *env, > target_ulong cpu_pc_deb) > void helper_wfi(CPURISCVState *env) > { > CPUState *cs = env_cpu(env); > - > - if (env->priv == PRV_S && > - env->priv_ver >= PRIV_VERSION_1_10_0 && > - get_field(env->mstatus, MSTATUS_TW)) { > + if (!(env->priv >= PRV_S) || > + (env->priv == PRV_S && > + env->priv_ver >= PRIV_VERSION_1_10_0 && > + get_field(env->mstatus, MSTATUS_TW))) { > riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC()); > } else { > cs->halted = 1; > -- > 2.22.0 >