diff options
-rw-r--r-- | base/misc.cc | 2 | ||||
-rw-r--r-- | base/trace.cc | 7 | ||||
-rw-r--r-- | dev/console.cc | 12 | ||||
-rw-r--r-- | dev/etherdump.cc | 18 | ||||
-rw-r--r-- | sim/builder.cc | 45 | ||||
-rw-r--r-- | sim/builder.hh | 19 | ||||
-rw-r--r-- | sim/main.cc | 9 | ||||
-rw-r--r-- | sim/serialize.cc | 18 | ||||
-rw-r--r-- | sim/universe.cc | 56 |
9 files changed, 151 insertions, 35 deletions
diff --git a/base/misc.cc b/base/misc.cc index 80968bd44..5caf96d40 100644 --- a/base/misc.cc +++ b/base/misc.cc @@ -121,6 +121,8 @@ __warn(const string &format, cp::ArgList &args, const char *func, #endif args.dump(cerr, fmt); + if (outputStream != &cerr && outputStream != &cout) + args.dump(*outputStream, fmt); delete &args; } diff --git a/base/trace.cc b/base/trace.cc index 99e97e7ea..156110376 100644 --- a/base/trace.cc +++ b/base/trace.cc @@ -49,7 +49,7 @@ FlagVec flags(NumFlags, false); // directly; use DebugOut() (see below) to access this stream for // output. // -ostream *dprintf_stream = NULL; +ostream *dprintf_stream = &cerr; int dprintf_ignore_size; vector<string> dprintf_ignore; @@ -267,10 +267,7 @@ RawDataRecord::dump(ostream &os) std::ostream & DebugOut() { - if (Trace::dprintf_stream) - return *Trace::dprintf_stream; - else - return cerr; + return *Trace::dprintf_stream; } ///////////////////////////////////////////// diff --git a/dev/console.cc b/dev/console.cc index f4156207d..3fa51a414 100644 --- a/dev/console.cc +++ b/dev/console.cc @@ -383,8 +383,16 @@ END_INIT_SIM_OBJECT_PARAMS(SimConsole) CREATE_SIM_OBJECT(SimConsole) { string filename = output; - if (!filename.empty() && append_name) - filename += "." + getInstanceName(); + if (filename.empty()) { + if (!outputDirectory.empty()) + filename = outputDirectory + getInstanceName(); + } else { + if (append_name) + filename += "." + getInstanceName(); + if (!outputDirectory.empty()) + filename = outputDirectory + filename; + } + SimConsole *console = new SimConsole(getInstanceName(), filename, number); ((ConsoleListener *)listener)->add(console); ((SimConsole *)console)->initInt(intr_control); diff --git a/dev/etherdump.cc b/dev/etherdump.cc index 60dc1559d..89f1ce382 100644 --- a/dev/etherdump.cc +++ b/dev/etherdump.cc @@ -126,13 +126,27 @@ END_DECLARE_SIM_OBJECT_PARAMS(EtherDump) BEGIN_INIT_SIM_OBJECT_PARAMS(EtherDump) - INIT_PARAM_DFLT(file, "file to dump packets to", "") + INIT_PARAM(file, "file to dump packets to") END_INIT_SIM_OBJECT_PARAMS(EtherDump) CREATE_SIM_OBJECT(EtherDump) { - return new EtherDump(getInstanceName(), file); + string filename; + if (file.isValid()) { + filename = file; + + if (filename[0] != '/' && !outputDirectory.empty()) + filename = outputDirectory + filename; + } else { + if (outputDirectory.empty()) { + filename = "etherdump"; + } else { + filename = outputDirectory + "etherdump"; + } + } + + return new EtherDump(getInstanceName(), filename); } REGISTER_SIM_OBJECT("EtherDump", EtherDump) diff --git a/sim/builder.cc b/sim/builder.cc index fa435d322..e2345556e 100644 --- a/sim/builder.cc +++ b/sim/builder.cc @@ -34,10 +34,45 @@ #include "sim/configfile.hh" #include "sim/host.hh" #include "sim/sim_object.hh" -#include "sim/sim_stats.hh" +#include "sim/universe.hh" using namespace std; + +ostream & +builderStream() +{ + static ofstream file; + static ostream *stream = NULL; + + if (!stream) { + if (!outputDirectory.empty()) { + string filename = outputDirectory + "builder.txt"; + file.open(filename.c_str()); + stream = &file; + } else { + stream = outputStream; + } + } + + return *stream; +} + +SimObjectBuilder::SimObjectBuilder(const string &_configClass, + const string &_instanceName, + ConfigNode *_configNode, + const string &_simObjClassName) + : ParamContext(_configClass, true), + instanceName(_instanceName), + configNode(_configNode), + simObjClassName(_simObjClassName) +{ +} + +SimObjectBuilder::~SimObjectBuilder() +{ +} + /////////////////////////////////////////// // // SimObjectBuilder member definitions @@ -151,10 +186,10 @@ SimObjectClass::createObject(IniFile &configDB, // echo object parameters to stats file (for documenting the // config used to generate the associated stats) - *statStream << "[" << object->name() << "]" << endl; - *statStream << "type=" << simObjClassName << endl; - objectBuilder->showParams(*statStream); - *statStream << endl; + builderStream() << "[" << object->name() << "]" << endl; + builderStream() << "type=" << simObjClassName << endl; + objectBuilder->showParams(builderStream()); + builderStream() << endl; // done with the SimObjectBuilder now delete objectBuilder; diff --git a/sim/builder.hh b/sim/builder.hh index 0364276bf..e13a85272 100644 --- a/sim/builder.hh +++ b/sim/builder.hh @@ -29,15 +29,18 @@ #ifndef __BUILDER_HH__ #define __BUILDER_HH__ -#include <map> +#include <iosfwd> #include <list> +#include <map> #include <vector> -#include <iostream> #include "sim/param.hh" class SimObject; +std::ostream & +builderStream(); + // // A SimObjectBuilder serves as an evaluation context for a set of // parameters that describe a specific instance of a SimObject. This @@ -69,15 +72,9 @@ class SimObjectBuilder : public ParamContext SimObjectBuilder(const std::string &_configClass, const std::string &_instanceName, ConfigNode *_configNode, - const std::string &_simObjClassName) - : ParamContext(_configClass, true), - instanceName(_instanceName), - configNode(_configNode), - simObjClassName(_simObjClassName) - { - } - - virtual ~SimObjectBuilder() {} + const std::string &_simObjClassName); + + virtual ~SimObjectBuilder(); // call parse() on all params in this context to convert string // representations to parameter values diff --git a/sim/main.cc b/sim/main.cc index d2c56d9f2..48d64d4cd 100644 --- a/sim/main.cc +++ b/sim/main.cc @@ -54,6 +54,7 @@ #include "sim/sim_init.hh" #include "sim/sim_object.hh" #include "sim/sim_stats.hh" +#include "sim/universe.hh" using namespace std; @@ -355,12 +356,12 @@ main(int argc, char **argv) // Print hello message to stats file if it's actually a file. If // it's not (i.e. it's cout or cerr) then we already did it above. - if (statStreamIsFile) - sayHello(*statStream); + if (outputStream != &cout && outputStream != &cerr) + sayHello(*outputStream); // Echo command line and all parameter settings to stats file as well. - echoCommandLine(argc, argv, *statStream); - ParamContext::showAllContexts(*statStream); + echoCommandLine(argc, argv, *outputStream); + ParamContext::showAllContexts(builderStream()); // Now process the configuration hierarchy and create the SimObjects. ConfigHierarchy configHierarchy(simConfigDB); diff --git a/sim/serialize.cc b/sim/serialize.cc index 33956c6e7..281e7cfc8 100644 --- a/sim/serialize.cc +++ b/sim/serialize.cc @@ -305,10 +305,9 @@ class SerializeParamContext : public ParamContext SerializeParamContext serialParams("serialize"); -Param<string> serialize_dir(&serialParams, - "dir", +Param<string> serialize_dir(&serialParams, "dir", "dir to stick checkpoint in " - "(sprintf format with cycle #)", "m5.%012d"); + "(sprintf format with cycle #)"); Param<Counter> serialize_cycle(&serialParams, "cycle", @@ -333,11 +332,18 @@ SerializeParamContext::~SerializeParamContext() void SerializeParamContext::checkParams() { - checkpointDirBase = serialize_dir; + if (serialize_dir.isValid()) { + checkpointDirBase = serialize_dir; + } else { + if (outputDirectory.empty()) + checkpointDirBase = "m5.%012d"; + else + checkpointDirBase = outputDirectory + "cpt.%012d"; + } + // guarantee that directory ends with a '/' - if (checkpointDirBase[checkpointDirBase.size() - 1] != '/') { + if (checkpointDirBase[checkpointDirBase.size() - 1] != '/') checkpointDirBase += "/"; - } if (serialize_cycle > 0) Checkpoint::setup(serialize_cycle, serialize_period); diff --git a/sim/universe.cc b/sim/universe.cc index b75b1f78a..440c6363f 100644 --- a/sim/universe.cc +++ b/sim/universe.cc @@ -26,10 +26,17 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/types.h> +#include <sys/stat.h> + +#include <cstring> +#include <fstream> #include <list> #include <string> #include <vector> +#include "base/files.hh" +#include "base/misc.hh" #include "sim/universe.hh" #include "sim/host.hh" #include "sim/param.hh" @@ -42,8 +49,14 @@ double __ticksPerMS; double __ticksPerUS; double __ticksPerNS; +string outputDirectory; +ostream *outputStream; + class UniverseParamContext : public ParamContext { + private: + ofstream outputFile; + public: UniverseParamContext(const string &is) : ParamContext(is) {} void checkParams(); @@ -54,6 +67,11 @@ UniverseParamContext universe("Universe"); Param<Tick> universe_freq(&universe, "frequency", "tick frequency", 200000000); +Param<string> universe_output_dir(&universe, "output_dir", + "directory to output data to"); +Param<string> universe_output_file(&universe, "output_file", + "file to dump simulator output to"); + void UniverseParamContext::checkParams() { @@ -62,4 +80,42 @@ UniverseParamContext::checkParams() __ticksPerMS = freq / 1.0e3; __ticksPerUS = freq / 1.0e6; __ticksPerNS = freq / 1.0e9; + + if (universe_output_dir.isValid()) { + outputDirectory = universe_output_dir; + + // guarantee that directory ends with a '/' + if (outputDirectory[outputDirectory.size() - 1] != '/') + outputDirectory += "/"; + + if (mkdir(outputDirectory.c_str(), 0777) < 0) { + if (errno != EEXIST) { + panic("%s\ncould not make output directory: %s\n", + strerror(errno), outputDirectory); + } + } + } + + string filename; + if (universe_output_file.isValid()) { + string f = universe_output_file; + if (f != "stdout" && f != "cout" && f != "stderr" && f != "cerr") + filename = outputDirectory + f; + else + filename = f; + } else { + if (outputDirectory.empty()) + filename = "stdout"; + else + filename = outputDirectory + "output.txt"; + } + + if (filename == "stdout" || filename == "cout") + outputStream = &cout; + else if (filename == "stderr" || filename == "cerr") + outputStream = &cerr; + else { + outputFile.open(filename.c_str(), ios::trunc); + outputStream = &outputFile; + } } |