diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-12 17:32:43 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-12 17:32:43 -0700 |
commit | ea58df801f36605b462783a61b5266bdd9a40eb0 (patch) | |
tree | ec6c4736f29e9f2021a9e448946e0a0169639cc1 /riscv/interactive.cc | |
parent | 9af855a28e7dc4009ad31312840ca6f9396d572e (diff) | |
download | spike-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.cc | 23 |
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]; |