base,sim: allow m5writeFile with stdout/stderr.
authorNils Asmussen <nils.asmussen@barkhauseninstitut.org>
Fri, 21 Feb 2020 12:58:04 +0000 (13:58 +0100)
committerNils Asmussen <nils.asmussen@barkhauseninstitut.org>
Fri, 8 May 2020 17:36:21 +0000 (17:36 +0000)
If m5writeFile opens stdout/stderr, no file is registered in
OutputDirectory and thus we don't want to search for it on close.

In order to write multiple times to stdout/stderr in a reasonable way,
we also want to prevent seeking. Thus, don't seek if the offset is 0, in
which case this would be a noop anyway (we just opened the file without
append).

Finally, it is helpful for debugging if the stream is flushed on every
write.

Change-Id: I102f82dcd2c63420b6f3fe55d67f03c62349e69d
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/28727
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/output.cc
src/sim/pseudo_inst.cc

index ec94a1374921fe61719b01c60af1472587612f59..47b8aa7f4de25b5b283b920bf7bef54e55b1ac3a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015 ARM Limited
+ * Copyright (c) 2020 Barkhausen Institut
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -142,6 +143,11 @@ OutputDirectory::checkForStdio(const string &name)
 void
 OutputDirectory::close(OutputStream *file)
 {
+    if (file == &stdout || file == &stderr) {
+        file->stream()->flush();
+        return;
+    }
+
     auto i = files.find(file->name());
     if (i == files.end())
         fatal("Attempted to close an unregistred file stream");
index c65fdc0162aec47cc209eb1d4388084cac2e34ce..b11a5a4436457518e211d56a62fcbd0148fe076a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2010-2012, 2015, 2017 ARM Limited
+ * Copyright (c) 2020 Barkhausen Institut
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -425,8 +426,10 @@ writefile(ThreadContext *tc, Addr vaddr, uint64_t len, uint64_t offset,
     if (!os)
         panic("could not open file %s\n", filename);
 
-    // seek to offset
-    os->seekp(offset);
+    if (offset != 0) {
+        // seek to offset
+        os->seekp(offset);
+    }
 
     // copy out data and write to file
     char *buf = new char[len];