From: Nathan Binkert Date: Thu, 17 Feb 2005 07:48:56 +0000 (-0500) Subject: Several tweaks to make binning work in any simulation X-Git-Tag: m5_1.0_tutorial~88^2~4 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a24016c731a69c47e694458f7f564ef1630d34c1;p=gem5.git Several tweaks to make binning work in any simulation configuration so that we can always have binning on. base/statistics.cc: If we're binning, and there is no bin active at the time we check all stats stuff, create a bin. base/statistics.hh: FS_MEASURE doesn't exist anymore base/stats/text.cc: don't print out bin names if there is only one bin sim/process.cc: don't zero stats. It happens automatically. Don't activate the context at the time it is registered, instead activate the first context in a startup callback. sim/process.hh: Add startup callback to initialize the first exec context --HG-- extra : convert_revision : bcb23cdb184b0abf7cecd79902f8a59b50f71fe4 --- diff --git a/base/statistics.cc b/base/statistics.cc index 6e3dae1ef..6f5caf1fe 100644 --- a/base/statistics.cc +++ b/base/statistics.cc @@ -286,6 +286,13 @@ check() Database::stats().sort(StatData::less); +#if defined(STATS_BINNING) + if (MainBin::curBin() == NULL) { + static MainBin mainBin("main bin"); + mainBin.activate(); + } +#endif + if (i == end) return; diff --git a/base/statistics.hh b/base/statistics.hh index 9ec26eb4d..667a0ed48 100644 --- a/base/statistics.hh +++ b/base/statistics.hh @@ -2184,7 +2184,7 @@ class SumNode : public Node * binned. If the typedef is NoBin, nothing is binned. If it is * MainBin, then all stats are binned under that Bin. */ -#if defined(FS_MEASURE) || defined(STATS_BINNING) +#if defined(STATS_BINNING) typedef MainBin DefaultBin; #else typedef NoBin DefaultBin; diff --git a/base/stats/text.cc b/base/stats/text.cc index f7e82a30f..8cc5ff65e 100644 --- a/base/stats/text.cc +++ b/base/stats/text.cc @@ -126,7 +126,7 @@ Text::output() using namespace Database; ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n"); - if (bins().empty()) { + if (bins().empty() || bins().size() == 1) { stat_list_t::const_iterator i, end = stats().end(); for (i = stats().begin(); i != end; ++i) (*i)->visit(*this); diff --git a/sim/process.cc b/sim/process.cc index c725d3b1c..4d860c51d 100644 --- a/sim/process.cc +++ b/sim/process.cc @@ -88,8 +88,6 @@ Process::Process(const string &name, fd_map[i] = -1; } - num_syscalls = 0; - // other parameters will be initialized when the program is loaded } @@ -145,21 +143,28 @@ Process::registerExecContext(ExecContext *xc) execContexts.push_back(xc); if (myIndex == 0) { - // first exec context for this process... initialize & enable - // copy process's initial regs struct xc->regs = *init_regs; - - // mark this context as active. - // activate with zero delay so that we start ticking right - // away on cycle 0 - xc->activate(0); } // return CPU number to caller and increment available CPU count return myIndex; } +void +Process::startup() +{ + if (execContexts.empty()) + return; + + // first exec context for this process... initialize & enable + ExecContext *xc = execContexts[0]; + + // mark this context as active. + // activate with zero delay so that we start ticking right + // away on cycle 0 + xc->activate(0); +} void Process::replaceExecContext(ExecContext *xc, int xcIndex) diff --git a/sim/process.hh b/sim/process.hh index bb4829875..817ab656c 100644 --- a/sim/process.hh +++ b/sim/process.hh @@ -108,6 +108,8 @@ class Process : public SimObject int stdout_fd, int stderr_fd); + // post initialization startup + virtual void startup(); protected: FunctionalMemory *memory;