summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/testers/traffic_gen/traffic_gen.cc27
-rw-r--r--src/cpu/testers/traffic_gen/traffic_gen.hh15
-rw-r--r--tests/quick/se/70.tgen/tgen-simple-mem.cfg2
3 files changed, 42 insertions, 2 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);
diff --git a/src/cpu/testers/traffic_gen/traffic_gen.hh b/src/cpu/testers/traffic_gen/traffic_gen.hh
index 0715c5965..6b3ccbe30 100644
--- a/src/cpu/testers/traffic_gen/traffic_gen.hh
+++ b/src/cpu/testers/traffic_gen/traffic_gen.hh
@@ -76,6 +76,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.
*/
diff --git a/tests/quick/se/70.tgen/tgen-simple-mem.cfg b/tests/quick/se/70.tgen/tgen-simple-mem.cfg
index 326140ce2..c09fc2f44 100644
--- a/tests/quick/se/70.tgen/tgen-simple-mem.cfg
+++ b/tests/quick/se/70.tgen/tgen-simple-mem.cfg
@@ -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