misc: Add some utility functions for schedule inst commit events.
These can be used to simplify the implementation of single step in derived classes.
This commit is contained in:
parent
cddf988bfd
commit
16c9b41616
2 changed files with 31 additions and 8 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue