mem: Resolve TrafficGen trace relative to the config
authorAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 20 Jun 2016 13:49:37 +0000 (14:49 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 20 Jun 2016 13:49:37 +0000 (14:49 +0100)
The traffic generator currently resolves relative trace paths relative
to gem5's current working directory. This can lead to surprising
results for relative paths where the expectation would normally be
that they are resolved relative to the configuration file. This
changeset implements config-relative trace file lookups. The old
behavior is kept as a fallback for configs that expect that behavior.

Change-Id: I1bda4e16725842666ffc37dcb6838c23a6ff138c
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
src/cpu/testers/traffic_gen/traffic_gen.cc
src/cpu/testers/traffic_gen/traffic_gen.hh
tests/quick/se/70.tgen/tgen-simple-mem.cfg

index af19767844dedddaf9926fcb6f1a99d8f152aee4..1a12b767581b921cd9a4291c862e5a69f940f3a7 100644 (file)
  *          Andreas Hansson
  *          Sascha Bischoff
  */
+#include "cpu/testers/traffic_gen/traffic_gen.hh"
+
+#include <libgen.h>
+#include <unistd.h>
 
 #include <sstream>
 
 #include "base/intmath.hh"
 #include "base/random.hh"
-#include "cpu/testers/traffic_gen/traffic_gen.hh"
 #include "debug/Checkpoint.hh"
 #include "debug/TrafficGen.hh"
 #include "sim/stats.hh"
@@ -229,6 +232,27 @@ TrafficGen::update()
     }
 }
 
+std::string
+TrafficGen::resolveFile(const std::string &name)
+{
+    // Do nothing for empty and absolute file names
+    if (name.empty() || name[0] == '/')
+        return name;
+
+    char *config_path = strdup(configFile.c_str());
+    char *config_dir = dirname(config_path);
+    const std::string config_rel = csprintf("%s/%s", config_dir, name);
+    free(config_path);
+
+    // Check the path relative to the config file first
+    if (access(config_rel.c_str(), R_OK) == 0)
+        return config_rel;
+
+    // Fall back to the old behavior and search relative to the
+    // current working directory.
+    return name;
+}
+
 void
 TrafficGen::parseConfig()
 {
@@ -273,6 +297,7 @@ TrafficGen::parseConfig()
                     Addr addrOffset;
 
                     is >> traceFile >> addrOffset;
+                    traceFile = resolveFile(traceFile);
 
                     states[id] = new TraceGen(name(), masterID, duration,
                                               traceFile, addrOffset);
index 0715c59658f9dd47821d9bcbebd8a387784482cd..6b3ccbe30ed6db477672f33889137153b0745b5d 100644 (file)
@@ -75,6 +75,21 @@ class TrafficGen : public MemObject
      */
     void enterState(uint32_t newState);
 
+    /**
+     * Resolve a file path in the configuration file.
+     *
+     * This method resolves a relative path to a file that has been
+     * referenced in the configuration file. It first tries to resolve
+     * the file relative to the configuration file's path. If that
+     * fails, it falls back to constructing a path relative to the
+     * current working directory.
+     *
+     * Absolute paths are returned unmodified.
+     *
+     * @param name Path to resolve
+     */
+    std::string resolveFile(const std::string &name);
+
     /**
      * Parse the config file and build the state map and
      * transition matrix.
index 326140ce2babdd51663934fdb9edf0ff1827d92b..c09fc2f4456cf226fd35ccdcb3ad4d8bd078403b 100644 (file)
@@ -19,7 +19,7 @@
 # and random state is from a uniform random distribution over the
 # interval. If a specific value is desired, then the min and max can
 # be set to the same value.
-STATE 0 1000000 TRACE tests/quick/se/70.tgen/tgen-simple-mem.trc 100
+STATE 0 1000000 TRACE tgen-simple-mem.trc 100
 STATE 1 100000000 RANDOM 0 0 134217728 64 30000 30000 0
 STATE 2 1000000000 IDLE
 STATE 3 100000000 LINEAR 0 0 134217728 64 30000 30000 0