From 5abd6d4e650b9eeb6dbf58baaa4b19a42dbaf348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 14 Sep 2020 17:50:42 +0200 Subject: [PATCH] Ensure to advance cycles when waiting for interrupt to avoid stalling when mtimecmp is based on cycles. --- src/main/java/li/cil/circuity/vm/riscv/R5CPU.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/li/cil/circuity/vm/riscv/R5CPU.java b/src/main/java/li/cil/circuity/vm/riscv/R5CPU.java index b8469e71..d5694c64 100644 --- a/src/main/java/li/cil/circuity/vm/riscv/R5CPU.java +++ b/src/main/java/li/cil/circuity/vm/riscv/R5CPU.java @@ -199,6 +199,11 @@ public class R5CPU implements Steppable, RealTimeCounter, InterruptController { } public void step(final int cycles) { + if (waitingForInterrupt) { + mcycle += cycles; + return; + } + final long cycleLimit = mcycle + cycles; while (!waitingForInterrupt && mcycle < cycleLimit) { final int pending = mip.get() & mie; @@ -232,6 +237,10 @@ public class R5CPU implements Steppable, RealTimeCounter, InterruptController { raiseException(e.getExceptionCause(), e.getExceptionValue()); } } + + if (waitingForInterrupt && mcycle < cycleLimit) { + mcycle = cycleLimit; + } } private void interpret() throws R5Exception, MemoryAccessException {