From 97d45c5dc70ab50e6273fbc3b812144de6a9dfff Mon Sep 17 00:00:00 2001 From: Nils Asmussen Date: Fri, 21 Feb 2020 13:58:04 +0100 Subject: [PATCH] base,sim: allow m5writeFile with stdout/stderr. 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 Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/base/output.cc | 6 ++++++ src/sim/pseudo_inst.cc | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/base/output.cc b/src/base/output.cc index ec94a1374..47b8aa7f4 100644 --- a/src/base/output.cc +++ b/src/base/output.cc @@ -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"); diff --git a/src/sim/pseudo_inst.cc b/src/sim/pseudo_inst.cc index c65fdc016..b11a5a443 100644 --- a/src/sim/pseudo_inst.cc +++ b/src/sim/pseudo_inst.cc @@ -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]; -- 2.30.2