summaryrefslogtreecommitdiff
path: root/src/base/remote_gdb.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/remote_gdb.cc')
-rw-r--r--src/base/remote_gdb.cc60
1 files changed, 22 insertions, 38 deletions
diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc
index e603fb90f..e033bea9c 100644
--- a/src/base/remote_gdb.cc
+++ b/src/base/remote_gdb.cc
@@ -1,4 +1,5 @@
/*
+ * Copyright 2015 LabWare
* Copyright 2014 Google, Inc.
* Copyright (c) 2002-2005 The Regents of The University of Michigan
* All rights reserved.
@@ -27,6 +28,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Nathan Binkert
+ * Boris Shingarov
*/
/*
@@ -270,12 +272,11 @@ BaseRemoteGDB::SingleStepEvent::process()
gdb->trap(SIGTRAP);
}
-BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c,
- size_t cacheSize) : inputEvent(NULL), trapEvent(this), listener(NULL),
+BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c) :
+ inputEvent(NULL), trapEvent(this), listener(NULL),
number(-1), fd(-1), active(false), attached(false), system(_system),
- context(c), gdbregs(cacheSize), singleStepEvent(this)
+ context(c), singleStepEvent(this)
{
- memset(gdbregs.regs, 0, gdbregs.bytes());
}
BaseRemoteGDB::~BaseRemoteGDB()
@@ -700,7 +701,9 @@ BaseRemoteGDB::trap(int type)
if (!attached)
return false;
- bufferSize = gdbregs.bytes() * 2 + 256;
+ unique_ptr<BaseRemoteGDB::BaseGdbRegCache> regCache(gdbRegs());
+
+ bufferSize = regCache->size() * 2 + 256;
buffer = (char*)malloc(bufferSize);
DPRINTF(GDBMisc, "trap: PC=%s\n", context->pcState());
@@ -721,12 +724,12 @@ BaseRemoteGDB::trap(int type)
active = true;
} else {
// Tell remote host that an exception has occurred.
- snprintf((char *)buffer, bufferSize, "S%02x", type);
+ snprintf(buffer, bufferSize, "S%02x", type);
send(buffer);
}
// Stick frame regs into our reg cache.
- getregs();
+ regCache->getRegs(context);
for (;;) {
datalen = recv(data, sizeof(data));
@@ -740,48 +743,29 @@ BaseRemoteGDB::trap(int type)
// if this command came from a running gdb, answer it --
// the other guy has no way of knowing if we're in or out
// of this loop when he issues a "remote-signal".
- snprintf((char *)buffer, bufferSize,
+ snprintf(buffer, bufferSize,
"S%02x", type);
send(buffer);
continue;
case GDBRegR:
- if (2 * gdbregs.bytes() > bufferSize)
+ if (2 * regCache->size() > bufferSize)
panic("buffer too small");
- mem2hex(buffer, gdbregs.regs, gdbregs.bytes());
+ mem2hex(buffer, regCache->data(), regCache->size());
send(buffer);
continue;
case GDBRegW:
- p = hex2mem(gdbregs.regs, p, gdbregs.bytes());
+ p = hex2mem(regCache->data(), p, regCache->size());
if (p == NULL || *p != '\0')
send("E01");
else {
- setregs();
+ regCache->setRegs(context);
send("OK");
}
continue;
-#if 0
- case GDBSetReg:
- val = hex2i(&p);
- if (*p++ != '=') {
- send("E01");
- continue;
- }
- if (val < 0 && val >= KGDB_NUMREGS) {
- send("E01");
- continue;
- }
-
- gdbregs.regs[val] = hex2i(&p);
- setregs();
- send("OK");
-
- continue;
-#endif
-
case GDBMemR:
val = hex2i(&p);
if (*p++ != ',') {
@@ -802,7 +786,7 @@ BaseRemoteGDB::trap(int type)
continue;
}
- if (read(val, (size_t)len, (char *)buffer)) {
+ if (read(val, (size_t)len, buffer)) {
// variable length array would be nice, but C++ doesn't
// officially support those...
char *temp = new char[2*len+1];
@@ -838,7 +822,7 @@ BaseRemoteGDB::trap(int type)
send("E0A");
continue;
}
- if (write(val, (size_t)len, (char *)buffer))
+ if (write(val, (size_t)len, buffer))
send("OK");
else
send("E0B");
@@ -1025,10 +1009,10 @@ BaseRemoteGDB::i2digit(int n)
// Convert a byte array into an hex string.
void
-BaseRemoteGDB::mem2hex(void *vdst, const void *vsrc, int len)
+BaseRemoteGDB::mem2hex(char *vdst, const char *vsrc, int len)
{
- char *dst = (char *)vdst;
- const char *src = (const char *)vsrc;
+ char *dst = vdst;
+ const char *src = vsrc;
while (len--) {
*dst++ = i2digit(*src >> 4);
@@ -1042,9 +1026,9 @@ BaseRemoteGDB::mem2hex(void *vdst, const void *vsrc, int len)
// hex digit. If the string ends in the middle of a byte, NULL is
// returned.
const char *
-BaseRemoteGDB::hex2mem(void *vdst, const char *src, int maxlen)
+BaseRemoteGDB::hex2mem(char *vdst, const char *src, int maxlen)
{
- char *dst = (char *)vdst;
+ char *dst = vdst;
int msb, lsb;
while (*src && maxlen--) {