aboutsummaryrefslogtreecommitdiff
path: root/riscv/abstract_device.h
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/abstract_device.h')
-rw-r--r--riscv/abstract_device.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/riscv/abstract_device.h b/riscv/abstract_device.h
index 0726cd7..41f5c3f 100644
--- a/riscv/abstract_device.h
+++ b/riscv/abstract_device.h
@@ -16,6 +16,7 @@ class abstract_device_t {
public:
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;
+ virtual reg_t size() = 0;
virtual ~abstract_device_t() {}
virtual void tick(reg_t UNUSED rtc_ticks) {}
};
@@ -45,4 +46,11 @@ mmio_device_map_t& mmio_device_map();
std::string generate_dts(const sim_t* sim, const std::vector<std::string>& sargs) const override { return generate(sim, sargs); } \
}; device_factory_t *name##_factory = new name##_factory_t();
+#define REGISTER_BUILTIN_DEVICE(name, parse, generate) \
+ class name##_factory_t : public device_factory_t { \
+ public: \
+ name##_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, const std::vector<std::string>& sargs) const override { return parse(fdt, sim, base, sargs); } \
+ std::string generate_dts(const sim_t* sim, const std::vector<std::string>& sargs) const override { return generate(sim, sargs); } \
+ }; device_factory_t *name##_factory = new name##_factory_t();
+
#endif