Fix Scott's deadlock
authorAndrew Waterman <waterman@cs.berkeley.edu>
Mon, 23 Sep 2013 22:47:50 +0000 (15:47 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Mon, 23 Sep 2013 22:48:04 +0000 (15:48 -0700)
Not Scott's fault, I mean

riscv/htif.cc
riscv/htif.h
riscv/sim.cc

index 679ef93f91d50f1d391917194b134fd69813dc52..d7b9f6333d8aa85a4fd662462617641d03d2271a 100644 (file)
@@ -15,9 +15,14 @@ htif_isasim_t::htif_isasim_t(sim_t* _sim, const std::vector<std::string>& args)
 {
 }
 
-void htif_isasim_t::tick()
+bool htif_isasim_t::tick()
 {
+  if (done())
+    return false;
+
   do tick_once(); while (reset);
+
+  return true;
 }
 
 void htif_isasim_t::tick_once()
index 3e4a88dc6a1ca1af495221ea075c4169bcff2887..2a940ade707947d25af27a0be9146bca11741b0b 100644 (file)
@@ -17,8 +17,7 @@ class htif_isasim_t : public htif_pthread_t
 {
 public:
   htif_isasim_t(sim_t* _sim, const std::vector<std::string>& args);
-  void tick();
-  bool done();
+  bool tick();
 
 private:
   sim_t* sim;
@@ -26,6 +25,7 @@ private:
   uint8_t seqno;
 
   void tick_once();
+  bool done();
 };
 
 #endif
index 864ec09c4694fb2e51c1d4960f647ccd8c3e2b30..a4a1c172498e1d7bd279bf803c9664582b137c39 100644 (file)
@@ -74,9 +74,8 @@ reg_t sim_t::get_scr(int which)
 
 void sim_t::run()
 {
-  while (!htif->done())
+  while (htif->tick())
   {
-    htif->tick();
     if (debug || ctrlc_pressed)
       interactive();
     else
@@ -115,6 +114,6 @@ bool sim_t::running()
 void sim_t::stop()
 {
   procs[0]->state.tohost = 1;
-  while (!htif->done())
-    htif->tick();
+  while (htif->tick())
+    ;
 }