sim: Make it possible to override the breakpoint length check.
authorGabe Black <gabeblack@google.com>
Wed, 3 Dec 2014 11:27:19 +0000 (03:27 -0800)
committerGabe Black <gabeblack@google.com>
Wed, 3 Dec 2014 11:27:19 +0000 (03:27 -0800)
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.

src/base/remote_gdb.cc
src/base/remote_gdb.hh

index ead8db9aeabf264a0b336f9d5793b67c2b63a84a..42b94b5f9c8baf030568d5195368965d841c8016 100644 (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);
index babf610497b0773aa7bd8ab30547b662dbbef7d1..8fab556f35a4d123c782958e2c9079b66ee2a52c 100644 (file)
@@ -192,6 +192,8 @@ class BaseRemoteGDB
     PCEventQueue *getPcEventQueue();
 
   protected:
+    virtual bool checkBpLen(size_t len);
+
     class HardBreakpoint : public PCEvent
     {
       private: