From: Gabe Black Date: Thu, 2 May 2019 04:41:36 +0000 (-0700) Subject: mem: Add a readString method to the PortProxy which takes a char *. X-Git-Tag: v19.0.0.0~807 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e2e26d3dc9fcf6015f73659a66c4c8fb4f2ec691;p=gem5.git 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 Reviewed-by: Jason Lowe-Power Reviewed-by: Brandon Potter Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg --- 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 + #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); + } };