Implement hartstatus field.
authorTim Newsome <tim@sifive.com>
Fri, 10 Feb 2017 19:31:30 +0000 (11:31 -0800)
committerTim Newsome <tim@sifive.com>
Fri, 10 Feb 2017 19:31:30 +0000 (11:31 -0800)
riscv/debug_module.cc
riscv/debug_module.h
riscv/processor.h
riscv/sim.cc

index e5811be4eb0209c601dda13255fc7c13cb53dfb8..ba30603b5c2fc69df99e33863e5471dfb343e187 100644 (file)
@@ -12,7 +12,8 @@
 #  define D(x)
 #endif
 
-debug_module_t::debug_module_t() :
+debug_module_t::debug_module_t(sim_t *sim) :
+  sim(sim),
   dmcontrol(1 << DMI_DMCONTROL_VERSION_OFFSET |
       1 << DMI_DMCONTROL_AUTHENTICATED_OFFSET),
   abstractcs(datacount << DMI_ABSTRACTCS_DATACOUNT_OFFSET)
@@ -97,7 +98,21 @@ bool debug_module_t::dmi_read(unsigned address, uint32_t *value)
   } else {
     switch (address) {
       case DMI_DMCONTROL:
-        *value = dmcontrol;
+        {
+          processor_t *proc = sim->get_core(get_field(dmcontrol,
+                DMI_DMCONTROL_HARTSEL));
+          if (proc) {
+            D(fprintf(stderr, "(halted=%d) ", proc->halted()));
+            if (proc->halted()) {
+              dmcontrol = set_field(dmcontrol, DMI_DMCONTROL_HARTSTATUS, 0);
+            } else {
+              dmcontrol = set_field(dmcontrol, DMI_DMCONTROL_HARTSTATUS, 1);
+            }
+          } else {
+            dmcontrol = set_field(dmcontrol, DMI_DMCONTROL_HARTSTATUS, 3);
+          }
+          *value = dmcontrol;
+        }
         break;
       case DMI_ABSTRACTCS:
         *value = abstractcs;
index d322376773a3b3724412cfdec1be7d5cacdc619e..b64a454b0ecfb5a9345aaec6da23e846b6e55a84 100644 (file)
@@ -6,10 +6,12 @@
 
 #include "devices.h"
 
+class sim_t;
+
 class debug_module_t : public abstract_device_t
 {
   public:
-    debug_module_t();
+    debug_module_t(sim_t *sim);
 
     bool load(reg_t addr, size_t len, uint8_t* bytes);
     bool store(reg_t addr, size_t len, const uint8_t* bytes);
@@ -44,6 +46,7 @@ class debug_module_t : public abstract_device_t
     bool dmi_write(unsigned address, uint32_t value);
 
   private:
+    sim_t *sim;
     // Track which interrupts from module to debugger are set.
     std::set<uint32_t> interrupt;
     // Track which halt notifications from debugger to module are set.
index 8a9ff47fdfdc6f02312f3328ae5710fc5dbcd7e3..32dc9cd2443a709ba0bb3e60db3afaa07d2d5456 100644 (file)
@@ -192,6 +192,7 @@ public:
   bool debug;
   // When true, take the slow simulation path.
   bool slow_path();
+  bool halted() { return state.dcsr.cause ? true : false; }
 
   // Return the index of a trigger that matched, or -1.
   inline int trigger_match(trigger_operation_t operation, reg_t address, reg_t data)
index 86e23b0908650b7ac45caf6a336cc3fc000bf369..461ae6ac211fb2d4e9420b91da4899e53613b5cf 100644 (file)
@@ -22,7 +22,7 @@ static void handle_signal(int sig)
 
 sim_t::sim_t(const char* isa, size_t nprocs, size_t mem_mb, bool halted,
              const std::vector<std::string>& args)
-  : htif_t(args), procs(std::max(nprocs, size_t(1))),
+  : htif_t(args), debug_module(this), procs(std::max(nprocs, size_t(1))),
     current_step(0), current_proc(0), debug(false), remote_bitbang(NULL)
 {
   signal(SIGINT, &handle_signal);