sim: Don't quiesce UDelayEvents with 0 latency
authorJoel Hestness <jthestness@gmail.com>
Sat, 10 Oct 2015 21:45:38 +0000 (16:45 -0500)
committerJoel Hestness <jthestness@gmail.com>
Sat, 10 Oct 2015 21:45:38 +0000 (16:45 -0500)
ARM uses UDelayEvents to emulate kernel __*udelay functions and speed up
simulation. UDelayEvents call Pseudoinst::quiesceNs to quiesce the system for
a specified delay. Changeset 10341:0b4d10f53c2d introduced the requirement
that any quiesce process that is started must also be completed by scheduling
an EndQuiesceEvent. This change causes the CPU to hang if an IsQuiesce
instruction is executed, but the corresponding EndQuiesceEvent is not
scheduled.

Changeset 11058:d0934b57735a introduces a fix for uses of PseudoInst::quiesce*
that would conditionally execute the EndQuiesceEvent. ARM UDelayEvents specify
quiesce period of 0 ns (src/arch/arm/linux/system.cc), so changeset 11058
causes these events to now execute full quiesce processes, greatly increasing
the total instructions executed in kernel delay loops and slowing simulation.

This patch updates the UDelayEvent to conditionally execute
PseudoInst::quiesceNs (**a quiesce operation**) only if the specified
delay is >0 ns. The result is ARM delay loops no longer execute instructions
for quiesce handling, and regression time returns to normal.

src/kern/freebsd/events.cc
src/kern/linux/events.cc

index 2f4ceb05607fa97cd52465961a1d6508b2a7b87c..15954d6726928c44429fd5e773d32330ba7d454f 100644 (file)
@@ -65,7 +65,13 @@ UDelayEvent::process(ThreadContext *tc)
 
     SkipFuncEvent::process(tc);
 
-    PseudoInst::quiesceNs(tc, time);
+    // Currently, only ARM full-system simulation uses UDelayEvents to skip
+    // __delay and __loop_delay functions. One form involves setting quiesce
+    // time to 0 with the assumption that quiesce will not happen. To avoid
+    // the quiesce handling in this case, only execute the quiesce if time > 0.
+    if (time > 0) {
+        PseudoInst::quiesceNs(tc, time);
+    }
 }
 
 } // namespace FreeBSD
index c8b53d8480b84b088e6f45250d7cb5717516b4e1..42f058a72aec186586dbbfe9427720157e2da358 100644 (file)
@@ -85,7 +85,13 @@ UDelayEvent::process(ThreadContext *tc)
 
     SkipFuncEvent::process(tc);
 
-    PseudoInst::quiesceNs(tc, time);
+    // Currently, only ARM full-system simulation uses UDelayEvents to skip
+    // __delay and __loop_delay functions. One form involves setting quiesce
+    // time to 0 with the assumption that quiesce will not happen. To avoid
+    // the quiesce handling in this case, only execute the quiesce if time > 0.
+    if (time > 0) {
+        PseudoInst::quiesceNs(tc, time);
+    }
 }