diff options
author | Gabe Black <gabeblack@google.com> | 2019-05-01 21:41:36 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-05-29 04:24:11 +0000 |
commit | e2e26d3dc9fcf6015f73659a66c4c8fb4f2ec691 (patch) | |
tree | 68b5be6382612c5bf13e2b1f1e7fbd686771e723 /src/mem | |
parent | 1a631bd79bdcf2d66d845f79758e16e3ec9d7a7f (diff) | |
download | gem5-e2e26d3dc9fcf6015f73659a66c4c8fb4f2ec691.tar.xz |
mem: Add a readString method to the PortProxy which takes a char *.
This version takes a char * instead of an std::string &, and a maximum
length to fill in like strncpy. This is intended to be a replacement
for the CopyStringOut function.
Change-Id: Ib661924a3fa7e05761d572ffecbe2c0cc8659d48
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18574
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/mem')
-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); + } }; |