make HTIF interactions deterministic; fix race
authorAndrew Waterman <waterman@cs.berkeley.edu>
Wed, 13 Feb 2013 06:59:14 +0000 (22:59 -0800)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Wed, 13 Feb 2013 06:59:14 +0000 (22:59 -0800)
riscv/htif.cc
riscv/htif.h
riscv/sim.cc

index c7ba8fca8a7a767314fc792915ab2cf4a9e87e70..64ef40a1fc5720ff864542db543e16143710ddbf 100644 (file)
@@ -1,5 +1,4 @@
 #include "htif.h"
-#include "common.h"
 #include "sim.h"
 #include <unistd.h>
 #include <stdexcept>
@@ -84,8 +83,9 @@ void htif_isasim_t::tick_once()
         memcpy(&val, p.get_payload(), sizeof(val));
         if (regno == PCR_RESET)
         {
-          reset = val & 1;
-          sim->procs[coreid]->reset(reset);
+          if (reset && !(val & 1))
+            reset = false;
+          sim->procs[coreid]->reset(val & 1);
         }
         else
         {
@@ -100,8 +100,12 @@ void htif_isasim_t::tick_once()
   seqno++;
 }
 
-void htif_isasim_t::stop()
+bool htif_isasim_t::done()
 {
-  htif_t::stop();
-  exit(exit_code());
+  if (reset)
+    return false;
+  for (size_t i = 0; i < sim->num_cores(); i++)
+    if (sim->procs[i]->running())
+      return false;
+  return true;
 }
index 0d8d1b7087d2cab688693ae4135761601a57316b..034743a833847351996948ffa6e517db9ae25bb3 100644 (file)
@@ -16,7 +16,7 @@ class htif_isasim_t : public htif_pthread_t
 public:
   htif_isasim_t(sim_t* _sim, const std::vector<std::string>& args);
   void tick();
-  void stop();
+  bool done();
 
 private:
   sim_t* sim;
index 31c91ae228cb390516c14893842e849362c49846..6d98d8e122e8b776f4e6f58865f7229a91ef34eb 100644 (file)
@@ -49,7 +49,6 @@ sim_t::~sim_t()
     delete procs[i];
     delete pmmu;
   }
-  delete htif;
   delete mmu;
   munmap(mem, memsz);
 }
@@ -72,10 +71,10 @@ reg_t sim_t::get_scr(int which)
 
 void sim_t::run(bool debug)
 {
-  while (1)
+  while (!htif->done())
   {
     if(!debug)
-      step_all(1000, 1000, false);
+      step_all(10000, 1000, false);
     else
       interactive();
   }