diff options
-rw-r--r-- | src/mem/port_proxy.cc | 15 | ||||
-rw-r--r-- | src/mem/port_proxy.hh | 19 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/mem/port_proxy.cc b/src/mem/port_proxy.cc index f56bfeb55..60f79e375 100644 --- a/src/mem/port_proxy.cc +++ b/src/mem/port_proxy.cc @@ -110,3 +110,18 @@ PortProxy::tryReadString(std::string &str, Addr addr) const str += c; } } + +bool +PortProxy::tryReadString(char *str, Addr addr, size_t maxlen) const +{ + assert(maxlen); + while (maxlen--) { + if (!tryReadBlob(addr++, str, 1)) + return false; + if (!*str++) + return true; + } + // We ran out of room, so back up and add a terminator. + *--str = '\0'; + return true; +} diff --git a/src/mem/port_proxy.hh b/src/mem/port_proxy.hh index 469273f85..61a207146 100644 --- a/src/mem/port_proxy.hh +++ b/src/mem/port_proxy.hh @@ -59,6 +59,8 @@ #ifndef __MEM_PORT_PROXY_HH__ #define __MEM_PORT_PROXY_HH__ +#include <limits> + #include "mem/port.hh" #include "sim/byteswap.hh" @@ -242,6 +244,23 @@ class PortProxy if (!tryReadString(str, addr)) fatal("readString(%#x, ...) failed", addr); } + + /** + * Reads the string at guest address addr into the char * str, reading up + * to maxlen characters. The last character read is always a nul + * terminator. Returns true on success and false on failure. + */ + bool tryReadString(char *str, Addr addr, size_t maxlen) const; + + /** + * Same as tryReadString, but insists on success. + */ + void + readString(char *str, Addr addr, size_t maxlen) const + { + if (!tryReadString(str, addr, maxlen)) + fatal("readString(%#x, ...) failed", addr); + } }; |