misc: Add some utility functions for schedule inst commit events.
authorGabe Black <gabeblack@google.com>
Sat, 6 Dec 2014 06:35:47 +0000 (22:35 -0800)
committerGabe Black <gabeblack@google.com>
Sat, 6 Dec 2014 06:35:47 +0000 (22:35 -0800)
These can be used to simplify the implementation of single step in derived
classes.

src/base/remote_gdb.cc
src/base/remote_gdb.hh

index 50bb782591f7bc77eae4f37776d932d961c9cfbc..97d76380363a9feab8f3b1f2370e40dce35555a4 100644 (file)
 #include "sim/system.hh"
 
 using namespace std;
-using namespace Debug;
 using namespace TheISA;
 
 #ifndef NDEBUG
@@ -248,16 +247,11 @@ BaseRemoteGDB::InputEvent::InputEvent(BaseRemoteGDB *g, int fd, int e)
 void
 BaseRemoteGDB::InputEvent::process(int revent)
 {
-    BaseCPU *cpu = gdb->context->getCpuPtr();
-    EventQueue *eq = cpu->comInstEventQueue[gdb->context->threadId()];
     if (revent & POLLIN) {
         gdb->trapEvent.type(SIGILL);
-        // Here "ticks" aren't simulator ticks which measure time, they're
-        // instructions committed by the CPU.
-        eq->schedule(&gdb->trapEvent, eq->getCurTick());
+        gdb->scheduleInstCommitEvent(&gdb->trapEvent, 0);
     } else if (revent & POLLNVAL) {
-        if (gdb->trapEvent.scheduled())
-            eq->deschedule(&gdb->trapEvent);
+        gdb->descheduleInstCommitEvent(&gdb->trapEvent);
         gdb->detach();
     }
 }
@@ -536,6 +530,29 @@ PCEventQueue *BaseRemoteGDB::getPcEventQueue()
     return &system->pcEventQueue;
 }
 
+EventQueue *
+BaseRemoteGDB::getComInstEventQueue()
+{
+    BaseCPU *cpu = context->getCpuPtr();
+    return cpu->comInstEventQueue[context->threadId()];
+}
+
+void
+BaseRemoteGDB::scheduleInstCommitEvent(Event *ev, int delta)
+{
+    EventQueue *eq = getComInstEventQueue();
+    // Here "ticks" aren't simulator ticks which measure time, they're
+    // instructions committed by the CPU.
+    eq->schedule(ev, eq->getCurTick() + delta);
+}
+
+void
+BaseRemoteGDB::descheduleInstCommitEvent(Event *ev)
+{
+    if (ev->scheduled())
+        getComInstEventQueue()->deschedule(ev);
+}
+
 bool
 BaseRemoteGDB::checkBpLen(size_t len)
 {
index 373f05343d14f513a154d0dd0a5c6ceca85c911e..62f98f29a7db910da2360ebb59f3745bd74423ea 100644 (file)
@@ -216,6 +216,12 @@ class BaseRemoteGDB
     virtual void setSingleStep() = 0;
 
     PCEventQueue *getPcEventQueue();
+    EventQueue *getComInstEventQueue();
+
+    /// Schedule an event which will be triggered "delta" instructions later.
+    void scheduleInstCommitEvent(Event *ev, int delta);
+    /// Deschedule an instruction count based event.
+    void descheduleInstCommitEvent(Event *ev);
 
   protected:
     virtual bool checkBpLen(size_t len);