aboutsummaryrefslogtreecommitdiff
path: root/riscv/sim.cc
diff options
context:
space:
mode:
authorRupert Swarbrick <rswarbrick@gmail.com>2022-02-18 12:28:55 +0000
committerGitHub <noreply@github.com>2022-02-18 04:28:55 -0800
commit5892e9356e53129afa6cdcaf3fc5aad5490a7f83 (patch)
tree27b1ba8fc5eb1c2d75511184510b3fa3e67f8669 /riscv/sim.cc
parentf224b15addeaacb5cff1a68cac21d3e926a0015f (diff)
downloadspike-5892e9356e53129afa6cdcaf3fc5aad5490a7f83.zip
spike-5892e9356e53129afa6cdcaf3fc5aad5490a7f83.tar.gz
spike-5892e9356e53129afa6cdcaf3fc5aad5490a7f83.tar.bz2
Don't instantiate a CLINT if there is none in the device config (#921)
This change makes it possible to faithfully simulate systems which don't have a CLINT (without adding yet another command line argument to pass through!). Without a change like this, lowRISC has been using a local hack in its Spike fork, where we've just commented out the internals of clint_t::increment(). This approach is rather cleaner and is hopefully general enough to use upstream.
Diffstat (limited to 'riscv/sim.cc')
-rw-r--r--riscv/sim.cc17
1 files changed, 11 insertions, 6 deletions
diff --git a/riscv/sim.cc b/riscv/sim.cc
index 2ee05d6..a0f13ae 100644
--- a/riscv/sim.cc
+++ b/riscv/sim.cc
@@ -98,12 +98,17 @@ sim_t::sim_t(const char* isa, const char* priv, const char* varch,
make_dtb();
void *fdt = (void *)dtb.c_str();
- //handle clic
- clint.reset(new clint_t(procs, CPU_HZ / INSNS_PER_RTC_TICK, real_time_clint));
+
+ // Only make a CLINT (Core-Local INTerrupt controller) if one is specified in
+ // the device tree configuration.
+ //
+ // This isn't *quite* as general as we could get (because you might have one
+ // that's not bus-accessible), but it should handle the normal use cases. In
+ // particular, the default device tree configuration that you get without
+ // setting the dtb_file argument has one.
reg_t clint_base;
- if (fdt_parse_clint(fdt, &clint_base, "riscv,clint0")) {
- bus.add_device(CLINT_BASE, clint.get());
- } else {
+ if (fdt_parse_clint(fdt, &clint_base, "riscv,clint0") == 0) {
+ clint.reset(new clint_t(procs, CPU_HZ / INSNS_PER_RTC_TICK, real_time_clint));
bus.add_device(clint_base, clint.get());
}
@@ -214,7 +219,7 @@ void sim_t::step(size_t n)
procs[current_proc]->get_mmu()->yield_load_reservation();
if (++current_proc == procs.size()) {
current_proc = 0;
- clint->increment(INTERLEAVE / INSNS_PER_RTC_TICK);
+ if (clint) clint->increment(INTERLEAVE / INSNS_PER_RTC_TICK);
}
host->switch_to();