From 03be4ae6c7b8e9865083b61427ff9724c7706fcf Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Fri, 14 Oct 2022 13:40:56 -0700 Subject: Add interactive mode commands to read clint mtime/mtimecmp --- riscv/devices.h | 2 ++ riscv/interactive.cc | 23 +++++++++++++++++++++++ riscv/sim.h | 2 ++ 3 files changed, 27 insertions(+) diff --git a/riscv/devices.h b/riscv/devices.h index 8907b87..08e9c45 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -59,6 +59,8 @@ class clint_t : public abstract_device_t { bool store(reg_t addr, size_t len, const uint8_t* bytes); size_t size() { return CLINT_SIZE; } void increment(reg_t inc); + uint64_t get_mtimecmp(reg_t hartid) { return mtimecmp[hartid]; } + uint64_t get_mtime() { return mtime; } private: typedef uint64_t mtime_t; typedef uint64_t mtimecmp_t; diff --git a/riscv/interactive.cc b/riscv/interactive.cc index ffc706b..cf95bf6 100644 --- a/riscv/interactive.cc +++ b/riscv/interactive.cc @@ -315,6 +315,8 @@ void sim_t::interactive() funcs["pc"] = &sim_t::interactive_pc; funcs["mem"] = &sim_t::interactive_mem; funcs["str"] = &sim_t::interactive_str; + funcs["mtime"] = &sim_t::interactive_mtime; + funcs["mtimecmp"] = &sim_t::interactive_mtimecmp; funcs["until"] = &sim_t::interactive_until_silent; funcs["untiln"] = &sim_t::interactive_until_noisy; funcs["while"] = &sim_t::interactive_until_silent; @@ -397,6 +399,8 @@ void sim_t::interactive_help(const std::string& cmd, const std::vector # Show contents of virtual memory in [core] (physical memory if omitted)\n" "str [core] # Show NUL-terminated C string at virtual address in [core] (physical address if omitted)\n" "dump # Dump physical memory to binary files\n" + "mtime # Show mtime\n" + "mtimecmp # Show mtimecmp for \n" "until reg # Stop when in hits \n" "untiln reg # Run noisy and stop when in hits \n" "until pc # Stop when PC in hits \n" @@ -788,3 +792,22 @@ void sim_t::interactive_dumpmems(const std::string& cmd, const std::vector& args) +{ + std::ostream out(sout_.rdbuf()); + out << std::hex << std::setfill('0') << "0x" << std::setw(16) + << clint->get_mtime() << std::endl; +} + +void sim_t::interactive_mtimecmp(const std::string& cmd, const std::vector& args) +{ + if (args.size() != 1) + throw trap_interactive(); + + processor_t *p = get_core(args[0]); + std::ostream out(sout_.rdbuf()); + out << std::hex << std::setfill('0') << "0x" << std::setw(16) + << clint->get_mtimecmp(p->get_id()) << std::endl; +} + diff --git a/riscv/sim.h b/riscv/sim.h index 5787d5d..c7dbd47 100644 --- a/riscv/sim.h +++ b/riscv/sim.h @@ -137,6 +137,8 @@ private: void interactive_mem(const std::string& cmd, const std::vector& args); void interactive_str(const std::string& cmd, const std::vector& args); void interactive_dumpmems(const std::string& cmd, const std::vector& args); + void interactive_mtime(const std::string& cmd, const std::vector& args); + void interactive_mtimecmp(const std::string& cmd, const std::vector& args); void interactive_until(const std::string& cmd, const std::vector& args, bool noisy); void interactive_until_silent(const std::string& cmd, const std::vector& args); void interactive_until_noisy(const std::string& cmd, const std::vector& args); -- cgit v1.1