From 16c9b41616312bfef0b5859f7cebe24e8c17d9da Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 5 Dec 2014 22:35:47 -0800 Subject: [PATCH] misc: Add some utility functions for schedule inst commit events. These can be used to simplify the implementation of single step in derived classes. --- src/base/remote_gdb.cc | 33 +++++++++++++++++++++++++-------- src/base/remote_gdb.hh | 6 ++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc index 50bb78259..97d763803 100644 --- a/src/base/remote_gdb.cc +++ b/src/base/remote_gdb.cc @@ -141,7 +141,6 @@ #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) { diff --git a/src/base/remote_gdb.hh b/src/base/remote_gdb.hh index 373f05343..62f98f29a 100644 --- a/src/base/remote_gdb.hh +++ b/src/base/remote_gdb.hh @@ -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); -- 2.30.2