summaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
Diffstat (limited to 'src/base')
-rw-r--r--src/base/remote_gdb.cc30
-rw-r--r--src/base/remote_gdb.hh18
2 files changed, 41 insertions, 7 deletions
diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc
index 97d763803..e603fb90f 100644
--- a/src/base/remote_gdb.cc
+++ b/src/base/remote_gdb.cc
@@ -262,11 +262,18 @@ BaseRemoteGDB::TrapEvent::process()
gdb->trap(_type);
}
-BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c, size_t cacheSize)
- : inputEvent(NULL), trapEvent(this), listener(NULL), number(-1), fd(-1),
- active(false), attached(false),
- system(_system), context(c),
- gdbregs(cacheSize)
+void
+BaseRemoteGDB::SingleStepEvent::process()
+{
+ if (!gdb->singleStepEvent.scheduled())
+ gdb->scheduleInstCommitEvent(&gdb->singleStepEvent, 1);
+ gdb->trap(SIGTRAP);
+}
+
+BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c,
+ size_t cacheSize) : inputEvent(NULL), trapEvent(this), listener(NULL),
+ number(-1), fd(-1), active(false), attached(false), system(_system),
+ context(c), gdbregs(cacheSize), singleStepEvent(this)
{
memset(gdbregs.regs, 0, gdbregs.bytes());
}
@@ -525,6 +532,19 @@ BaseRemoteGDB::write(Addr vaddr, size_t size, const char *data)
return true;
}
+void
+BaseRemoteGDB::clearSingleStep()
+{
+ descheduleInstCommitEvent(&singleStepEvent);
+}
+
+void
+BaseRemoteGDB::setSingleStep()
+{
+ if (!singleStepEvent.scheduled())
+ scheduleInstCommitEvent(&singleStepEvent, 1);
+}
+
PCEventQueue *BaseRemoteGDB::getPcEventQueue()
{
return &system->pcEventQueue;
diff --git a/src/base/remote_gdb.hh b/src/base/remote_gdb.hh
index 62f98f29a..6cca485e3 100644
--- a/src/base/remote_gdb.hh
+++ b/src/base/remote_gdb.hh
@@ -209,11 +209,25 @@ class BaseRemoteGDB
}
protected:
+ class SingleStepEvent : public Event
+ {
+ protected:
+ BaseRemoteGDB *gdb;
+
+ public:
+ SingleStepEvent(BaseRemoteGDB *g) : gdb(g)
+ {}
+
+ void process();
+ };
+
+ SingleStepEvent singleStepEvent;
+
virtual void getregs() = 0;
virtual void setregs() = 0;
- virtual void clearSingleStep() = 0;
- virtual void setSingleStep() = 0;
+ void clearSingleStep();
+ void setSingleStep();
PCEventQueue *getPcEventQueue();
EventQueue *getComInstEventQueue();