Statistics::Statistics()
: ::Kernel::Statistics(),
- idleProcess((Addr)-1), themode(kernel), lastModeTick(0)
+ idleProcess((Addr)-1), themode(kernel), lastModeTick(0),
+ iplLast(0), iplLastTick(0)
{
}
.name(name() + ".swap_context")
.desc("number of times the context was actually changed")
;
+
+ _iplCount
+ .init(32)
+ .name(name() + ".ipl_count")
+ .desc("number of times we switched to this ipl")
+ .flags(total | pdf | nozero | nonan)
+ ;
+
+ _iplGood
+ .init(32)
+ .name(name() + ".ipl_good")
+ .desc("number of times we switched to this ipl from a different ipl")
+ .flags(total | pdf | nozero | nonan)
+ ;
+
+ _iplTicks
+ .init(32)
+ .name(name() + ".ipl_ticks")
+ .desc("number of cycles we spent at this ipl")
+ .flags(total | pdf | nozero | nonan)
+ ;
+
+ _iplUsed
+ .name(name() + ".ipl_used")
+ .desc("fraction of swpipl calls that actually changed the ipl")
+ .flags(total | nozero | nonan)
+ ;
+
+ _iplUsed = _iplGood / _iplCount;
}
void
_callpal[code]++;
}
+void
+Statistics::swpipl(int ipl)
+{
+ assert(ipl >= 0 && ipl <= 0x1f && "invalid IPL\n");
+
+ _iplCount[ipl]++;
+
+ if (ipl == iplLast)
+ return;
+
+ _iplGood[ipl]++;
+ _iplTicks[iplLast] += curTick() - iplLastTick;
+ iplLastTick = curTick();
+ iplLast = ipl;
+}
+
void
Statistics::serialize(CheckpointOut &cp) const
{
SERIALIZE_SCALAR(exemode);
SERIALIZE_SCALAR(idleProcess);
SERIALIZE_SCALAR(lastModeTick);
+ SERIALIZE_SCALAR(iplLast);
+ SERIALIZE_SCALAR(iplLastTick);
}
void
UNSERIALIZE_SCALAR(idleProcess);
UNSERIALIZE_SCALAR(lastModeTick);
themode = (cpu_mode)exemode;
+ UNSERIALIZE_SCALAR(iplLast);
+ UNSERIALIZE_SCALAR(iplLastTick);
}
} // namespace Kernel
private:
Stats::Vector _callpal;
-// Stats::Vector _faults;
+
+ Stats::Scalar _hwrei;
Stats::Vector _mode;
Stats::Vector _modeGood;
Stats::Scalar _swap_context;
+ Stats::Vector _iplCount;
+ Stats::Vector _iplGood;
+ Stats::Vector _iplTicks;
+ Stats::Formula _iplUsed;
+
+ private:
+ int iplLast;
+ Tick iplLastTick;
+
public:
Statistics();
void context(Addr oldpcbb, Addr newpcbb, ThreadContext *tc);
void callpal(int code, ThreadContext *tc);
void hwrei() { _hwrei++; }
+ void swpipl(int ipl);
void setIdleProcess(Addr idle, ThreadContext *tc);
namespace Kernel {
-Statistics::Statistics()
- : iplLast(0), iplLastTick(0)
-{
-}
-
void
Statistics::regStats(const string &_name)
{
.name(name() + ".inst.quiesce")
.desc("number of quiesce instructions executed")
;
-
- _iplCount
- .init(32)
- .name(name() + ".ipl_count")
- .desc("number of times we switched to this ipl")
- .flags(total | pdf | nozero | nonan)
- ;
-
- _iplGood
- .init(32)
- .name(name() + ".ipl_good")
- .desc("number of times we switched to this ipl from a different ipl")
- .flags(total | pdf | nozero | nonan)
- ;
-
- _iplTicks
- .init(32)
- .name(name() + ".ipl_ticks")
- .desc("number of cycles we spent at this ipl")
- .flags(total | pdf | nozero | nonan)
- ;
-
- _iplUsed
- .name(name() + ".ipl_used")
- .desc("fraction of swpipl calls that actually changed the ipl")
- .flags(total | nozero | nonan)
- ;
-
- _iplUsed = _iplGood / _iplCount;
-}
-
-void
-Statistics::swpipl(int ipl)
-{
- assert(ipl >= 0 && ipl <= 0x1f && "invalid IPL\n");
-
- _iplCount[ipl]++;
-
- if (ipl == iplLast)
- return;
-
- _iplGood[ipl]++;
- _iplTicks[iplLast] += curTick() - iplLastTick;
- iplLastTick = curTick();
- iplLast = ipl;
-}
-
-void
-Statistics::serialize(CheckpointOut &cp) const
-{
- SERIALIZE_SCALAR(iplLast);
- SERIALIZE_SCALAR(iplLastTick);
-}
-
-void
-Statistics::unserialize(CheckpointIn &cp)
-{
- UNSERIALIZE_SCALAR(iplLast);
- UNSERIALIZE_SCALAR(iplLastTick);
}
} // namespace Kernel
protected:
Stats::Scalar _arm;
Stats::Scalar _quiesce;
- Stats::Scalar _hwrei;
-
- Stats::Vector _iplCount;
- Stats::Vector _iplGood;
- Stats::Vector _iplTicks;
- Stats::Formula _iplUsed;
-
- private:
- int iplLast;
- Tick iplLastTick;
public:
- Statistics();
virtual ~Statistics() {}
const std::string name() const { return myname; }
public:
void arm() { _arm++; }
void quiesce() { _quiesce++; }
- void swpipl(int ipl);
public:
- void serialize(CheckpointOut &cp) const override;
- void unserialize(CheckpointIn &cp) override;
+ void serialize(CheckpointOut &cp) const override {}
+ void unserialize(CheckpointIn &cp) override {}
};
} // namespace Kernel