From eea1fb6fc887e523f23cd3141869da59e7047c55 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 27 Apr 2019 19:51:20 -0700 Subject: [PATCH] arch: cpu: Track kernel stats using the base ISA agnostic type. Then cast to the ISA specific type when necessary. This removes (mostly) an ISA specific aspect to some of the interfaces. The ISA specific version of the kernel stats still needs to be constructed and stored in a few places which means that kernel_stats.hh still needs to be a switching arch header, for instance. In the future, I'd like to make the kernel its own object like the Process objects in SE mode, and then it would be able to instantiate and maintain its own stats. Change-Id: I8309d49019124f6bea1482aaea5b5b34e8c97433 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18429 Tested-by: kokoro Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg --- src/arch/alpha/ev5.cc | 33 ++++++++++++++++++++----------- src/arch/alpha/idle_event.cc | 5 ++++- src/cpu/checker/cpu.cc | 1 - src/cpu/checker/thread_context.hh | 8 ++++---- src/cpu/o3/cpu.cc | 12 +++++++---- src/cpu/o3/regfile.hh | 1 - src/cpu/o3/thread_context.hh | 2 +- src/cpu/simple/base.cc | 1 - src/cpu/simple_thread.hh | 8 +++----- src/cpu/thread_context.cc | 4 ++-- src/cpu/thread_context.hh | 8 +++----- src/cpu/thread_state.cc | 2 +- src/cpu/thread_state.hh | 10 ++++------ src/kern/kernel_stats.hh | 2 +- src/sim/pseudo_inst.cc | 2 +- 15 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/arch/alpha/ev5.cc b/src/arch/alpha/ev5.cc index bac8e8d48a..e3e025e2f8 100644 --- a/src/arch/alpha/ev5.cc +++ b/src/arch/alpha/ev5.cc @@ -219,6 +219,9 @@ int break_ipl = -1; void ISA::setIpr(int idx, uint64_t val, ThreadContext *tc) { + auto *stats = dynamic_cast( + tc->getKernelStats()); + assert(stats || !tc->getKernelStats()); switch (idx) { case IPR_PALtemp0: case IPR_PALtemp1: @@ -267,8 +270,8 @@ ISA::setIpr(int idx, uint64_t val, ThreadContext *tc) case IPR_PALtemp23: // write entire quad w/ no side-effect - if (tc->getKernelStats()) - tc->getKernelStats()->context(ipr[idx], val, tc); + if (stats) + stats->context(ipr[idx], val, tc); ipr[idx] = val; break; @@ -291,17 +294,17 @@ ISA::setIpr(int idx, uint64_t val, ThreadContext *tc) case IPR_IPLR: // only write least significant five bits - interrupt level ipr[idx] = val & 0x1f; - if (tc->getKernelStats()) - tc->getKernelStats()->swpipl(ipr[idx]); + if (stats) + stats->swpipl(ipr[idx]); break; case IPR_DTB_CM: if (val & 0x18) { - if (tc->getKernelStats()) - tc->getKernelStats()->mode(Kernel::user, tc); + if (stats) + stats->mode(Kernel::user, tc); } else { - if (tc->getKernelStats()) - tc->getKernelStats()->mode(Kernel::kernel, tc); + if (stats) + stats->mode(Kernel::kernel, tc); } M5_FALLTHROUGH; @@ -485,6 +488,9 @@ using namespace AlphaISA; Fault SimpleThread::hwrei() { + auto *stats = dynamic_cast(kernelStats); + assert(stats || !kernelStats); + PCState pc = pcState(); if (!(pc.pc() & 0x3)) return std::make_shared(); @@ -494,8 +500,8 @@ SimpleThread::hwrei() CPA::cpa()->swAutoBegin(this, pc.npc()); - if (kernelStats) - kernelStats->hwrei(); + if (stats) + stats->hwrei(); // FIXME: XXX check for interrupts? XXX return NoFault; @@ -508,8 +514,11 @@ SimpleThread::hwrei() bool SimpleThread::simPalCheck(int palFunc) { - if (kernelStats) - kernelStats->callpal(palFunc, this); + auto *stats = dynamic_cast(kernelStats); + assert(stats || !kernelStats); + + if (stats) + stats->callpal(palFunc, this); switch (palFunc) { case PAL::halt: diff --git a/src/arch/alpha/idle_event.cc b/src/arch/alpha/idle_event.cc index 080dcb22c7..df8a0c6619 100644 --- a/src/arch/alpha/idle_event.cc +++ b/src/arch/alpha/idle_event.cc @@ -41,7 +41,10 @@ IdleStartEvent::process(ThreadContext *tc) { if (tc->getKernelStats()) { RegVal val = tc->readMiscRegNoEffect(IPR_PALtemp23); - tc->getKernelStats()->setIdleProcess(val, tc); + auto *stats = dynamic_cast( + tc->getKernelStats()); + assert(stats); + stats->setIdleProcess(val, tc); } remove(); } diff --git a/src/cpu/checker/cpu.cc b/src/cpu/checker/cpu.cc index fe1c3d4409..7f8eada4c4 100644 --- a/src/cpu/checker/cpu.cc +++ b/src/cpu/checker/cpu.cc @@ -47,7 +47,6 @@ #include #include "arch/generic/tlb.hh" -#include "arch/kernel_stats.hh" #include "arch/vtophys.hh" #include "cpu/base.hh" #include "cpu/simple_thread.hh" diff --git a/src/cpu/checker/thread_context.hh b/src/cpu/checker/thread_context.hh index 26973cdbfb..ed8add6624 100644 --- a/src/cpu/checker/thread_context.hh +++ b/src/cpu/checker/thread_context.hh @@ -52,10 +52,10 @@ #include "debug/Checker.hh" class EndQuiesceEvent; +namespace Kernel { + class Statistics; +}; namespace TheISA { - namespace Kernel { - class Statistics; - }; class Decoder; }; @@ -134,7 +134,7 @@ class CheckerThreadContext : public ThreadContext System *getSystemPtr() override { return actualTC->getSystemPtr(); } - TheISA::Kernel::Statistics * + ::Kernel::Statistics * getKernelStats() override { return actualTC->getKernelStats(); diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index 621a6a409b..70417d51f8 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -925,7 +925,10 @@ FullO3CPU::hwrei(ThreadID tid) // Need to clear the lock flag upon returning from an interrupt. this->setMiscRegNoEffect(AlphaISA::MISCREG_LOCKFLAG, false, tid); - this->thread[tid]->kernelStats->hwrei(); + auto *stats = dynamic_cast( + this->thread[tid]->kernelStats); + assert(stats); + stats->hwrei(); // FIXME: XXX check for interrupts? XXX #endif @@ -937,9 +940,10 @@ bool FullO3CPU::simPalCheck(int palFunc, ThreadID tid) { #if THE_ISA == ALPHA_ISA - if (this->thread[tid]->kernelStats) - this->thread[tid]->kernelStats->callpal(palFunc, - this->threadContexts[tid]); + auto *stats = dynamic_cast( + this->thread[tid]->kernelStats); + if (stats) + stats->callpal(palFunc, this->threadContexts[tid]); switch (palFunc) { case PAL::halt: diff --git a/src/cpu/o3/regfile.hh b/src/cpu/o3/regfile.hh index d2fcd0749a..d4b6602ad1 100644 --- a/src/cpu/o3/regfile.hh +++ b/src/cpu/o3/regfile.hh @@ -48,7 +48,6 @@ #include #include "arch/isa_traits.hh" -#include "arch/kernel_stats.hh" #include "arch/types.hh" #include "base/trace.hh" #include "config/the_isa.hh" diff --git a/src/cpu/o3/thread_context.hh b/src/cpu/o3/thread_context.hh index b87aac4a75..e5f01871bd 100644 --- a/src/cpu/o3/thread_context.hh +++ b/src/cpu/o3/thread_context.hh @@ -119,7 +119,7 @@ class O3ThreadContext : public ThreadContext System *getSystemPtr() override { return cpu->system; } /** Returns a pointer to this thread's kernel statistics. */ - TheISA::Kernel::Statistics * + ::Kernel::Statistics * getKernelStats() override { return thread->kernelStats; diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc index b687a17e05..298ba9f9e9 100644 --- a/src/cpu/simple/base.cc +++ b/src/cpu/simple/base.cc @@ -43,7 +43,6 @@ #include "cpu/simple/base.hh" -#include "arch/kernel_stats.hh" #include "arch/stacktrace.hh" #include "arch/utility.hh" #include "arch/vtophys.hh" diff --git a/src/cpu/simple_thread.hh b/src/cpu/simple_thread.hh index 0d415dc161..33f0bbd8a2 100644 --- a/src/cpu/simple_thread.hh +++ b/src/cpu/simple_thread.hh @@ -74,10 +74,8 @@ class CheckerCPU; class FunctionProfile; class ProfileNode; -namespace TheISA { - namespace Kernel { - class Statistics; - } +namespace Kernel { + class Statistics; } /** @@ -212,7 +210,7 @@ class SimpleThread : public ThreadState, public ThreadContext System *getSystemPtr() override { return system; } - TheISA::Kernel::Statistics * + Kernel::Statistics * getKernelStats() override { return ThreadState::getKernelStats(); diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc index 35d96a4e7c..dea39015f1 100644 --- a/src/cpu/thread_context.cc +++ b/src/cpu/thread_context.cc @@ -44,7 +44,6 @@ #include "cpu/thread_context.hh" #include "arch/generic/vec_pred_reg.hh" -#include "arch/kernel_stats.hh" #include "base/logging.hh" #include "base/trace.hh" #include "config/the_isa.hh" @@ -52,6 +51,7 @@ #include "cpu/quiesce_event.hh" #include "debug/Context.hh" #include "debug/Quiesce.hh" +#include "kern/kernel_stats.hh" #include "params/BaseCPU.hh" #include "sim/full_system.hh" @@ -139,7 +139,7 @@ ThreadContext::quiesce() suspend(); if (getKernelStats()) - getKernelStats()->quiesce(); + getKernelStats()->quiesce(); } diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh index 00e97b23c2..bdf5a00866 100644 --- a/src/cpu/thread_context.hh +++ b/src/cpu/thread_context.hh @@ -70,10 +70,8 @@ class FSTranslatingPortProxy; class PortProxy; class Process; class System; -namespace TheISA { - namespace Kernel { - class Statistics; - } +namespace Kernel { + class Statistics; } /** @@ -150,7 +148,7 @@ class ThreadContext virtual System *getSystemPtr() = 0; - virtual TheISA::Kernel::Statistics *getKernelStats() = 0; + virtual ::Kernel::Statistics *getKernelStats() = 0; virtual PortProxy &getPhysProxy() = 0; diff --git a/src/cpu/thread_state.cc b/src/cpu/thread_state.cc index 92be17977e..acb297113f 100644 --- a/src/cpu/thread_state.cc +++ b/src/cpu/thread_state.cc @@ -30,11 +30,11 @@ #include "cpu/thread_state.hh" -#include "arch/kernel_stats.hh" #include "base/output.hh" #include "cpu/base.hh" #include "cpu/profile.hh" #include "cpu/quiesce_event.hh" +#include "kern/kernel_stats.hh" #include "mem/fs_translating_port_proxy.hh" #include "mem/port.hh" #include "mem/port_proxy.hh" diff --git a/src/cpu/thread_state.hh b/src/cpu/thread_state.hh index 574193d0ef..2006339221 100644 --- a/src/cpu/thread_state.hh +++ b/src/cpu/thread_state.hh @@ -41,10 +41,8 @@ class EndQuiesceEvent; class FunctionProfile; class ProfileNode; -namespace TheISA { - namespace Kernel { - class Statistics; - } +namespace Kernel { + class Statistics; } class Checkpoint; @@ -98,7 +96,7 @@ struct ThreadState : public Serializable { void profileSample(); - TheISA::Kernel::Statistics *getKernelStats() { return kernelStats; } + Kernel::Statistics *getKernelStats() { return kernelStats; } PortProxy &getPhysProxy(); @@ -185,7 +183,7 @@ struct ThreadState : public Serializable { Addr profilePC; EndQuiesceEvent *quiesceEvent; - TheISA::Kernel::Statistics *kernelStats; + Kernel::Statistics *kernelStats; protected: Process *process; diff --git a/src/kern/kernel_stats.hh b/src/kern/kernel_stats.hh index 41071ce08c..37dbb9f153 100644 --- a/src/kern/kernel_stats.hh +++ b/src/kern/kernel_stats.hh @@ -53,7 +53,7 @@ class Statistics : public Serializable virtual ~Statistics() {} const std::string name() const { return myname; } - void regStats(const std::string &name); + virtual void regStats(const std::string &name); public: void arm() { _arm++; } diff --git a/src/sim/pseudo_inst.cc b/src/sim/pseudo_inst.cc index dc37a8c717..8ffb13e3b3 100644 --- a/src/sim/pseudo_inst.cc +++ b/src/sim/pseudo_inst.cc @@ -53,7 +53,6 @@ #include -#include "arch/kernel_stats.hh" #include "arch/pseudo_inst.hh" #include "arch/utility.hh" #include "arch/vtophys.hh" @@ -68,6 +67,7 @@ #include "debug/Quiesce.hh" #include "debug/WorkItems.hh" #include "dev/net/dist_iface.hh" +#include "kern/kernel_stats.hh" #include "params/BaseCPU.hh" #include "sim/full_system.hh" #include "sim/initparam_keys.hh"