aboutsummaryrefslogtreecommitdiff
path: root/riscv/sim.cc
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/sim.cc')
-rw-r--r--riscv/sim.cc22
1 files changed, 13 insertions, 9 deletions
diff --git a/riscv/sim.cc b/riscv/sim.cc
index f4919c9..d08e274 100644
--- a/riscv/sim.cc
+++ b/riscv/sim.cc
@@ -38,7 +38,7 @@ extern device_factory_t* ns16550_factory;
sim_t::sim_t(const cfg_t *cfg, bool halted,
std::vector<std::pair<reg_t, abstract_mem_t*>> mems,
- std::vector<device_factory_t*> plugin_device_factories,
+ const std::vector<device_factory_sargs_t>& plugin_device_factories,
const std::vector<std::string>& args,
const debug_module_config_t &dm_config,
const char *log_path,
@@ -115,10 +115,10 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
// that's not bus-accessible), but it should handle the normal use cases. In
// particular, the default device tree configuration that you get without
// setting the dtb_file argument has one.
- std::vector<const device_factory_t*> device_factories = {
- clint_factory, // clint must be element 0
- plic_factory, // plic must be element 1
- ns16550_factory};
+ std::vector<device_factory_sargs_t> device_factories = {
+ {clint_factory, {}}, // clint must be element 0
+ {plic_factory, {}}, // plic must be element 1
+ {ns16550_factory, {}}};
device_factories.insert(device_factories.end(),
plugin_device_factories.begin(),
plugin_device_factories.end());
@@ -136,8 +136,11 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
} else {
std::pair<reg_t, reg_t> initrd_bounds = cfg->initrd_bounds;
std::string device_nodes;
- for (const device_factory_t *factory : device_factories)
- device_nodes.append(factory->generate_dts(this));
+ for (const device_factory_sargs_t& factory_sargs: device_factories) {
+ const device_factory_t* factory = factory_sargs.first;
+ const std::vector<std::string>& sargs = factory_sargs.second;
+ device_nodes.append(factory->generate_dts(this, sargs));
+ }
dts = make_dts(INSNS_PER_RTC_TICK, CPU_HZ,
initrd_bounds.first, initrd_bounds.second,
cfg->bootargs, cfg->pmpregions, cfg->pmpgranularity,
@@ -160,9 +163,10 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
void *fdt = (void *)dtb.c_str();
for (size_t i = 0; i < device_factories.size(); i++) {
- const device_factory_t *factory = device_factories[i];
+ const device_factory_t* factory = device_factories[i].first;
+ const std::vector<std::string>& sargs = device_factories[i].second;
reg_t device_base = 0;
- abstract_device_t* device = factory->parse_from_fdt(fdt, this, &device_base);
+ abstract_device_t* device = factory->parse_from_fdt(fdt, this, &device_base, sargs);
if (device) {
assert(device_base);
std::shared_ptr<abstract_device_t> dev_ptr(device);