#include "base/trace.hh"
#include "config/the_isa.hh"
#include "cpu/thread_context.hh"
+#include "dev/net/dist_iface.hh"
#include "mem/page_table.hh"
#include "sim/process.hh"
#include "sim/sim_exit.hh"
for (auto &system: sys->systemList)
activeContexts += system->numRunningContexts();
if (activeContexts == 1) {
+ /**
+ * Even though we are terminating the final thread context, dist-gem5
+ * requires the simulation to remain active and provide
+ * synchronization messages to the switch process. So we just halt
+ * the last thread context and return. The simulation will be
+ * terminated by dist-gem5 in a coordinated manner once all nodes
+ * have signaled their readiness to exit. For non dist-gem5
+ * simulations, readyToExit() always returns true.
+ */
+ if (!DistIface::readyToExit(0)) {
+ tc->halt();
+ return status;
+ }
+
exitSimLoop("exiting with last active thread context", status & 0xff);
return status;
}