sim: Make it possible to override the breakpoint length check.

The check which makes sure the length of the breakpoint being written is the
same as a MachInst is only correct on fixed instruction width ISAs. Instead of
incorrectly applying that check to all ISAs, this change makes that the
default check and lets ISA specific GDB classes override it.
This commit is contained in:
Gabe Black
2014-12-03 03:27:19 -08:00
parent b7dc4ba516
commit 2d9dae01fb
2 changed files with 12 additions and 4 deletions

View File

@@ -520,6 +520,12 @@ PCEventQueue *BaseRemoteGDB::getPcEventQueue()
return &system->pcEventQueue;
}
bool
BaseRemoteGDB::checkBpLen(size_t len)
{
return len == sizeof(MachInst);
}
BaseRemoteGDB::HardBreakpoint::HardBreakpoint(BaseRemoteGDB *_gdb, Addr pc)
: PCEvent(_gdb->getPcEventQueue(), "HardBreakpoint Event", pc),
gdb(_gdb), refcount(0)
@@ -539,7 +545,7 @@ BaseRemoteGDB::HardBreakpoint::process(ThreadContext *tc)
bool
BaseRemoteGDB::insertSoftBreak(Addr addr, size_t len)
{
if (len != sizeof(TheISA::MachInst))
if (!checkBpLen(len))
panic("invalid length\n");
return insertHardBreak(addr, len);
@@ -548,7 +554,7 @@ BaseRemoteGDB::insertSoftBreak(Addr addr, size_t len)
bool
BaseRemoteGDB::removeSoftBreak(Addr addr, size_t len)
{
if (len != sizeof(MachInst))
if (!checkBpLen(len))
panic("invalid length\n");
return removeHardBreak(addr, len);
@@ -557,7 +563,7 @@ BaseRemoteGDB::removeSoftBreak(Addr addr, size_t len)
bool
BaseRemoteGDB::insertHardBreak(Addr addr, size_t len)
{
if (len != sizeof(MachInst))
if (!checkBpLen(len))
panic("invalid length\n");
DPRINTF(GDBMisc, "inserting hardware breakpoint at %#x\n", addr);
@@ -574,7 +580,7 @@ BaseRemoteGDB::insertHardBreak(Addr addr, size_t len)
bool
BaseRemoteGDB::removeHardBreak(Addr addr, size_t len)
{
if (len != sizeof(MachInst))
if (!checkBpLen(len))
panic("invalid length\n");
DPRINTF(GDBMisc, "removing hardware breakpoint at %#x\n", addr);

View File

@@ -192,6 +192,8 @@ class BaseRemoteGDB
PCEventQueue *getPcEventQueue();
protected:
virtual bool checkBpLen(size_t len);
class HardBreakpoint : public PCEvent
{
private: