diff options
author | Gabe Black <gabeblack@google.com> | 2017-08-25 18:02:01 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2017-09-11 04:59:01 +0000 |
commit | a50bcfb436da42dbd6005da681ed91bb768684f4 (patch) | |
tree | 4a8e021bc59cd0d3dba43939e035bfac67d089bf /src/arch/alpha/kernel_stats.cc | |
parent | b9d8700a38ccecfbe97c152bc9fc3b7c3b09e9a2 (diff) | |
download | gem5-a50bcfb436da42dbd6005da681ed91bb768684f4.tar.xz |
stats: Move the swpipl function into the Alpha kernel stats.
This stat is only incremented by Alpha. Also move the _hwrei into the Alpha
stats object since it's the class that actually sets up and maintains that
value and it probably should have been there all along.
Change-Id: Ibd038a33230c01432c160490926d8e1e55f8ccb0
Reviewed-on: https://gem5-review.googlesource.com/4601
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/arch/alpha/kernel_stats.cc')
-rw-r--r-- | src/arch/alpha/kernel_stats.cc | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/src/arch/alpha/kernel_stats.cc b/src/arch/alpha/kernel_stats.cc index a1ed532d8..39f460f1c 100644 --- a/src/arch/alpha/kernel_stats.cc +++ b/src/arch/alpha/kernel_stats.cc @@ -52,7 +52,8 @@ const char *modestr[] = { "kernel", "user", "idle" }; Statistics::Statistics() : ::Kernel::Statistics(), - idleProcess((Addr)-1), themode(kernel), lastModeTick(0) + idleProcess((Addr)-1), themode(kernel), lastModeTick(0), + iplLast(0), iplLastTick(0) { } @@ -120,6 +121,35 @@ Statistics::regStats(const string &_name) .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 @@ -184,6 +214,22 @@ Statistics::callpal(int code, ThreadContext *tc) } 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 { ::Kernel::Statistics::serialize(cp); @@ -191,6 +237,8 @@ Statistics::serialize(CheckpointOut &cp) const SERIALIZE_SCALAR(exemode); SERIALIZE_SCALAR(idleProcess); SERIALIZE_SCALAR(lastModeTick); + SERIALIZE_SCALAR(iplLast); + SERIALIZE_SCALAR(iplLastTick); } void @@ -202,6 +250,8 @@ Statistics::unserialize(CheckpointIn &cp) UNSERIALIZE_SCALAR(idleProcess); UNSERIALIZE_SCALAR(lastModeTick); themode = (cpu_mode)exemode; + UNSERIALIZE_SCALAR(iplLast); + UNSERIALIZE_SCALAR(iplLastTick); } } // namespace Kernel |