From e2e26d3dc9fcf6015f73659a66c4c8fb4f2ec691 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 1 May 2019 21:41:36 -0700 Subject: [PATCH] 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 --- src/mem/port_proxy.cc | 15 +++++++++++++++ src/mem/port_proxy.hh | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) 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); + } }; -- 2.30.2