aboutsummaryrefslogtreecommitdiff
path: root/spike_main
diff options
context:
space:
mode:
authorjoey0320 <joonho0320@gmail.com>2023-12-03 16:22:56 -0800
committerjoey0320 <joonho0320@gmail.com>2023-12-08 13:45:14 -0800
commitb98e922cb42d4e7ebe7e76ce413acc8594294068 (patch)
tree354e9373d655c65818df823a6f127f4b57cb582f /spike_main
parente9ae2287e174b67df95556266647731125307989 (diff)
downloadriscv-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.cc20
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);
};