Add dummy custom debug registers, to test OpenOCD. (#233)
authorTim Newsome <tim@sifive.com>
Fri, 24 Aug 2018 03:36:41 +0000 (20:36 -0700)
committerAndrew Waterman <aswaterman@gmail.com>
Fri, 24 Aug 2018 03:36:41 +0000 (20:36 -0700)
riscv/debug_module.cc
riscv/debug_module.h

index f271d74453946d79ddd1830d330aa114f27403c6..b209347a2704fbb738f63c16b3e31cf69793d3d8 100644 (file)
@@ -25,6 +25,7 @@ debug_module_t::debug_module_t(sim_t *sim, unsigned progbufsize, unsigned max_bu
   require_authentication(require_authentication),
   debug_progbuf_start(debug_data_start - program_buffer_bytes),
   debug_abstract_start(debug_progbuf_start - debug_abstract_size*4),
+  custom_base(0),
   sim(sim)
 {
   D(fprintf(stderr, "debug_data_start=0x%x\n", debug_data_start));
@@ -599,6 +600,20 @@ bool debug_module_t::perform_abstract_command()
           }
         }
 
+      } else if (regno >= 0xc000 && (regno & 1) == 1) {
+        // Support odd-numbered custom registers, to allow for debugger testing.
+        unsigned custom_number = regno - 0xc000;
+        abstractcs.cmderr = CMDERR_NONE;
+        if (write) {
+          // Writing V to custom register N will cause future reads of N to
+          // return V, reads of N-1 will return V-1, etc.
+          custom_base = read32(dmdata, 0) - custom_number;
+        } else {
+          write32(dmdata, 0, custom_number + custom_base);
+          write32(dmdata, 1, 0);
+        }
+        return true;
+
       } else {
         abstractcs.cmderr = CMDERR_NOTSUP;
         return true;
index 3aa3f0f7d724c8afa7b4c467cb7f4496a8914d0f..5b43ed628c52b5cb4745b9872cdebbb91885c318 100644 (file)
@@ -115,6 +115,9 @@ class debug_module_t : public abstract_device_t
 
     static const unsigned debug_abstract_size = 5;
     unsigned debug_abstract_start;
+    // R/W this through custom registers, to allow debuggers to test that
+    // functionality.
+    unsigned custom_base;
 
     // We only support 1024 harts currently. More requires at least resizing
     // the arrays below, and their corresponding special memory regions.