aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/cfg.h2
-rw-r--r--riscv/devices.cc22
-rw-r--r--riscv/devices.h19
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);