summaryrefslogtreecommitdiff
path: root/src/arch/alpha
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-08-25 18:02:01 -0700
committerGabe Black <gabeblack@google.com>2017-09-11 04:59:01 +0000
commita50bcfb436da42dbd6005da681ed91bb768684f4 (patch)
tree4a8e021bc59cd0d3dba43939e035bfac67d089bf /src/arch/alpha
parentb9d8700a38ccecfbe97c152bc9fc3b7c3b09e9a2 (diff)
downloadgem5-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')
-rw-r--r--src/arch/alpha/kernel_stats.cc52
-rw-r--r--src/arch/alpha/kernel_stats.hh13
2 files changed, 63 insertions, 2 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
diff --git a/src/arch/alpha/kernel_stats.hh b/src/arch/alpha/kernel_stats.hh
index 3b2b5a0c0..1bedeb0e6 100644
--- a/src/arch/alpha/kernel_stats.hh
+++ b/src/arch/alpha/kernel_stats.hh
@@ -59,7 +59,8 @@ class Statistics : public ::Kernel::Statistics
private:
Stats::Vector _callpal;
-// Stats::Vector _faults;
+
+ Stats::Scalar _hwrei;
Stats::Vector _mode;
Stats::Vector _modeGood;
@@ -68,6 +69,15 @@ class Statistics : public ::Kernel::Statistics
Stats::Scalar _swap_context;
+ Stats::Vector _iplCount;
+ Stats::Vector _iplGood;
+ Stats::Vector _iplTicks;
+ Stats::Formula _iplUsed;
+
+ private:
+ int iplLast;
+ Tick iplLastTick;
+
public:
Statistics();
@@ -78,6 +88,7 @@ class Statistics : public ::Kernel::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);