diff options
Diffstat (limited to 'src/base')
-rw-r--r-- | src/base/remote_gdb.cc | 30 | ||||
-rw-r--r-- | src/base/remote_gdb.hh | 18 |
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(); |