[sim] add while to interactive_until
authorYunsup Lee <yunsup@cs.berkeley.edu>
Wed, 8 Sep 2010 22:58:39 +0000 (15:58 -0700)
committerYunsup Lee <yunsup@cs.berkeley.edu>
Wed, 8 Sep 2010 22:58:39 +0000 (15:58 -0700)
riscv/insns/mfpcr.h
riscv/insns/mtpcr.h
riscv/processor.cc
riscv/processor.h
riscv/sim.cc
riscv/sim.h

index d9bfc223f20d1a0de02c02d3ac7b559dde8f94d8..94ce2b2a86debfaee3a29f37bdadb3d96b5e0963 100644 (file)
@@ -22,7 +22,7 @@ switch(insn.rtype.rb)
     break;
 
   case 17:
-    val = sim->get_fromhost();
+    fromhost = val = sim->get_fromhost();
     break;
 
   case 24:
index cbb580b52d152bc969aa299eeb9aca46f531680b..5c7289eb7097f4366240278425ac872247d9a9aa 100644 (file)
@@ -15,7 +15,8 @@ switch(insn.rtype.rb)
     break;
 
   case 16:
-    sim->set_tohost(val);
+    tohost = val;
+    sim->set_tohost(tohost);
     break;
 
   case 24:
index fb32f96dc56a89cf8882a53007ad9dff0a3662d1..e336aa1990113b736aa0c10055dfdedc1a9e5596 100644 (file)
@@ -21,6 +21,8 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
   tid = 0;
   pcr_k0 = 0;
   pcr_k1 = 0;
+  tohost = 0;
+  fromhost = 0;
   set_sr(SR_S | (support_64bit ? SR_KX : 0));
   set_fsr(0);
 
index 26e49f39e3c150a98da4bad8c1be5e433ec10cb3..4a1a41da2350228e6c39d0c838450eb0392c8143 100644 (file)
@@ -27,6 +27,8 @@ private:
   reg_t epc;
   reg_t badvaddr;
   reg_t ebase;
+  reg_t tohost;
+  reg_t fromhost;
   reg_t pcr_k0;
   reg_t pcr_k1;
   uint32_t id;
index 2bc1775cb7fb2a7b185d8995734b4c1aca49b43b..ca10e0942ac31d9ae33cf117f6fb901df0367394 100644 (file)
@@ -53,7 +53,7 @@ void sim_t::run(bool debug)
       char* p = strtok(s," ");
       if(!p)
       {
-        interactive_run_noisy(std::vector<std::string>(1,"1"));
+        interactive_run_noisy(std::string("r"), std::vector<std::string>(1,"1"));
         continue;
       }
       std::string cmd = p;
@@ -63,7 +63,7 @@ void sim_t::run(bool debug)
         args.push_back(p);
 
 
-      typedef void (sim_t::*interactive_func)(const std::vector<std::string>&);
+      typedef void (sim_t::*interactive_func)(const std::string&, const std::vector<std::string>&);
       std::map<std::string,interactive_func> funcs;
 
       funcs["r"] = &sim_t::interactive_run_noisy;
@@ -75,12 +75,13 @@ void sim_t::run(bool debug)
       funcs["fregd"] = &sim_t::interactive_fregd;
       funcs["mem"] = &sim_t::interactive_mem;
       funcs["until"] = &sim_t::interactive_until;
+      funcs["while"] = &sim_t::interactive_until;
       funcs["q"] = &sim_t::interactive_quit;
 
       try
       {
         if(funcs.count(cmd))
-          (this->*funcs[cmd])(args);
+          (this->*funcs[cmd])(cmd, args);
       }
       catch(trap_t t) {}
     }
@@ -94,17 +95,17 @@ void sim_t::step_all(size_t n, size_t interleave, bool noisy)
       procs[i].step(interleave,noisy);
 }
 
-void sim_t::interactive_run_noisy(const std::vector<std::string>& args)
+void sim_t::interactive_run_noisy(const std::string& cmd, const std::vector<std::string>& args)
 {
-  interactive_run(args,true);
+  interactive_run(cmd,args,true);
 }
 
-void sim_t::interactive_run_silent(const std::vector<std::string>& args)
+void sim_t::interactive_run_silent(const std::string& cmd, const std::vector<std::string>& args)
 {
-  interactive_run(args,false);
+  interactive_run(cmd,args,false);
 }
 
-void sim_t::interactive_run(const std::vector<std::string>& args, bool noisy)
+void sim_t::interactive_run(const std::string& cmd, const std::vector<std::string>& args, bool noisy)
 {
   if(args.size())
     step_all(atoi(args[0].c_str()),1,noisy);
@@ -112,17 +113,17 @@ void sim_t::interactive_run(const std::vector<std::string>& args, bool noisy)
     while(1) step_all(1,1,noisy);
 }
 
-void sim_t::interactive_run_proc_noisy(const std::vector<std::string>& args)
+void sim_t::interactive_run_proc_noisy(const std::string& cmd, const std::vector<std::string>& args)
 {
-  interactive_run_proc(args,true);
+  interactive_run_proc(cmd,args,true);
 }
 
-void sim_t::interactive_run_proc_silent(const std::vector<std::string>& args)
+void sim_t::interactive_run_proc_silent(const std::string& cmd, const std::vector<std::string>& args)
 {
-  interactive_run_proc(args,false);
+  interactive_run_proc(cmd,args,false);
 }
 
-void sim_t::interactive_run_proc(const std::vector<std::string>& a, bool noisy)
+void sim_t::interactive_run_proc(const std::string& cmd, const std::vector<std::string>& a, bool noisy)
 {
   if(a.size() == 0)
     return;
@@ -137,7 +138,7 @@ void sim_t::interactive_run_proc(const std::vector<std::string>& a, bool noisy)
     while(1) procs[p].step(1,noisy);
 }
 
-void sim_t::interactive_quit(const std::vector<std::string>& args)
+void sim_t::interactive_quit(const std::string& cmd, const std::vector<std::string>& args)
 {
   exit(0);
 }
@@ -180,7 +181,19 @@ reg_t sim_t::get_freg(const std::vector<std::string>& args)
   return procs[p].FR[r];
 }
 
-void sim_t::interactive_reg(const std::vector<std::string>& args)
+reg_t sim_t::get_tohost(const std::vector<std::string>& args)
+{
+  if(args.size() != 1)
+    throw trap_illegal_instruction;
+
+  int p = atoi(args[0].c_str());
+  if(p >= (int)procs.size())
+    throw trap_illegal_instruction;
+
+  return procs[p].tohost;
+}
+
+void sim_t::interactive_reg(const std::string& cmd, const std::vector<std::string>& args)
 {
   printf("0x%016llx\n",(unsigned long long)get_reg(args));
 }
@@ -192,14 +205,14 @@ union fpr
   double d;
 };
 
-void sim_t::interactive_fregs(const std::vector<std::string>& args)
+void sim_t::interactive_fregs(const std::string& cmd, const std::vector<std::string>& args)
 {
   fpr f;
   f.r = get_freg(args);
   printf("%g\n",f.s);
 }
 
-void sim_t::interactive_fregd(const std::vector<std::string>& args)
+void sim_t::interactive_fregd(const std::string& cmd, const std::vector<std::string>& args)
 {
   fpr f;
   f.r = get_freg(args);
@@ -232,17 +245,17 @@ reg_t sim_t::get_mem(const std::vector<std::string>& args)
   return val;
 }
 
-void sim_t::interactive_mem(const std::vector<std::string>& args)
+void sim_t::interactive_mem(const std::string& cmd, const std::vector<std::string>& args)
 {
   printf("0x%016llx\n",(unsigned long long)get_mem(args));
 }
 
-void sim_t::interactive_until(const std::vector<std::string>& args)
+void sim_t::interactive_until(const std::string& cmd, const std::vector<std::string>& args)
 {
   if(args.size() < 3)
     return;
 
-  std::string cmd = args[0];
+  std::string scmd = args[0];
   reg_t val = strtol(args[args.size()-1].c_str(),NULL,16);
   
   std::vector<std::string> args2;
@@ -251,16 +264,20 @@ void sim_t::interactive_until(const std::vector<std::string>& args)
   while(1)
   {
     reg_t current;
-    if(args[0] == "reg")
+    if(scmd == "reg")
       current = get_reg(args2);
-    else if(args[0] == "pc")
+    else if(scmd == "pc")
       current = get_pc(args2);
-    else if(args[0] == "mem")
+    else if(scmd == "mem")
       current = get_mem(args2);
+    else if(scmd == "tohost")
+      current = get_tohost(args2);
     else
       return;
 
-    if(current == val)
+    if(cmd == "until" && current == val)
+      break;
+    if(cmd == "while" && current != val)
       break;
 
     step_all(1,1,false);
index 4072fcf3b12651a5f6e97347a0f82fd3134fb8ad..47637136a91926cdd567edba353e040e8c73563d 100644 (file)
@@ -32,26 +32,27 @@ private:
 
   void step_all(size_t n, size_t interleave, bool noisy);
 
-  void interactive_quit(const std::vector<std::string>& args);
+  void interactive_quit(const std::string& cmd, const std::vector<std::string>& args);
 
-  void interactive_run(const std::vector<std::string>& args, bool noisy);
-  void interactive_run_noisy(const std::vector<std::string>& args);
-  void interactive_run_silent(const std::vector<std::string>& args);
+  void interactive_run(const std::string& cmd, const std::vector<std::string>& args, bool noisy);
+  void interactive_run_noisy(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_run_silent(const std::string& cmd, const std::vector<std::string>& args);
 
-  void interactive_run_proc(const std::vector<std::string>& args, bool noisy);
-  void interactive_run_proc_noisy(const std::vector<std::string>& args);
-  void interactive_run_proc_silent(const std::vector<std::string>& args);
+  void interactive_run_proc(const std::string& cmd, const std::vector<std::string>& args, bool noisy);
+  void interactive_run_proc_noisy(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_run_proc_silent(const std::string& cmd, const std::vector<std::string>& args);
 
-  void interactive_reg(const std::vector<std::string>& args);
-  void interactive_fregs(const std::vector<std::string>& args);
-  void interactive_fregd(const std::vector<std::string>& args);
-  void interactive_mem(const std::vector<std::string>& args);
-  void interactive_until(const std::vector<std::string>& args);
+  void interactive_reg(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_fregs(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_fregd(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_mem(const std::string& cmd, const std::vector<std::string>& args);
+  void interactive_until(const std::string& cmd, const std::vector<std::string>& args);
 
   reg_t get_reg(const std::vector<std::string>& args);
   reg_t get_freg(const std::vector<std::string>& args);
   reg_t get_mem(const std::vector<std::string>& args);
   reg_t get_pc(const std::vector<std::string>& args);
+  reg_t get_tohost(const std::vector<std::string>& args);
 
   friend class appserver_link_t;
 };