Eliminate infinite loop in debug mode
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Jul 2013 01:42:27 +0000 (18:42 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Jul 2013 01:42:27 +0000 (18:42 -0700)
riscv/htif.cc
riscv/sim.cc
riscv/sim.h

index 0512b6f3be3072d4bc9e6166fb5f8e9c0049dccc..fc903751a0cb86eac075d78b4d74e871a0dd3ea3 100644 (file)
@@ -106,8 +106,5 @@ bool htif_isasim_t::done()
 {
   if (reset)
     return false;
-  for (size_t i = 0; i < sim->num_cores(); i++)
-    if (sim->procs[i]->running())
-      return false;
-  return true;
+  return !sim->running();
 }
index 2044235e68a85e499ad655723b6c32becd84c2ee..8fafa511069a868db2016aab5f81ad8c42f1c940 100644 (file)
@@ -90,6 +90,8 @@ void sim_t::step(size_t n, bool noisy)
   for (size_t i = 0, steps = 0; i < n; i += steps)
   {
     htif->tick();
+    if (!running())
+      break;
 
     steps = std::min(n - i, INTERLEAVE - current_step);
     procs[current_proc]->step(steps, noisy);
@@ -105,6 +107,14 @@ void sim_t::step(size_t n, bool noisy)
   }
 }
 
+bool sim_t::running()
+{
+  for (size_t i = 0; i < procs.size(); i++)
+    if (procs[i]->running())
+      return true;
+  return false;
+}
+
 void sim_t::stop()
 {
   procs[0]->tohost = 1;
index b1e0206c8b58ec46aa8ef9e17f0de335ef478107..2bc69f0d76b53f73dc15752eca92814fc5ea94bb 100644 (file)
@@ -20,6 +20,7 @@ public:
 
   // run the simulation to completion
   void run();
+  bool running();
   void stop();
   void set_debug(bool value) { debug = value; }