Add writable ibuf and data registers.
authorTim Newsome <tim@sifive.com>
Thu, 9 Feb 2017 04:40:52 +0000 (20:40 -0800)
committerTim Newsome <tim@sifive.com>
Thu, 9 Feb 2017 04:40:52 +0000 (20:40 -0800)
riscv/debug_module.cc
riscv/debug_module.h

index af4746bd8604a06484cb961e16c4f56cb847988c..e5811be4eb0209c601dda13255fc7c13cb53dfb8 100644 (file)
@@ -14,7 +14,8 @@
 
 debug_module_t::debug_module_t() :
   dmcontrol(1 << DMI_DMCONTROL_VERSION_OFFSET |
-      1 << DMI_DMCONTROL_AUTHENTICATED_OFFSET)
+      1 << DMI_DMCONTROL_AUTHENTICATED_OFFSET),
+  abstractcs(datacount << DMI_ABSTRACTCS_DATACOUNT_OFFSET)
 {
 }
 
@@ -89,13 +90,25 @@ uint32_t debug_module_t::ram_read32(unsigned int index)
 bool debug_module_t::dmi_read(unsigned address, uint32_t *value)
 {
   D(fprintf(stderr, "dmi_read(0x%x) -> ", address));
-  switch (address) {
-    case DMI_DMCONTROL:
-      *value = dmcontrol;
-      break;
-    default:
-      D(fprintf(stderr, "error\n"));
-      return false;
+  if (address >= DMI_DATA0 && address < DMI_DATA0 + datacount) {
+    *value = data[address - DMI_DATA0];
+  } else if (address >= DMI_IBUF0 && address < DMI_IBUF0 + progsize) {
+    *value = ibuf[address - DMI_IBUF0];
+  } else {
+    switch (address) {
+      case DMI_DMCONTROL:
+        *value = dmcontrol;
+        break;
+      case DMI_ABSTRACTCS:
+        *value = abstractcs;
+        break;
+      case DMI_ACCESSCS:
+        *value = progsize << DMI_ACCESSCS_PROGSIZE_OFFSET;
+        break;
+      default:
+        D(fprintf(stderr, "error\n"));
+        return false;
+    }
   }
   D(fprintf(stderr, "0x%x\n", *value));
   return true;
@@ -104,5 +117,12 @@ bool debug_module_t::dmi_read(unsigned address, uint32_t *value)
 bool debug_module_t::dmi_write(unsigned address, uint32_t value)
 {
   D(fprintf(stderr, "dmi_write(0x%x, 0x%x)\n", address, value));
+  if (address >= DMI_DATA0 && address < DMI_DATA0 + datacount) {
+    data[address - DMI_DATA0] = value;
+    return true;
+  } else if (address >= DMI_IBUF0 && address < DMI_IBUF0 + progsize) {
+    ibuf[address - DMI_IBUF0] = value;
+    return true;
+  }
   return false;
 }
index d0fd2e15acd58855d15f5564bc0ab55d5705b9c3..d322376773a3b3724412cfdec1be7d5cacdc619e 100644 (file)
@@ -50,7 +50,13 @@ class debug_module_t : public abstract_device_t
     std::set<uint32_t> halt_notification;
     char debug_ram[DEBUG_RAM_SIZE];
 
+    static const unsigned datacount = 8;
+    static const unsigned progsize = 8;
+
     uint32_t dmcontrol;
+    uint32_t abstractcs;
+    uint32_t data[datacount];
+    uint32_t ibuf[progsize];
 };
 
 #endif