diff options
-rw-r--r-- | riscv/cfg.h | 9 | ||||
-rw-r--r-- | riscv/sim.cc | 7 | ||||
-rw-r--r-- | riscv/sim.h | 2 | ||||
-rw-r--r-- | spike_main/spike.cc | 28 |
4 files changed, 28 insertions, 18 deletions
diff --git a/riscv/cfg.h b/riscv/cfg.h index 1e08f80..6410c81 100644 --- a/riscv/cfg.h +++ b/riscv/cfg.h @@ -56,13 +56,16 @@ public: cfg_t(std::pair<reg_t, reg_t> default_initrd_bounds, const char *default_bootargs, size_t default_nprocs, const char *default_isa, const char *default_priv, - const std::vector<mem_cfg_t> &default_mem_layout) + const std::vector<mem_cfg_t> &default_mem_layout, + const std::vector<int> default_hartids) : initrd_bounds(default_initrd_bounds), bootargs(default_bootargs), nprocs(default_nprocs), isa(default_isa), priv(default_priv), - mem_layout(default_mem_layout) + mem_layout(default_mem_layout), + hartids(default_hartids), + explicit_hartids(false) {} cfg_arg_t<std::pair<reg_t, reg_t>> initrd_bounds; @@ -72,6 +75,8 @@ public: cfg_arg_t<const char *> priv; cfg_arg_t<std::vector<mem_cfg_t>> mem_layout; std::optional<reg_t> start_pc; + cfg_arg_t<std::vector<int>> hartids; + bool explicit_hartids; }; #endif diff --git a/riscv/sim.cc b/riscv/sim.cc index d285183..d7585ca 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -32,7 +32,6 @@ sim_t::sim_t(const cfg_t *cfg, const char* varch, bool halted, bool real_time_cl std::vector<std::pair<reg_t, mem_t*>> mems, std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices, const std::vector<std::string>& args, - std::vector<int> const hartids, const debug_module_config_t &dm_config, const char *log_path, bool dtb_enabled, const char *dtb_file, @@ -63,7 +62,7 @@ sim_t::sim_t(const cfg_t *cfg, const char* varch, bool halted, bool real_time_cl remote_bitbang(NULL), debug_module(this, dm_config) { - assert(hartids.size() == cfg->nprocs()); + assert(cfg->hartids().size() == cfg->nprocs()); signal(SIGINT, &handle_signal); @@ -79,8 +78,8 @@ sim_t::sim_t(const cfg_t *cfg, const char* varch, bool halted, bool real_time_cl debug_mmu = new mmu_t(this, NULL); - for (size_t i = 0; i < nprocs(); i++) { - procs[i] = new processor_t(&isa, varch, this, hartids[i], halted, + for (size_t i = 0; i < cfg->nprocs(); i++) { + procs[i] = new processor_t(&isa, varch, this, cfg->hartids()[i], halted, log_file.get(), sout_); } diff --git a/riscv/sim.h b/riscv/sim.h index 6acc440..de82ccd 100644 --- a/riscv/sim.h +++ b/riscv/sim.h @@ -35,7 +35,7 @@ public: sim_t(const cfg_t *cfg, const char* varch, bool halted, bool real_time_clint, std::vector<std::pair<reg_t, mem_t*>> mems, std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices, - const std::vector<std::string>& args, const std::vector<int> hartids, + const std::vector<std::string>& args, const debug_module_config_t &dm_config, const char *log_path, bool dtb_enabled, const char *dtb_file, #ifdef HAVE_BOOST_ASIO diff --git a/spike_main/spike.cc b/spike_main/spike.cc index a3c18d1..12b8dc0 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -272,13 +272,13 @@ int main(int argc, char** argv) .support_haltgroups = true, .support_impebreak = true }; - std::vector<int> hartids; cfg_t cfg(/*default_initrd_bounds=*/std::make_pair((reg_t)0, (reg_t)0), /*default_bootargs=*/nullptr, /*default_nprocs=*/1, /*default_isa=*/DEFAULT_ISA, /*default_priv=*/DEFAULT_PRIV, - /*default_mem_layout=*/parse_mem_layout("2048")); + /*default_mem_layout=*/parse_mem_layout("2048"), + /*default_hartids=*/std::vector<int>()); auto const device_parser = [&plugin_devices](const char *s) { const std::string str(s); @@ -338,7 +338,10 @@ int main(int argc, char** argv) parser.option('H', 0, 0, [&](const char* s){halted = true;}); parser.option(0, "rbb-port", 1, [&](const char* s){use_rbb = true; rbb_port = atoul_safe(s);}); parser.option(0, "pc", 1, [&](const char* s){cfg.start_pc = strtoull(s, 0, 0);}); - parser.option(0, "hartids", 1, [&](const char* s){hartids = parse_hartids(s);}); + parser.option(0, "hartids", 1, [&](const char* s){ + cfg.hartids = parse_hartids(s); + cfg.explicit_hartids = true; + }); parser.option(0, "ic", 1, [&](const char* s){ic.reset(new icache_sim_t(s));}); parser.option(0, "dc", 1, [&](const char* s){dc.reset(new dcache_sim_t(s));}); parser.option(0, "l2", 1, [&](const char* s){l2.reset(cache_sim_t::construct(s, "L2$"));}); @@ -458,25 +461,28 @@ int main(int argc, char** argv) } #endif - if (!hartids.empty()) { - if (cfg.nprocs.overridden() && (cfg.nprocs() != hartids.size())) { + if (cfg.explicit_hartids) { + if (cfg.nprocs.overridden() && (cfg.nprocs() != cfg.hartids().size())) { std::cerr << "Number of specified hartids (" - << hartids.size() + << cfg.hartids().size() << ") doesn't match specified number of processors (" << cfg.nprocs() << ").\n"; exit(1); } } else { - // Set default set of hartids based on nprocs - hartids.reserve(cfg.nprocs()); + // Set default set of hartids based on nprocs, but don't set the + // explicit_hartids flag (which means that downstream code can know that + // we've only set the number of harts, not explicitly chosen their IDs). + std::vector<int> default_hartids; + default_hartids.reserve(cfg.nprocs()); for (size_t i = 0; i < cfg.nprocs(); ++i) { - hartids.push_back(i); + default_hartids.push_back(i); } + cfg.hartids = default_hartids; } sim_t s(&cfg, varch, halted, real_time_clint, - mems, plugin_devices, htif_args, - std::move(hartids), dm_config, log_path, dtb_enabled, dtb_file, + mems, plugin_devices, htif_args, dm_config, log_path, dtb_enabled, dtb_file, #ifdef HAVE_BOOST_ASIO io_service_ptr, acceptor_ptr, #endif |