From 31e9db6eb395d487a9f1e3185693a61442f9eaed Mon Sep 17 00:00:00 2001 From: Dolu1990 Date: Wed, 3 Jul 2024 08:59:55 +0200 Subject: [PATCH] Fix #112 mstatus.tw --- src/main/scala/naxriscv/execute/EnvCallPlugin.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/scala/naxriscv/execute/EnvCallPlugin.scala b/src/main/scala/naxriscv/execute/EnvCallPlugin.scala index 97e9ed60..e073cd28 100644 --- a/src/main/scala/naxriscv/execute/EnvCallPlugin.scala +++ b/src/main/scala/naxriscv/execute/EnvCallPlugin.scala @@ -81,7 +81,10 @@ class EnvCallPlugin(val euId : String)(var rescheduleAt : Int = 0) extends Plugi import stage._ import s._ - setup.reschedule.valid := isValid && (EBREAK || ECALL || XRET || FENCE_I || FLUSH_DATA || FENCE_VMA) + setup.reschedule.valid := isValid && ( + EBREAK || ECALL || XRET || FENCE_I || FLUSH_DATA || FENCE_VMA || + WFI && priv.logic.machine.mstatus.tw && !priv.isMachine() + ) setup.reschedule.robId := ROB.ID setup.reschedule.tval := B(PC).andMask(EBREAK) //That's what spike do setup.reschedule.skipCommit := EBREAK || ECALL @@ -109,6 +112,9 @@ class EnvCallPlugin(val euId : String)(var rescheduleAt : Int = 0) extends Plugi trap setWhen(priv.getPrivilege() === 1 && priv.logic.machine.mstatus.tvm) trap setWhen(priv.getPrivilege() === 0) } + if (priv.p.withUser) when(WFI) { + trap := True + } when(trap){ setup.reschedule.cause := CSR.MCAUSE_ENUM.ILLEGAL_INSTRUCTION