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>
This commit is contained in:
Andreas Sandberg
2016-06-20 14:49:37 +01:00
parent 2c91ccfbe8
commit efb7fb6f85
3 changed files with 42 additions and 2 deletions

View File

@@ -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);

View 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.