summaryrefslogtreecommitdiff
path: root/src/cpu/testers/traffic_gen/traffic_gen.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2016-06-20 14:49:37 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2016-06-20 14:49:37 +0100
commitefb7fb6f852eeedc2cd226332372e7544eb011d7 (patch)
tree7e24c25bb0d53ec9258b1cce1365d14887d45b56 /src/cpu/testers/traffic_gen/traffic_gen.cc
parent2c91ccfbe8efc59bf838e681d43f289adf663225 (diff)
downloadgem5-efb7fb6f852eeedc2cd226332372e7544eb011d7.tar.xz
mem: Resolve TrafficGen trace relative to the config
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>
Diffstat (limited to 'src/cpu/testers/traffic_gen/traffic_gen.cc')
-rw-r--r--src/cpu/testers/traffic_gen/traffic_gen.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/cpu/testers/traffic_gen/traffic_gen.cc b/src/cpu/testers/traffic_gen/traffic_gen.cc
index af1976784..1a12b7675 100644
--- a/src/cpu/testers/traffic_gen/traffic_gen.cc
+++ b/src/cpu/testers/traffic_gen/traffic_gen.cc
@@ -38,12 +38,15 @@
* 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);