sim: Disable gzip compression for writefile pseudo instruction
authorSascha Bischoff <sascha.bischoff@ARM.com>
Thu, 5 Nov 2015 18:26:23 +0000 (18:26 +0000)
committerSascha Bischoff <sascha.bischoff@ARM.com>
Thu, 5 Nov 2015 18:26:23 +0000 (18:26 +0000)
The writefile pseudo instruction uses OutputDirectory::create and
OutputDirectory::openFile to create the output files. However, by
default these will check the file extention for .gz, and create a gzip
compressed stream if the file ending matches. When writing out files,
we want to write them out exactly as they are in the guest simulation,
and never want to compress them with gzio. Additionally, this causes
m5 writefile to fail when checking the error flags for the output
steam.

With this patch we add an additional no_gz argument to
OutputDirectory::create and OutputDirectory::openFile which allows us
to override the gzip compression.  Therefore, for m5 writefile we
disable the filename check, and always create a standard ostream.

src/base/output.cc
src/base/output.hh
src/sim/pseudo_inst.cc

index ce1b49a8272ae3cd140215c2b3cafaf0be03fa86..516a1d05ab05ed5663085c5b3c19f6ceff4bdba6 100644 (file)
@@ -77,9 +77,11 @@ OutputDirectory::checkForStdio(const string &name) const
 
 ostream *
 OutputDirectory::openFile(const string &filename,
-                          ios_base::openmode mode)
+                          ios_base::openmode mode, bool no_gz)
 {
-    if (filename.find(".gz", filename.length()-3) < filename.length()) {
+    bool gz = !no_gz;
+    gz = gz && filename.find(".gz", filename.length()-3) < filename.length();
+    if (gz) {
         ogzstream *file = new ogzstream(filename.c_str(), mode);
         if (!file->is_open())
             fatal("Cannot open file %s", filename);
@@ -153,7 +155,7 @@ OutputDirectory::resolve(const string &name) const
 }
 
 ostream *
-OutputDirectory::create(const string &name, bool binary)
+OutputDirectory::create(const string &name, bool binary, bool no_gz)
 {
     ostream *file = checkForStdio(name);
     if (file)
@@ -162,7 +164,7 @@ OutputDirectory::create(const string &name, bool binary)
     string filename = resolve(name);
     ios_base::openmode mode =
         ios::trunc | (binary ? ios::binary : (ios::openmode)0);
-    file = openFile(filename, mode);
+    file = openFile(filename, mode, no_gz);
 
     return file;
 }
index ef628882d797dd4619eaab1675c33703b5942768..67e6ecb18e50d8c80d41cb8027b9c3ad7209cafb 100644 (file)
@@ -86,10 +86,13 @@ class OutputDirectory
      *
      * @param filename file to open
      * @param mode attributes to open file with
+     * @param no_gz true to disable opening the file as a gzip compressed output
+     *     stream; false otherwise
      * @return stream pointer to opened file; will cause sim fail on error
      */
     std::ostream *openFile(const std::string &filename,
-                        std::ios_base::openmode mode = std::ios::trunc);
+                        std::ios_base::openmode mode = std::ios::trunc,
+                        bool no_gz = false);
 
     /**
      * Sets name of this directory.
@@ -111,9 +114,12 @@ class OutputDirectory
      * @param name name of file to create (without this directory's name
      *          leading it)
      * @param binary true to create a binary file; false otherwise
+     * @param no_gz true to disable creating a gzip compressed output stream;
+     *     false otherwise
      * @return stream to the opened file
      */
-    std::ostream *create(const std::string &name, bool binary = false);
+    std::ostream *create(const std::string &name, bool binary = false,
+                         bool no_gz = false);
 
     /**
      * Closes a file stream.
index d4e2085df4f855e8f69cd57bef3b42790656fb86..fb19b21b147daf14ac261b309afe39c9974e5992 100644 (file)
@@ -565,13 +565,13 @@ writefile(ThreadContext *tc, Addr vaddr, uint64_t len, uint64_t offset,
 
     if (offset == 0) {
         // create a new file (truncate)
-        os = simout.create(filename, true);
+        os = simout.create(filename, true, true);
     } else {
         // do not truncate file if offset is non-zero
         // (ios::in flag is required as well to keep the existing data
         //  intact, otherwise existing data will be zeroed out.)
         os = simout.openFile(simout.directory() + filename,
-                            ios::in | ios::out | ios::binary);
+                            ios::in | ios::out | ios::binary, true);
     }
     if (!os)
         panic("could not open file %s\n", filename);