diff options
Diffstat (limited to 'riscv/devices.cc')
-rw-r--r-- | riscv/devices.cc | 46 |
1 files changed, 6 insertions, 40 deletions
diff --git a/riscv/devices.cc b/riscv/devices.cc index 81b232d..2c06f78 100644 --- a/riscv/devices.cc +++ b/riscv/devices.cc @@ -2,6 +2,12 @@ #include "mmu.h" #include <stdexcept> +mmio_device_map_t& mmio_device_map() +{ + static mmio_device_map_t device_map; + return device_map; +} + void bus_t::add_device(reg_t addr, abstract_device_t* dev) { // Searching devices via lower_bound/upper_bound @@ -51,46 +57,6 @@ std::pair<reg_t, abstract_device_t*> bus_t::find_device(reg_t addr) return std::make_pair(it->first, it->second); } -// Type for holding all registered MMIO plugins by name. -using mmio_plugin_map_t = std::map<std::string, mmio_plugin_t>; - -// Simple singleton instance of an mmio_plugin_map_t. -static mmio_plugin_map_t& mmio_plugin_map() -{ - static mmio_plugin_map_t instance; - return instance; -} - -void register_mmio_plugin(const char* name_cstr, - const mmio_plugin_t* mmio_plugin) -{ - std::string name(name_cstr); - if (!mmio_plugin_map().emplace(name, *mmio_plugin).second) { - throw std::runtime_error("Plugin \"" + name + "\" already registered!"); - } -} - -mmio_plugin_device_t::mmio_plugin_device_t(const std::string& name, - const std::string& args) - : plugin(mmio_plugin_map().at(name)), user_data((*plugin.alloc)(args.c_str())) -{ -} - -mmio_plugin_device_t::~mmio_plugin_device_t() -{ - (*plugin.dealloc)(user_data); -} - -bool mmio_plugin_device_t::load(reg_t addr, size_t len, uint8_t* bytes) -{ - return (*plugin.load)(user_data, addr, len, bytes); -} - -bool mmio_plugin_device_t::store(reg_t addr, size_t len, const uint8_t* bytes) -{ - return (*plugin.store)(user_data, addr, len, bytes); -} - mem_t::mem_t(reg_t size) : sz(size) { |