Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/18429

Change subject: arch: cpu: Track kernel stats using the base ISA agnostic type.
......................................................................

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
---
M src/arch/alpha/ev5.cc
M src/arch/alpha/idle_event.cc
M src/cpu/checker/cpu.cc
M src/cpu/checker/thread_context.hh
M src/cpu/o3/cpu.cc
M src/cpu/o3/regfile.hh
M src/cpu/o3/thread_context.hh
M src/cpu/simple/base.cc
M src/cpu/simple_thread.hh
M src/cpu/thread_context.cc
M src/cpu/thread_context.hh
M src/cpu/thread_state.cc
M src/cpu/thread_state.hh
M src/kern/kernel_stats.hh
M src/sim/pseudo_inst.cc
15 files changed, 53 insertions(+), 46 deletions(-)



diff --git a/src/arch/alpha/ev5.cc b/src/arch/alpha/ev5.cc
index bac8e8d..e3e025e 100644
--- a/src/arch/alpha/ev5.cc
+++ b/src/arch/alpha/ev5.cc
@@ -219,6 +219,9 @@
 void
 ISA::setIpr(int idx, uint64_t val, ThreadContext *tc)
 {
+    auto *stats = dynamic_cast<AlphaISA::Kernel::Statistics *>(
+            tc->getKernelStats());
+    assert(stats || !tc->getKernelStats());
     switch (idx) {
       case IPR_PALtemp0:
       case IPR_PALtemp1:
@@ -267,8 +270,8 @@

       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 @@
       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 @@
 Fault
 SimpleThread::hwrei()
 {
+ auto *stats = dynamic_cast<AlphaISA::Kernel::Statistics *>(kernelStats);
+    assert(stats || !kernelStats);
+
     PCState pc = pcState();
     if (!(pc.pc() & 0x3))
         return std::make_shared<UnimplementedOpcodeFault>();
@@ -494,8 +500,8 @@

     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 @@
 bool
 SimpleThread::simPalCheck(int palFunc)
 {
-    if (kernelStats)
-        kernelStats->callpal(palFunc, this);
+ auto *stats = dynamic_cast<AlphaISA::Kernel::Statistics *>(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 080dcb2..df8a0c6 100644
--- a/src/arch/alpha/idle_event.cc
+++ b/src/arch/alpha/idle_event.cc
@@ -41,7 +41,10 @@
 {
     if (tc->getKernelStats()) {
         RegVal val = tc->readMiscRegNoEffect(IPR_PALtemp23);
-        tc->getKernelStats()->setIdleProcess(val, tc);
+        auto *stats = dynamic_cast<AlphaISA::Kernel::Statistics *>(
+                tc->getKernelStats());
+        assert(stats);
+        stats->setIdleProcess(val, tc);
     }
     remove();
 }
diff --git a/src/cpu/checker/cpu.cc b/src/cpu/checker/cpu.cc
index fe1c3d4..7f8eada 100644
--- a/src/cpu/checker/cpu.cc
+++ b/src/cpu/checker/cpu.cc
@@ -47,7 +47,6 @@
 #include <string>

 #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 26973cd..ed8add6 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 @@

     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 621a6a4..70417d5 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -925,7 +925,10 @@
     // 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<AlphaISA::Kernel::Statistics *>(
+            this->thread[tid]->kernelStats);
+    assert(stats);
+    stats->hwrei();

     // FIXME: XXX check for interrupts? XXX
 #endif
@@ -937,9 +940,10 @@
 FullO3CPU<Impl>::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<AlphaISA::Kernel::Statistics *>(
+            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 d2fcd07..d4b6602 100644
--- a/src/cpu/o3/regfile.hh
+++ b/src/cpu/o3/regfile.hh
@@ -48,7 +48,6 @@
 #include <vector>

 #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 b87aac4..e5f0187 100644
--- a/src/cpu/o3/thread_context.hh
+++ b/src/cpu/o3/thread_context.hh
@@ -119,7 +119,7 @@
     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 49bc1ad..0722e6b 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 0d415dc..33f0bbd 100644
--- a/src/cpu/simple_thread.hh
+++ b/src/cpu/simple_thread.hh
@@ -74,10 +74,8 @@
 class FunctionProfile;
 class ProfileNode;

-namespace TheISA {
-    namespace Kernel {
-        class Statistics;
-    }
+namespace Kernel {
+    class Statistics;
 }

 /**
@@ -212,7 +210,7 @@

     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 35d96a4..dea3901 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 @@

     suspend();
     if (getKernelStats())
-       getKernelStats()->quiesce();
+        getKernelStats()->quiesce();
 }


diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh
index 09f2a1e..42ff0de 100644
--- a/src/cpu/thread_context.hh
+++ b/src/cpu/thread_context.hh
@@ -70,10 +70,8 @@
 class PortProxy;
 class Process;
 class System;
-namespace TheISA {
-    namespace Kernel {
-        class Statistics;
-    }
+namespace Kernel {
+    class Statistics;
 }

 /**
@@ -150,7 +148,7 @@

     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 92be179..acb2971 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 e3b6af9..1243289 100644
--- a/src/cpu/thread_state.hh
+++ b/src/cpu/thread_state.hh
@@ -42,10 +42,8 @@
 class EndQuiesceEvent;
 class FunctionProfile;
 class ProfileNode;
-namespace TheISA {
-    namespace Kernel {
-        class Statistics;
-    }
+namespace Kernel {
+    class Statistics;
 }

 class Checkpoint;
@@ -99,7 +97,7 @@

     void profileSample();

-    TheISA::Kernel::Statistics *getKernelStats() { return kernelStats; }
+    Kernel::Statistics *getKernelStats() { return kernelStats; }

     PortProxy &getPhysProxy();

@@ -186,7 +184,7 @@
     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 41071ce..37dbb9f 100644
--- a/src/kern/kernel_stats.hh
+++ b/src/kern/kernel_stats.hh
@@ -53,7 +53,7 @@
     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 dc37a8c..8ffb13e 100644
--- a/src/sim/pseudo_inst.cc
+++ b/src/sim/pseudo_inst.cc
@@ -53,7 +53,6 @@

 #include <gem5/asm/generic/m5ops.h>

-#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"

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/18429
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I8309d49019124f6bea1482aaea5b5b34e8c97433
Gerrit-Change-Number: 18429
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to