cpu: Create a PCEventScope class to abstract the scope of PCEvents.
authorGabe Black <gabeblack@google.com>
Thu, 10 Oct 2019 00:47:19 +0000 (17:47 -0700)
committerGabe Black <gabeblack@google.com>
Fri, 25 Oct 2019 22:42:31 +0000 (22:42 +0000)
This abstraction will allow scheduling PCEvents for a particular
ThreadContext, all contexts on a CPU, all contexts in a system, etc.,
and delegates scheduling and removing events to each particular scope.

Right now the PCEventQueue is the only implementor of the PCEventSCope
interface.

Change-Id: I8fb62931511136229915c2e19d36aae7ffdec9df
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22099
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
13 files changed:
src/arch/alpha/freebsd/system.hh
src/arch/alpha/idle_event.hh
src/arch/alpha/linux/system.hh
src/arch/arm/linux/system.hh
src/arch/mips/idle_event.hh
src/arch/mips/linux/system.hh
src/arch/riscv/idle_event.hh
src/base/remote_gdb.cc
src/cpu/pc_event.cc
src/cpu/pc_event.hh
src/kern/freebsd/events.hh
src/kern/linux/events.hh
src/kern/system_events.hh

index 48f6238c0f364831b95a6eb2f136ec27dc5f65c0..1a8bb93660de094384dd3ca912bad628338b0d41 100644 (file)
@@ -42,9 +42,9 @@ class FreebsdAlphaSystem : public AlphaSystem
     class SkipCalibrateClocksEvent : public SkipFuncEvent
     {
       public:
-        SkipCalibrateClocksEvent(PCEventQueue *q, const std::string &desc,
+        SkipCalibrateClocksEvent(PCEventScope *s, const std::string &desc,
                                  Addr addr)
-            : SkipFuncEvent(q, desc, addr) {}
+            : SkipFuncEvent(s, desc, addr) {}
         virtual void process(ThreadContext *tc);
     };
 
index 97d5bdd6e2865d8ae9a249218ac0573218fdb73a..b3b53daeaf4c2947621c64776220145d6c5b8ad8 100644 (file)
@@ -38,8 +38,8 @@
 class IdleStartEvent : public PCEvent
 {
   public:
-    IdleStartEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : PCEvent(q, desc, addr)
+    IdleStartEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : PCEvent(s, desc, addr)
     {}
     virtual void process(ThreadContext *tc);
 };
index 8ea387e74a56ea12628df18a85eafca2d7cec607..2477d426e39e07438f0c521d0d8c0979032e3f4a 100644 (file)
@@ -53,15 +53,15 @@ class LinuxAlphaSystem : public AlphaSystem
   private:
     struct SkipDelayLoopEvent : public SkipFuncEvent
     {
-        SkipDelayLoopEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-            : SkipFuncEvent(q, desc, addr) {}
+        SkipDelayLoopEvent(PCEventScope *s, const std::string &desc, Addr addr)
+            : SkipFuncEvent(s, desc, addr) {}
         virtual void process(ThreadContext *tc);
     };
 
     struct PrintThreadInfo : public PCEvent
     {
-        PrintThreadInfo(PCEventQueue *q, const std::string &desc, Addr addr)
-            : PCEvent(q, desc, addr) {}
+        PrintThreadInfo(PCEventScope *s, const std::string &desc, Addr addr)
+            : PCEvent(s, desc, addr) {}
         virtual void process(ThreadContext *tc);
     };
 
index 247ebae1355032d8bebc80b4270a0d29235e6622..098ceda2ec115e875bd58e465d6a3a8f3bf52e03 100644 (file)
@@ -127,8 +127,8 @@ class LinuxArmSystem : public GenericArmSystem
 class DumpStatsPCEvent : public PCEvent
 {
   public:
-    DumpStatsPCEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : PCEvent(q, desc, addr)
+    DumpStatsPCEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : PCEvent(s, desc, addr)
     {}
 
     virtual void process(ThreadContext* tc);
@@ -140,8 +140,8 @@ class DumpStatsPCEvent : public PCEvent
 
 class DumpStatsPCEvent64 : public DumpStatsPCEvent {
   public:
-    DumpStatsPCEvent64(PCEventQueue *q, const std::string &desc, Addr addr)
-        : DumpStatsPCEvent(q, desc, addr)
+    DumpStatsPCEvent64(PCEventScope *s, const std::string &desc, Addr addr)
+        : DumpStatsPCEvent(s, desc, addr)
     {}
   private:
     void getTaskDetails(ThreadContext *tc, uint32_t &pid, uint32_t &tgid,
index 3f96ce3e0f79b8a40f30013ed60ee8613e41bccf..c65be0d0c71accc4c82f6a30b8ac60700b49dd25 100644 (file)
@@ -38,8 +38,8 @@
 class IdleStartEvent : public PCEvent
 {
   public:
-    IdleStartEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : PCEvent(q, desc, addr)
+    IdleStartEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : PCEvent(s, desc, addr)
     {}
     virtual void process(ThreadContext *tc);
 };
index 55e47bbb25080c8e28aca972c5ad19054dee7330..2b8526b635993ebd56f214f0d581406916e53434 100644 (file)
@@ -54,16 +54,16 @@ class LinuxMipsSystem : public MipsSystem
     class SkipDelayLoopEvent : public SkipFuncEvent
     {
       public:
-        SkipDelayLoopEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-            : SkipFuncEvent(q, desc, addr) {}
+        SkipDelayLoopEvent(PCEventScope *s, const std::string &desc, Addr addr)
+            : SkipFuncEvent(s, desc, addr) {}
         virtual void process(ThreadContext *tc);
     };
 
     class PrintThreadInfo : public PCEvent
     {
       public:
-        PrintThreadInfo(PCEventQueue *q, const std::string &desc, Addr addr)
-            : PCEvent(q, desc, addr) {}
+        PrintThreadInfo(PCEventScope *s, const std::string &desc, Addr addr)
+            : PCEvent(s, desc, addr) {}
         virtual void process(ThreadContext *tc);
     };
 
index e77ae59f56d62b3fae5021d7f8d80f67138786c5..bcba05bf110b82d6fee1bf0728151ae958efc526 100644 (file)
@@ -38,8 +38,8 @@
 class IdleStartEvent : public PCEvent
 {
   public:
-    IdleStartEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : PCEvent(q, desc, addr)
+    IdleStartEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : PCEvent(s, desc, addr)
     {}
     virtual void process(ThreadContext *tc);
 };
index 77b3fbc20dbac81c50b1f8c52379603b49eebb34..d0ccde56615e8fa582d588026095d480eb7eb381 100644 (file)
@@ -175,8 +175,8 @@ class HardBreakpoint : public PCEvent
     int refcount;
 
   public:
-    HardBreakpoint(BaseRemoteGDB *_gdb, PCEventQueue *q, Addr pc)
-        : PCEvent(q, "HardBreakpoint Event", pc),
+    HardBreakpoint(BaseRemoteGDB *_gdb, PCEventScope *s, Addr pc)
+        : PCEvent(s, "HardBreakpoint Event", pc),
           gdb(_gdb), refcount(0)
     {
         DPRINTF(GDBMisc, "creating hardware breakpoint at %#x\n", evpc);
index 60e781ba8eced63762e3be95d9c43c757ae27cd4..65094f0ad6f82fd447d6c6498773f315658c72ae 100644 (file)
@@ -126,9 +126,9 @@ PCEventQueue::equal_range(Addr pc)
     return std::equal_range(pcMap.begin(), pcMap.end(), pc, MapCompare());
 }
 
-BreakPCEvent::BreakPCEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+BreakPCEvent::BreakPCEvent(PCEventScope *s, const std::string &desc, Addr addr,
                            bool del)
-    : PCEvent(q, desc, addr), remove(del)
+    : PCEvent(s, desc, addr), remove(del)
 {
 }
 
@@ -142,8 +142,8 @@ BreakPCEvent::process(ThreadContext *tc)
         delete this;
 }
 
-PanicPCEvent::PanicPCEvent(PCEventQueue *q, const std::string &desc, Addr pc)
-    : PCEvent(q, desc, pc)
+PanicPCEvent::PanicPCEvent(PCEventScope *s, const std::string &desc, Addr pc)
+    : PCEvent(s, desc, pc)
 {
 }
 
index 2289c876c632b87485fd4220068733eab76e2ea1..0654ca54e99d2e4dd8d7cbe154aab755ce58f50e 100644 (file)
 class ThreadContext;
 class PCEventQueue;
 class System;
+class PCEventScope;
 
 class PCEvent
 {
   protected:
     std::string description;
-    PCEventQueue *queue;
+    PCEventScope *scope;
     Addr evpc;
 
   public:
-    PCEvent(PCEventQueue *q, const std::string &desc, Addr pc);
+    PCEvent(PCEventScope *q, const std::string &desc, Addr pc);
 
-    virtual ~PCEvent() { if (queue) remove(); }
+    virtual ~PCEvent() { if (scope) remove(); }
 
     // for DPRINTF
     virtual const std::string name() const { return description; }
@@ -63,7 +64,14 @@ class PCEvent
     virtual void process(ThreadContext *tc) = 0;
 };
 
-class PCEventQueue
+class PCEventScope
+{
+  public:
+    virtual bool remove(PCEvent *event) = 0;
+    virtual bool schedule(PCEvent *event) = 0;
+};
+
+class PCEventQueue : public PCEventScope
 {
   protected:
     class MapCompare {
@@ -103,8 +111,8 @@ class PCEventQueue
     PCEventQueue();
     ~PCEventQueue();
 
-    bool remove(PCEvent *event);
-    bool schedule(PCEvent *event);
+    bool remove(PCEvent *event) override;
+    bool schedule(PCEvent *event) override;
     bool service(ThreadContext *tc)
     {
         if (pcMap.empty())
@@ -121,19 +129,19 @@ class PCEventQueue
 
 
 inline
-PCEvent::PCEvent(PCEventQueue *q, const std::string &desc, Addr pc)
-    : description(desc), queue(q), evpc(pc)
+PCEvent::PCEvent(PCEventScope *s, const std::string &desc, Addr pc)
+    : description(desc), scope(s), evpc(pc)
 {
-    queue->schedule(this);
+    scope->schedule(this);
 }
 
 inline bool
 PCEvent::remove()
 {
-    if (!queue)
+    if (!scope)
         panic("cannot remove an uninitialized event;");
 
-    return queue->remove(this);
+    return scope->remove(this);
 }
 
 class BreakPCEvent : public PCEvent
@@ -142,7 +150,7 @@ class BreakPCEvent : public PCEvent
     bool remove;
 
   public:
-    BreakPCEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+    BreakPCEvent(PCEventScope *s, const std::string &desc, Addr addr,
                  bool del = false);
     virtual void process(ThreadContext *tc);
 };
@@ -150,7 +158,7 @@ class BreakPCEvent : public PCEvent
 class PanicPCEvent : public PCEvent
 {
   public:
-    PanicPCEvent(PCEventQueue *q, const std::string &desc, Addr pc);
+    PanicPCEvent(PCEventScope *s, const std::string &desc, Addr pc);
     virtual void process(ThreadContext *tc);
 };
 
index 1d3faa935a7ba7f2c26fe6419758811bdff4416f..ebee3e08460586c58d928e098a71bdf1b73753bc 100644 (file)
@@ -57,9 +57,9 @@ class UDelayEvent : public SkipFuncEvent
     uint64_t argMultToNs;
 
   public:
-    UDelayEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+    UDelayEvent(PCEventScope *s, const std::string &desc, Addr addr,
             uint64_t mult, uint64_t div)
-        : SkipFuncEvent(q, desc, addr), argDivToNs(div), argMultToNs(mult) {}
+        : SkipFuncEvent(s, desc, addr), argDivToNs(div), argMultToNs(mult) {}
     virtual void process(ThreadContext *xc);
 };
 
index b8aad9d79e78574b6fa45ae17de620bfb6c3df04..d4c77bf68b2dab27b91f4af940419001bf34fe0d 100644 (file)
@@ -51,8 +51,8 @@ namespace Linux {
 class DebugPrintkEvent : public SkipFuncEvent
 {
   public:
-    DebugPrintkEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : SkipFuncEvent(q, desc, addr) {}
+    DebugPrintkEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : SkipFuncEvent(s, desc, addr) {}
     virtual void process(ThreadContext *xc);
 };
 
@@ -70,9 +70,9 @@ class DmesgDumpEvent : public PCEvent
     std::string fname;
 
   public:
-    DmesgDumpEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+    DmesgDumpEvent(PCEventScope *s, const std::string &desc, Addr addr,
                    const std::string &_fname)
-        : PCEvent(q, desc, addr), fname(_fname) {}
+        : PCEvent(s, desc, addr), fname(_fname) {}
     virtual void process(ThreadContext *xc);
 };
 
@@ -90,9 +90,9 @@ class KernelPanicEvent : public PCEvent
     std::string fname;
 
   public:
-    KernelPanicEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+    KernelPanicEvent(PCEventScope *s, const std::string &desc, Addr addr,
                const std::string &_fname)
-        : PCEvent(q, desc, addr), fname(_fname) {}
+        : PCEvent(s, desc, addr), fname(_fname) {}
     virtual void process(ThreadContext *xc);
 };
 
@@ -116,9 +116,9 @@ class UDelayEvent : public SkipFuncEvent
     uint64_t argMultToNs;
 
   public:
-    UDelayEvent(PCEventQueue *q, const std::string &desc, Addr addr,
+    UDelayEvent(PCEventScope *s, const std::string &desc, Addr addr,
             uint64_t mult, uint64_t div)
-        : SkipFuncEvent(q, desc, addr), argDivToNs(div), argMultToNs(mult) {}
+        : SkipFuncEvent(s, desc, addr), argDivToNs(div), argMultToNs(mult) {}
     virtual void process(ThreadContext *xc);
 };
 
index 58cbc480838bfb0bf6144657388050684d1c116b..9674439376248ac45b53dd843b25a08c44139750 100644 (file)
@@ -38,8 +38,8 @@
 class SkipFuncEvent : public PCEvent
 {
   public:
-    SkipFuncEvent(PCEventQueue *q, const std::string &desc, Addr addr)
-        : PCEvent(q, desc, addr)
+    SkipFuncEvent(PCEventScope *s, const std::string &desc, Addr addr)
+        : PCEvent(s, desc, addr)
     {}
     virtual void process(ThreadContext *tc);
 };