diff options
author | joey0320 <joonho0320@gmail.com> | 2023-12-03 16:22:56 -0800 |
---|---|---|
committer | joey0320 <joonho0320@gmail.com> | 2023-12-08 13:45:14 -0800 |
commit | b98e922cb42d4e7ebe7e76ce413acc8594294068 (patch) | |
tree | 354e9373d655c65818df823a6f127f4b57cb582f /spike_main | |
parent | e9ae2287e174b67df95556266647731125307989 (diff) | |
download | riscv-isa-sim-b98e922cb42d4e7ebe7e76ce413acc8594294068.zip riscv-isa-sim-b98e922cb42d4e7ebe7e76ce413acc8594294068.tar.gz riscv-isa-sim-b98e922cb42d4e7ebe7e76ce413acc8594294068.tar.bz2 |
Fix Spike --device option to pass on args to downstream plugins
Diffstat (limited to 'spike_main')
-rw-r--r-- | spike_main/spike.cc | 20 |
1 files changed, 18 insertions, 2 deletions
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 <dlfcn.h> #include <fesvr/option_parser.h> +#include <stdexcept> #include <stdio.h> #include <stdlib.h> #include <vector> @@ -18,6 +19,7 @@ #include <fstream> #include <limits> #include <cinttypes> +#include <sstream> #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<const device_factory_t*> plugin_device_factories; + std::vector<device_factory_t*> plugin_device_factories; std::unique_ptr<icache_sim_t> ic; std::unique_ptr<dcache_sim_t> dc; std::unique_ptr<cache_sim_t> 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<std::string> 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); }; |