diff options
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.cc | 27 | ||||
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.hh | 15 | ||||
-rw-r--r-- | tests/quick/se/70.tgen/tgen-simple-mem.cfg | 2 |
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 |