aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRupert Swarbrick <rswarbrick@gmail.com>2022-04-11 10:59:20 +0100
committerRupert Swarbrick <rswarbrick@lowrisc.org>2022-04-12 11:10:45 +0100
commit61b4f61a857de65d1a341f55597bfceeb7b7690d (patch)
treee4537514b7522fba146bf3aeb1bb27b7fd34c3c9
parente4aaed1b7b08998a6b6aefa34f7c575e292dde62 (diff)
downloadriscv-isa-sim-61b4f61a857de65d1a341f55597bfceeb7b7690d.zip
riscv-isa-sim-61b4f61a857de65d1a341f55597bfceeb7b7690d.tar.gz
riscv-isa-sim-61b4f61a857de65d1a341f55597bfceeb7b7690d.tar.bz2
Move hartids into cfg_t
The only slightly difficult thing here is that hartids will always be considered "overridden" by the time we get to sim_t::sim_t (either overridden by a command line argument, or overridden when we set default hartids just before the constructor). To allow downstream code to distinguish between "I picked IDs 0, 1, 2, 3 because the user asked for 4 processors" and "The user explicitly asked for IDs 0, 1, 2, 3", we have an extra explicit_hartids field.
-rw-r--r--riscv/cfg.h9
-rw-r--r--riscv/sim.cc7
-rw-r--r--riscv/sim.h2
-rw-r--r--spike_main/spike.cc28
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