diff options
-rw-r--r-- | riscv/cfg.h | 2 | ||||
-rw-r--r-- | riscv/devices.cc | 22 | ||||
-rw-r--r-- | riscv/devices.h | 19 |
3 files changed, 43 insertions, 0 deletions
diff --git a/riscv/cfg.h b/riscv/cfg.h index c972f03..388030b 100644 --- a/riscv/cfg.h +++ b/riscv/cfg.h @@ -6,6 +6,7 @@ #include <vector> #include "decode.h" #include <cassert> +class abstract_sim_if_t; typedef enum { endianness_little, @@ -77,6 +78,7 @@ public: bool explicit_hartids; bool real_time_clint; reg_t trigger_count; + std::optional<abstract_sim_if_t*> external_simulator; size_t nprocs() const { return hartids.size(); } size_t max_hartid() const { return hartids.back(); } diff --git a/riscv/devices.cc b/riscv/devices.cc index d22e202..fb5bb5a 100644 --- a/riscv/devices.cc +++ b/riscv/devices.cc @@ -155,3 +155,25 @@ void mem_t::dump(std::ostream& o) { } } } + +external_sim_device_t::external_sim_device_t(void* sim) + : external_simulator(sim) {} + +void external_sim_device_t::set_simulator(void* sim) { + external_simulator = sim; +} + +bool external_sim_device_t::load(reg_t addr, size_t len, uint8_t* bytes) { + if (unlikely(external_simulator == nullptr)) return false; + return static_cast<abstract_sim_if_t*>(external_simulator)->load(addr, len, bytes); +} + +bool external_sim_device_t::store(reg_t addr, size_t len, const uint8_t* bytes) { + if (unlikely(external_simulator == nullptr)) return false; + return static_cast<abstract_sim_if_t*>(external_simulator)->store(addr, len, bytes); +} + +reg_t external_sim_device_t::size() { + if (unlikely(external_simulator == nullptr)) return 0; + return PGSIZE; // TODO: proper size +} diff --git a/riscv/devices.h b/riscv/devices.h index 858353d..e7b80ad 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -71,6 +71,25 @@ class mem_t : public abstract_mem_t { reg_t sz; }; +class abstract_sim_if_t { +public: + virtual ~abstract_sim_if_t() = default; + virtual bool load(reg_t addr, size_t len, uint8_t* bytes) = 0; + virtual bool store(reg_t addr, size_t len, const uint8_t* bytes) = 0; +}; + +class external_sim_device_t : public abstract_device_t { +public: + external_sim_device_t(void* sim); + void set_simulator(void* sim); + bool load(reg_t addr, size_t len, uint8_t* bytes) override; + bool store(reg_t addr, size_t len, const uint8_t* bytes) override; + reg_t size() override; + +private: + void* external_simulator; +}; + class clint_t : public abstract_device_t { public: clint_t(const simif_t*, uint64_t freq_hz, bool real_time); |