cpu: Create a PCEventScope class to abstract the scope of PCEvents.
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>
This commit is contained in:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -40,18 +40,19 @@
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user