added support for register convention names in debug mode
authorScott Beamer <sbeamer@eecs.berkeley.edu>
Fri, 25 Jul 2014 00:05:53 +0000 (17:05 -0700)
committerScott Beamer <sbeamer@eecs.berkeley.edu>
Fri, 25 Jul 2014 00:05:53 +0000 (17:05 -0700)
README
riscv/disasm.h
riscv/interactive.cc
spike/disasm.cc

diff --git a/README b/README
index 71827bc7d18e0aa06db7683c84f5feae5f8abb50..093bf9fb42381ca653a9a9c0f7632e3cbfeaa31c 100644 (file)
--- a/README
+++ b/README
@@ -65,7 +65,7 @@ To invoke interactive debug mode, launch spike with -d:
 
 To see the contents of a register (0 is for core 0):
 
- : reg 0 14
+ : reg 0 a0
 
 To see the contents of a memory location (physical address in hex):
 
index b5aa6debb1da8c69676f7efcefca5f8dd091a4de..58a518a49d8c609715285dd967b498a987be21e1 100644 (file)
@@ -8,6 +8,20 @@
 #include <sstream>
 #include <vector>
 
+static const char* xpr_name[] = {
+  "zero", "ra", "s0", "s1",  "s2",  "s3",  "s4",  "s5",
+  "s6",   "s7", "s8", "s9", "s10", "s11",  "sp",  "tp",
+  "v0",   "v1", "a0", "a1",  "a2",  "a3",  "a4",  "a5",
+  "a6",   "a7", "t0", "t1",  "t2",  "t3",  "t4",  "gp"
+};
+
+static const char* fpr_name[] = {
+  "fs0", "fs1",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7",
+  "fs8", "fs9", "fs10", "fs11", "fs12", "fs13", "fs14", "fs15",
+  "fv0", "fv1", "fa0",   "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
+  "fa6", "fa7", "ft0",   "ft1",  "ft2",  "ft3",  "ft4",  "ft5"
+};
+
 class arg_t
 {
  public:
index 9014aa0174e6487b48a114f7d3edfb1156cd4786..27e9ee0a5c93e14b6cf03d56c699bd007d012532 100644 (file)
@@ -1,5 +1,7 @@
 // See LICENSE for license details.
 
+#include "decode.h"
+#include "disasm.h"
 #include "sim.h"
 #include "htif.h"
 #include <sys/mman.h>
@@ -14,6 +16,7 @@
 #include <sstream>
 #include <string>
 #include <vector>
+#include <algorithm>
 
 static std::string readline(int fd)
 {
@@ -130,7 +133,9 @@ reg_t sim_t::get_reg(const std::vector<std::string>& args)
     throw trap_illegal_instruction();
 
   int p = atoi(args[0].c_str());
-  int r = atoi(args[1].c_str());
+  int r = std::find(xpr_name, xpr_name + NXPR, args[1]) - xpr_name;
+  if (r == NXPR)
+    r = atoi(args[1].c_str());
   if(p >= (int)num_cores() || r >= NXPR)
     throw trap_illegal_instruction();
 
@@ -143,7 +148,9 @@ reg_t sim_t::get_freg(const std::vector<std::string>& args)
     throw trap_illegal_instruction();
 
   int p = atoi(args[0].c_str());
-  int r = atoi(args[1].c_str());
+  int r = std::find(fpr_name, fpr_name + NFPR, args[1]) - fpr_name;
+  if (r == NFPR)
+    r = atoi(args[1].c_str());
   if(p >= (int)num_cores() || r >= NFPR)
     throw trap_illegal_instruction();
 
index f63dee1b7cd88fe2fc63ffc858f3520ac19650f0..8fb1db8dbc50881102585f2e861c5d43ccb75d20 100644 (file)
@@ -7,77 +7,64 @@
 #include <sstream>
 #include <stdlib.h>
 
-static const char* xpr[] = {
-  "zero", "ra", "s0", "s1",  "s2",  "s3",  "s4",  "s5",
-  "s6",   "s7", "s8", "s9", "s10", "s11",  "sp",  "tp",
-  "v0",   "v1", "a0", "a1",  "a2",  "a3",  "a4",  "a5",
-  "a6",   "a7", "t0", "t1",  "t2",  "t3",  "t4",  "gp"
-};
-
-static const char* fpr[] = {
-  "fs0", "fs1",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7",
-  "fs8", "fs9", "fs10", "fs11", "fs12", "fs13", "fs14", "fs15",
-  "fv0", "fv1", "fa0",   "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
-  "fa6", "fa7", "ft0",   "ft1",  "ft2",  "ft3",  "ft4",  "ft5"
-};
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return std::to_string((int)insn.i_imm()) + '(' + xpr[insn.rs1()] + ')';
+    return std::to_string((int)insn.i_imm()) + '(' + xpr_name[insn.rs1()] + ')';
   }
 } load_address;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return std::to_string((int)insn.s_imm()) + '(' + xpr[insn.rs1()] + ')';
+    return std::to_string((int)insn.s_imm()) + '(' + xpr_name[insn.rs1()] + ')';
   }
 } store_address;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return std::string("0(") + xpr[insn.rs1()] + ')';
+    return std::string("0(") + xpr_name[insn.rs1()] + ')';
   }
 } amo_address;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return xpr[insn.rd()];
+    return xpr_name[insn.rd()];
   }
 } xrd;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return xpr[insn.rs1()];
+    return xpr_name[insn.rs1()];
   }
 } xrs1;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return xpr[insn.rs2()];
+    return xpr_name[insn.rs2()];
   }
 } xrs2;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return fpr[insn.rd()];
+    return fpr_name[insn.rd()];
   }
 } frd;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return fpr[insn.rs1()];
+    return fpr_name[insn.rs1()];
   }
 } frs1;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return fpr[insn.rs2()];
+    return fpr_name[insn.rs2()];
   }
 } frs2;
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    return fpr[insn.rs3()];
+    return fpr_name[insn.rs3()];
   }
 } frs3;