summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/misc.cc2
-rw-r--r--base/trace.cc7
-rw-r--r--dev/console.cc12
-rw-r--r--dev/etherdump.cc18
-rw-r--r--sim/builder.cc45
-rw-r--r--sim/builder.hh19
-rw-r--r--sim/main.cc9
-rw-r--r--sim/serialize.cc18
-rw-r--r--sim/universe.cc56
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;
+ }
}