aboutsummaryrefslogtreecommitdiff
path: root/riscv/interactive.cc
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-03-12 17:32:43 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-03-12 17:32:43 -0700
commitea58df801f36605b462783a61b5266bdd9a40eb0 (patch)
treeec6c4736f29e9f2021a9e448946e0a0169639cc1 /riscv/interactive.cc
parent9af855a28e7dc4009ad31312840ca6f9396d572e (diff)
downloadspike-ea58df801f36605b462783a61b5266bdd9a40eb0.zip
spike-ea58df801f36605b462783a61b5266bdd9a40eb0.tar.gz
spike-ea58df801f36605b462783a61b5266bdd9a40eb0.tar.bz2
Update to new privileged spec
Sorry, everyone.
Diffstat (limited to 'riscv/interactive.cc')
-rw-r--r--riscv/interactive.cc23
1 files changed, 18 insertions, 5 deletions
diff --git a/riscv/interactive.cc b/riscv/interactive.cc
index 27e9ee0..2dd1cad 100644
--- a/riscv/interactive.cc
+++ b/riscv/interactive.cc
@@ -132,11 +132,24 @@ reg_t sim_t::get_reg(const std::vector<std::string>& args)
if(args.size() != 2)
throw trap_illegal_instruction();
- int p = atoi(args[0].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)
+ char* ptr;
+ unsigned long p = strtoul(args[0].c_str(), &ptr, 10);
+ if (*ptr || p >= num_cores())
+ throw trap_illegal_instruction();
+
+ unsigned long r = std::find(xpr_name, xpr_name + NXPR, args[1]) - xpr_name;
+ if (r == NXPR) {
+ r = strtoul(args[1].c_str(), &ptr, 10);
+ if (*ptr) {
+ #define DECLARE_CSR(name, number) if (args[1] == #name) return procs[p]->get_csr(number);
+ if (0) ;
+ #include "encoding.h"
+ else r = NXPR;
+ #undef DECLARE_CSR
+ }
+ }
+
+ if (r >= NXPR)
throw trap_illegal_instruction();
return procs[p]->state.XPR[r];