summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/remote_gdb.cc52
-rw-r--r--src/base/remote_gdb.hh2
2 files changed, 20 insertions, 34 deletions
diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc
index 37ecef97c..2c54f5b5f 100644
--- a/src/base/remote_gdb.cc
+++ b/src/base/remote_gdb.cc
@@ -152,8 +152,6 @@ static const char GDBEnd = '#';
static const char GDBGoodP = '+';
static const char GDBBadP = '-';
-static const int GDBPacketBufLen = 1024;
-
vector<BaseRemoteGDB *> debuggers;
class HardBreakpoint : public PCEvent
@@ -441,20 +439,19 @@ BaseRemoteGDB::trap(int type)
regCachePtr = gdbRegs();
regCachePtr->getRegs(tc);
- char data[GDBPacketBufLen + 1];
GdbCommand::Context cmdCtx;
cmdCtx.type = type;
- cmdCtx.data = &data[1];
+ std::vector<char> data;
for (;;) {
try {
- size_t datalen = recv(data, sizeof(data));
- if (datalen < 1)
+ recv(data);
+ if (data.size() == 1)
throw BadClient();
-
- data[datalen] = 0; // Sentinel
cmdCtx.cmd_byte = data[0];
- cmdCtx.len = datalen - 1;
+ cmdCtx.data = data.data() + 1;
+ // One for sentinel, one for cmd_byte.
+ cmdCtx.len = data.size() - 2;
auto cmdIt = command_map.find(cmdCtx.cmd_byte);
if (cmdIt == command_map.end()) {
@@ -521,41 +518,31 @@ BaseRemoteGDB::putbyte(uint8_t b)
}
// Receive a packet from gdb
-int
-BaseRemoteGDB::recv(char *bp, int maxlen)
+void
+BaseRemoteGDB::recv(std::vector<char>& bp)
{
- char *p;
uint8_t c;
int csum;
- int len;
+ bp.resize(0);
do {
- p = bp;
- csum = len = 0;
+ csum = 0;
// Find the beginning of a packet
while ((c = getbyte()) != GDBStart);
// Read until you find the end of the data in the packet, and keep
// track of the check sum.
- while (len < maxlen) {
+ while (true) {
c = getbyte();
if (c == GDBEnd)
break;
c &= 0x7f;
csum += c;
- *p++ = c;
- len++;
+ bp.push_back(c);
}
- // Mask the check sum, and terminate the command string.
+ // Mask the check sum.
csum &= 0xff;
- *p = '\0';
-
- // If the command was too long, report an error.
- if (len >= maxlen) {
- putbyte(GDBBadP);
- continue;
- }
// Bring in the checksum. If the check sum matches, csum will be 0.
csum -= digit2i(getbyte()) * 16;
@@ -566,21 +553,20 @@ BaseRemoteGDB::recv(char *bp, int maxlen)
// Report that the packet was received correctly
putbyte(GDBGoodP);
// Sequence present?
- if (bp[2] == ':') {
+ if (bp.size() > 2 && bp[2] == ':') {
putbyte(bp[0]);
putbyte(bp[1]);
- len -= 3;
- memcpy(bp, bp+3, len);
+ auto begin = std::begin(bp);
+ bp.erase(begin, std::next(begin, 3));
}
break;
}
// Otherwise, report that there was a mistake.
putbyte(GDBBadP);
} while (1);
-
- DPRINTF(GDBRecv, "recv: %s\n", bp);
-
- return len;
+ // Sentinel.
+ bp.push_back('\0');
+ DPRINTF(GDBRecv, "recv: %s\n", bp.data());
}
// Send a packet to gdb
diff --git a/src/base/remote_gdb.hh b/src/base/remote_gdb.hh
index 27b4ab488..82a1e15bc 100644
--- a/src/base/remote_gdb.hh
+++ b/src/base/remote_gdb.hh
@@ -171,7 +171,7 @@ class BaseRemoteGDB
uint8_t getbyte();
void putbyte(uint8_t b);
- int recv(char *data, int len);
+ void recv(std::vector<char> &bp);
void send(const char *data);
/*