From b98e922cb42d4e7ebe7e76ce413acc8594294068 Mon Sep 17 00:00:00 2001 From: joey0320 Date: Sun, 3 Dec 2023 16:22:56 -0800 Subject: Fix Spike --device option to pass on args to downstream plugins --- ci-tests/testlib.c | 2 +- riscv/abstract_device.h | 12 +++++++++--- riscv/clint.cc | 3 ++- riscv/ns16550.cc | 2 +- riscv/plic.cc | 2 +- riscv/sim.cc | 2 +- riscv/sim.h | 2 +- spike_main/spike.cc | 20 ++++++++++++++++++-- 8 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ci-tests/testlib.c b/ci-tests/testlib.c index 1fca4fa..559a1f8 100644 --- a/ci-tests/testlib.c +++ b/ci-tests/testlib.c @@ -29,7 +29,7 @@ int main() hartids, false, 4); - std::vector plugin_devices; + std::vector plugin_devices; std::vector htif_args {"pk", "hello"}; debug_module_config_t dm_config = { .progbufsize = 2, diff --git a/riscv/abstract_device.h b/riscv/abstract_device.h index c5c6415..d6097c1 100644 --- a/riscv/abstract_device.h +++ b/riscv/abstract_device.h @@ -8,6 +8,7 @@ #include #include #include +#include class sim_t; @@ -26,10 +27,15 @@ public: virtual abstract_device_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) const = 0; virtual std::string generate_dts(const sim_t* sim) const = 0; virtual ~device_factory_t() {} + void set_sargs(std::vector sargs) { this->sargs = sargs; } + std::vector get_sargs() { return sargs; } + +protected: + std::vector sargs; }; // Type for holding all registered MMIO plugins by name. -using mmio_device_map_t = std::map; +using mmio_device_map_t = std::map; mmio_device_map_t& mmio_device_map(); @@ -40,8 +46,8 @@ mmio_device_map_t& mmio_device_map(); std::string str(#name); \ if (!mmio_device_map().emplace(str, this).second) throw std::runtime_error("Plugin \"" + str + "\" already registered"); \ }; \ - name##_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) const override { return parse(fdt, sim, base); } \ + name##_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) const override { return parse(fdt, sim, base, sargs); } \ std::string generate_dts(const sim_t* sim) const override { return generate(sim); } \ - }; const device_factory_t *name##_factory = new name##_factory_t(); + }; device_factory_t *name##_factory = new name##_factory_t(); #endif diff --git a/riscv/clint.cc b/riscv/clint.cc index 908ccb6..2fb9ef3 100644 --- a/riscv/clint.cc +++ b/riscv/clint.cc @@ -116,7 +116,8 @@ void clint_t::tick(reg_t rtc_ticks) } } -clint_t* clint_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) { +clint_t* clint_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, + const std::vector& sargs) { if (fdt_parse_clint(fdt, base, "riscv,clint0") == 0) return new clint_t(sim, sim->CPU_HZ / sim->INSNS_PER_RTC_TICK, diff --git a/riscv/ns16550.cc b/riscv/ns16550.cc index dabe3a9..a74aa74 100644 --- a/riscv/ns16550.cc +++ b/riscv/ns16550.cc @@ -341,7 +341,7 @@ std::string ns16550_generate_dts(const sim_t* sim) return s.str(); } -ns16550_t* ns16550_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) +ns16550_t* ns16550_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, const std::vector& sargs) { uint32_t ns16550_shift, ns16550_io_width, ns16550_int_id; if (fdt_parse_ns16550(fdt, base, diff --git a/riscv/plic.cc b/riscv/plic.cc index 1aa5852..57c37c5 100644 --- a/riscv/plic.cc +++ b/riscv/plic.cc @@ -415,7 +415,7 @@ std::string plic_generate_dts(const sim_t* sim) return s.str(); } -plic_t* plic_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) +plic_t* plic_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, const std::vector& sargs) { uint32_t plic_ndev; if (fdt_parse_plic(fdt, base, &plic_ndev, "riscv,plic0") == 0) diff --git a/riscv/sim.cc b/riscv/sim.cc index d75de46..639c68d 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> mems, - std::vector plugin_device_factories, + std::vector plugin_device_factories, const std::vector& args, const debug_module_config_t &dm_config, const char *log_path, diff --git a/riscv/sim.h b/riscv/sim.h index 2455263..efe5f83 100644 --- a/riscv/sim.h +++ b/riscv/sim.h @@ -27,7 +27,7 @@ class sim_t : public htif_t, public simif_t public: sim_t(const cfg_t *cfg, bool halted, std::vector> mems, - std::vector plugin_device_factories, + std::vector plugin_device_factories, const std::vector& args, const debug_module_config_t &dm_config, const char *log_path, bool dtb_enabled, const char *dtb_file, diff --git a/spike_main/spike.cc b/spike_main/spike.cc index 8fd9104..5376ab9 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -10,6 +10,7 @@ #include "extension.h" #include #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include "../VERSION" static void help(int exit_code = 1) @@ -332,7 +334,7 @@ int main(int argc, char** argv) bool dtb_enabled = true; const char* kernel = NULL; reg_t kernel_offset, kernel_size; - std::vector plugin_device_factories; + std::vector plugin_device_factories; std::unique_ptr ic; std::unique_ptr dc; std::unique_ptr l2; @@ -374,10 +376,24 @@ int main(int argc, char** argv) /*default_trigger_count=*/4); auto const device_parser = [&plugin_device_factories](const char *s) { - const std::string name(s); + const std::string device_args(s); + std::vector parsed_args; + std::stringstream sstr(device_args); + while (sstr.good()) { + std::string substr; + getline(sstr, substr, ','); + parsed_args.push_back(substr); + } + if (parsed_args.empty()) throw std::runtime_error("Plugin argument is empty."); + + const std::string name = parsed_args[0]; if (name.empty()) throw std::runtime_error("Plugin name is empty."); + auto it = mmio_device_map().find(name); if (it == mmio_device_map().end()) throw std::runtime_error("Plugin \"" + name + "\" not found in loaded extlibs."); + + parsed_args.erase(parsed_args.begin()); + it->second->set_sargs(parsed_args); plugin_device_factories.push_back(it->second); }; -- cgit v1.1