mem: Add a readString method to the PortProxy which takes a char *.
authorGabe Black <gabeblack@google.com>
Thu, 2 May 2019 04:41:36 +0000 (21:41 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 29 May 2019 04:24:11 +0000 (04:24 +0000)
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>

src/mem/port_proxy.cc
src/mem/port_proxy.hh

index f56bfeb555ebf73a9909403bd1867a0f8ae76ab6..60f79e375fae05e1588195b9c3281e89a1c391fe 100644 (file)
@@ -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;
+}
index 469273f85f59e78714577c85ca7470c5d5c73ae7..61a207146e8f7712afca73182a62d12bf44648bd 100644 (file)
@@ -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);
+    }
 };