summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/alpha_memory.cc9
-rw-r--r--arch/alpha/isa_desc1
-rw-r--r--base/callback.hh66
-rw-r--r--base/statistics.cc29
-rw-r--r--cpu/intr_control.cc1
-rw-r--r--cpu/memtest/memtest.cc38
-rw-r--r--cpu/simple_cpu/simple_cpu.cc59
-rw-r--r--dev/alpha_console.cc18
-rw-r--r--dev/console.cc6
-rw-r--r--dev/disk_image.cc7
-rw-r--r--dev/etherbus.cc6
-rw-r--r--dev/etherdump.cc2
-rw-r--r--dev/etherlink.cc8
-rw-r--r--dev/ethertap.cc9
-rw-r--r--dev/simple_disk.cc13
-rw-r--r--kern/tru64/tru64_system.cc23
-rw-r--r--kern/tru64/tru64_system.hh1
-rw-r--r--sim/builder.cc191
-rw-r--r--sim/builder.hh221
-rw-r--r--sim/main.cc15
-rw-r--r--sim/prog.cc17
-rw-r--r--sim/sim_object.cc152
-rw-r--r--sim/sim_object.hh181
-rw-r--r--sim/system.cc2
-rw-r--r--sim/system.hh4
-rw-r--r--test/Makefile26
-rw-r--r--test/stattest.cc12
27 files changed, 652 insertions, 465 deletions
diff --git a/arch/alpha/alpha_memory.cc b/arch/alpha/alpha_memory.cc
index 669fe92bb..83dd5accf 100644
--- a/arch/alpha/alpha_memory.cc
+++ b/arch/alpha/alpha_memory.cc
@@ -30,12 +30,13 @@
#include <string>
#include <vector>
-#include "targetarch/alpha_memory.hh"
-#include "targetarch/ev5.hh"
-#include "cpu/exec_context.hh"
-#include "base/trace.hh"
#include "base/inifile.hh"
#include "base/str.hh"
+#include "base/trace.hh"
+#include "cpu/exec_context.hh"
+#include "sim/builder.hh"
+#include "targetarch/alpha_memory.hh"
+#include "targetarch/ev5.hh"
using namespace std;
diff --git a/arch/alpha/isa_desc b/arch/alpha/isa_desc
index b5536525d..f36413ad8 100644
--- a/arch/alpha/isa_desc
+++ b/arch/alpha/isa_desc
@@ -2407,6 +2407,7 @@ decode OPCODE default Unknown::unknown() {
if (!xc->misspeculating())
m5_exit();
}}, No_OpClass);
+ 0x30: initparam({{ Ra = xc->cpu->system->init_param; }});
}
}
diff --git a/base/callback.hh b/base/callback.hh
index a1d23b5ed..eee629cf5 100644
--- a/base/callback.hh
+++ b/base/callback.hh
@@ -31,26 +31,76 @@
#include <list>
-class Callback {
+/**
+ * Generic callback class. This base class provides a virutal process
+ * function that gets called when the callback queue is processed.
+ */
+class Callback
+{
public:
+ /**
+ * virtualize the destructor to make sure that the correct one
+ * gets called.
+ */
virtual ~Callback() {}
+
+ /**
+ * virtual process function that is invoked when the callback
+ * queue is executed.
+ */
virtual void process() = 0;
};
class CallbackQueue
{
protected:
- std::list<Callback *> callbacks;
+ /**
+ * Simple typedef for the data structure that stores all of the
+ * callbacks.
+ */
+ typedef std::list<Callback *> queue;
+
+ /**
+ * List of all callbacks. To be called in fifo order.
+ */
+ queue callbacks;
public:
- void add(Callback *callback) { callbacks.push_back(callback); }
+ /**
+ * Add a callback to the end of the queue
+ * @param callback the callback to be added to the queue
+ */
+ void add(Callback *callback)
+ {
+ callbacks.push_back(callback);
+ }
+
+ /**
+ * Find out if there are any callbacks in the queue
+ */
bool empty() const { return callbacks.empty(); }
- void processOne() {
- Callback *c = callbacks.front();
- callbacks.pop_front();
- c->process();
+
+ /**
+ * process all callbacks
+ */
+ void process()
+ {
+ queue::iterator i = callbacks.begin();
+ queue::iterator end = callbacks.end();
+
+ while (i != end) {
+ (*i)->process();
+ ++i;
+ }
+ }
+
+ /**
+ * clear the callback queue
+ */
+ void clear()
+ {
+ callbacks.clear();
}
- void processAll() { while (!empty()) processOne(); }
};
#endif // __CALLBACK_HH__
diff --git a/base/statistics.cc b/base/statistics.cc
index a564ce4be..a2734cf37 100644
--- a/base/statistics.cc
+++ b/base/statistics.cc
@@ -35,6 +35,7 @@
#include <math.h>
+#include "base/callback.hh"
#include "base/cprintf.hh"
#include "base/intmath.hh"
#include "base/misc.hh"
@@ -147,6 +148,7 @@ class Database
StatData *find(const Stat *stat);
void check();
+ void reset();
void regStat(Stat *stat);
StatData *print(Stat *stat);
void regBin(BinBase *bin, std::string name);
@@ -249,6 +251,18 @@ Database::check()
}
void
+Database::reset()
+{
+ list_t::iterator i = allStats.begin();
+ list_t::iterator end = allStats.end();
+
+ while (i != end) {
+ (*i)->reset();
+ ++i;
+ }
+}
+
+void
Database::regStat(Stat *stat)
{
if (map.find(stat) != map.end())
@@ -905,4 +919,19 @@ dump(ostream &stream)
Detail::StatDB().dump(stream);
}
+CallbackQueue resetQueue;
+
+void
+regReset(Callback *cb)
+{
+ resetQueue.add(cb);
+}
+
+void
+reset()
+{
+ Detail::StatDB().reset();
+ resetQueue.process();
+}
+
} // namespace Statistics
diff --git a/cpu/intr_control.cc b/cpu/intr_control.cc
index bce427eea..037b00ef4 100644
--- a/cpu/intr_control.cc
+++ b/cpu/intr_control.cc
@@ -31,6 +31,7 @@
#include "cpu/base_cpu.hh"
#include "cpu/intr_control.hh"
+#include "sim/builder.hh"
#include "sim/sim_object.hh"
using namespace std;
diff --git a/cpu/memtest/memtest.cc b/cpu/memtest/memtest.cc
index 6292911cd..15e47e416 100644
--- a/cpu/memtest/memtest.cc
+++ b/cpu/memtest/memtest.cc
@@ -33,13 +33,13 @@
#include <iomanip>
#include <vector>
-#include "cpu/memtest/memtest.hh"
#include "base/misc.hh"
-#include "sim/sim_events.hh"
-#include "mem/functional_mem/main_memory.hh"
-#include "mem/cache/base_cache.hh"
-
#include "base/statistics.hh"
+#include "cpu/memtest/memtest.hh"
+#include "mem/cache/base_cache.hh"
+#include "mem/functional_mem/main_memory.hh"
+#include "sim/builder.hh"
+#include "sim/sim_events.hh"
#include "sim/sim_stats.hh"
using namespace std;
@@ -160,6 +160,8 @@ MemTest::completeRequest(MemReqPtr req, uint8_t *data)
<< req->size << " bytes at address 0x"
<< hex << req->paddr << ", value = 0x";
printData(cerr, req->data, req->size);
+ cerr << " @ cycle " << dec << curTick;
+
cerr << endl;
}
@@ -211,6 +213,7 @@ MemTest::tick()
uint64_t data = random();
unsigned access_size = random() % 4;
unsigned cacheable = rand() % 100;
+ unsigned probe = rand() % 2;
MemReqPtr req = new MemReq();
@@ -233,29 +236,40 @@ MemTest::tick()
uint8_t *result = new uint8_t[8];
checkMem->access(Read, req->paddr, result, req->size);
if (blockAddr(req->paddr) == traceBlockAddr) {
- cerr << name() << ": initiating read of "
+ cerr << name() << ": initiating read "
+ << ((probe)?"probe of ":"access of ")
<< req->size << " bytes from addr 0x"
<< hex << req->paddr << " at cycle "
<< dec << curTick << endl;
}
-
- req->completionEvent = new MemCompleteEvent(req, result, this);
- cacheInterface->access(req);
+ if (probe) {
+ cacheInterface->probeAndUpdate(req);
+ completeRequest(req, result);
+ } else {
+ req->completionEvent = new MemCompleteEvent(req, result, this);
+ cacheInterface->access(req);
+ }
} else {
// write
req->cmd = Write;
memcpy(req->data, &data, req->size);
checkMem->access(Write, req->paddr, req->data, req->size);
if (blockAddr(req->paddr) == traceBlockAddr) {
- cerr << name() << ": initiating write of "
+ cerr << name() << ": initiating write "
+ << ((probe)?"probe of ":"access of ")
<< req->size << " bytes (value = 0x";
printData(cerr, req->data, req->size);
cerr << ") to addr 0x"
<< hex << req->paddr << " at cycle "
<< dec << curTick << endl;
}
- req->completionEvent = new MemCompleteEvent(req, NULL, this);
- cacheInterface->access(req);
+ if (probe) {
+ cacheInterface->probeAndUpdate(req);
+ completeRequest(req, NULL);
+ } else {
+ req->completionEvent = new MemCompleteEvent(req, NULL, this);
+ cacheInterface->access(req);
+ }
}
}
diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc
index 20790bfb6..3c9be172f 100644
--- a/cpu/simple_cpu/simple_cpu.cc
+++ b/cpu/simple_cpu/simple_cpu.cc
@@ -26,60 +26,53 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <list>
#include <sstream>
#include <string>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "sim/host.hh"
#include "base/cprintf.hh"
+#include "base/inifile.hh"
+#include "base/loader/symtab.hh"
#include "base/misc.hh"
-#include "cpu/full_cpu/smt.hh"
-
-#include "sim/annotation.hh"
-#include "cpu/exec_context.hh"
+#include "base/pollevent.hh"
+#include "base/range.hh"
+#include "base/trace.hh"
#include "cpu/base_cpu.hh"
-#include "sim/debug.hh"
+#include "cpu/exec_context.hh"
+#include "cpu/exetrace.hh"
+#include "cpu/full_cpu/smt.hh"
#include "cpu/simple_cpu/simple_cpu.hh"
-#include "base/inifile.hh"
-#include "mem/mem_interface.hh"
-#include "mem/base_mem.hh"
#include "cpu/static_inst.hh"
+#include "mem/base_mem.hh"
+#include "mem/mem_interface.hh"
+#include "sim/annotation.hh"
+#include "sim/builder.hh"
+#include "sim/debug.hh"
+#include "sim/host.hh"
+#include "sim/sim_events.hh"
+#include "sim/sim_object.hh"
+#include "sim/sim_stats.hh"
#ifdef FULL_SYSTEM
+#include "base/remote_gdb.hh"
+#include "dev/alpha_access.h"
+#include "dev/pciareg.h"
#include "mem/functional_mem/memory_control.hh"
#include "mem/functional_mem/physical_memory.hh"
-#include "targetarch/alpha_memory.hh"
#include "sim/system.hh"
+#include "targetarch/alpha_memory.hh"
+#include "targetarch/vtophys.hh"
#else // !FULL_SYSTEM
+#include "eio/eio.hh"
#include "mem/functional_mem/functional_memory.hh"
#include "sim/prog.hh"
-#include "eio/eio.hh"
#endif // FULL_SYSTEM
-#include "cpu/exetrace.hh"
-#include "base/trace.hh"
-#include "sim/sim_events.hh"
-#include "base/pollevent.hh"
-#include "sim/sim_object.hh"
-#include "sim/sim_stats.hh"
-
-#include "base/range.hh"
-#include "base/loader/symtab.hh"
-
-#ifdef FULL_SYSTEM
-#include "targetarch/vtophys.hh"
-#include "dev/pciareg.h"
-#include "base/remote_gdb.hh"
-#include "dev/alpha_access.h"
-#endif
-
-
using namespace std;
SimpleCPU::CacheCompletionEvent::CacheCompletionEvent(SimpleCPU *_cpu)
diff --git a/dev/alpha_console.cc b/dev/alpha_console.cc
index 526ef0b3c..b917d7a96 100644
--- a/dev/alpha_console.cc
+++ b/dev/alpha_console.cc
@@ -30,22 +30,22 @@
* System Console Definition
*/
-#include <stddef.h>
-#include <stdio.h>
-
+#include <cstddef>
+#include <cstdio>
#include <string>
-#include "dev/alpha_console.hh"
+#include "base/inifile.hh"
+#include "base/str.hh" // for to_number()
+#include "base/trace.hh"
#include "cpu/base_cpu.hh"
-#include "dev/console.hh"
#include "cpu/exec_context.hh"
-#include "mem/functional_mem/memory_control.hh"
+#include "dev/alpha_console.hh"
+#include "dev/console.hh"
#include "dev/simple_disk.hh"
#include "dev/tlaser_clock.hh"
+#include "mem/functional_mem/memory_control.hh"
+#include "sim/builder.hh"
#include "sim/system.hh"
-#include "base/trace.hh"
-#include "base/inifile.hh"
-#include "base/str.hh" // for to_number()
using namespace std;
diff --git a/dev/console.cc b/dev/console.cc
index 976118e2f..168907417 100644
--- a/dev/console.cc
+++ b/dev/console.cc
@@ -43,12 +43,12 @@
#include <string>
#include "base/misc.hh"
-#include "targetarch/ev5.hh"
-
-#include "dev/console.hh"
#include "base/socket.hh"
#include "base/trace.hh"
+#include "dev/console.hh"
#include "mem/functional_mem/memory_control.hh"
+#include "sim/builder.hh"
+#include "targetarch/ev5.hh"
using namespace std;
diff --git a/dev/disk_image.cc b/dev/disk_image.cc
index 0a3955ed1..78599f8d7 100644
--- a/dev/disk_image.cc
+++ b/dev/disk_image.cc
@@ -33,18 +33,19 @@
#include <sys/types.h>
#include <sys/uio.h>
#include <errno.h>
-#include <string.h>
#include <unistd.h>
#include <cstdio>
+#include <cstring>
#include <fstream>
#include <string>
-#include "dev/disk_image.hh"
+#include "base/callback.hh"
#include "base/misc.hh"
#include "base/trace.hh"
+#include "dev/disk_image.hh"
+#include "sim/builder.hh"
#include "sim/sim_exit.hh"
-#include "base/callback.hh"
using namespace std;
diff --git a/dev/etherbus.cc b/dev/etherbus.cc
index fa1d84272..3f6036f72 100644
--- a/dev/etherbus.cc
+++ b/dev/etherbus.cc
@@ -30,17 +30,17 @@
* Device module for modelling an ethernet hub
*/
+#include <cmath>
#include <deque>
#include <string>
#include <vector>
-#include <math.h>
-
+#include "base/trace.hh"
#include "dev/etherbus.hh"
#include "dev/etherdump.hh"
#include "dev/etherint.hh"
#include "dev/etherpkt.hh"
-#include "base/trace.hh"
+#include "sim/builder.hh"
#include "sim/universe.hh"
using namespace std;
diff --git a/dev/etherdump.cc b/dev/etherdump.cc
index dcca0e458..60dc1559d 100644
--- a/dev/etherdump.cc
+++ b/dev/etherdump.cc
@@ -34,8 +34,8 @@
#include <string>
-#include "sim/universe.hh"
#include "dev/etherdump.hh"
+#include "sim/builder.hh"
#include "sim/universe.hh"
using std::string;
diff --git a/dev/etherlink.cc b/dev/etherlink.cc
index 699e9f331..e5665c7b1 100644
--- a/dev/etherlink.cc
+++ b/dev/etherlink.cc
@@ -30,17 +30,17 @@
* Device module for modelling a fixed bandwidth full duplex ethernet link
*/
+#include <cmath>
#include <deque>
#include <string>
#include <vector>
-#include <math.h>
-
-#include "dev/etherlink.hh"
+#include "base/trace.hh"
#include "dev/etherdump.hh"
#include "dev/etherint.hh"
+#include "dev/etherlink.hh"
#include "dev/etherpkt.hh"
-#include "base/trace.hh"
+#include "sim/builder.hh"
#include "sim/universe.hh"
using namespace std;
diff --git a/dev/ethertap.cc b/dev/ethertap.cc
index e12c07c26..b99d46ce5 100644
--- a/dev/ethertap.cc
+++ b/dev/ethertap.cc
@@ -40,14 +40,15 @@
#include <deque>
#include <string>
+#include "base/misc.hh"
+#include "base/pollevent.hh"
+#include "base/socket.hh"
+#include "base/trace.hh"
#include "dev/etherdump.hh"
#include "dev/etherint.hh"
#include "dev/etherpkt.hh"
#include "dev/ethertap.hh"
-#include "base/pollevent.hh"
-#include "base/socket.hh"
-#include "base/trace.hh"
-#include "base/misc.hh"
+#include "sim/builder.hh"
using namespace std;
diff --git a/dev/simple_disk.cc b/dev/simple_disk.cc
index d26cf44ea..aa6ff5b38 100644
--- a/dev/simple_disk.cc
+++ b/dev/simple_disk.cc
@@ -30,19 +30,20 @@
* Simple disk interface for the system console
*/
-#include <string>
-
#include <sys/types.h>
#include <sys/uio.h>
#include <fcntl.h>
-#include <string.h>
#include <unistd.h>
-#include "dev/disk_image.hh"
+#include <cstring>
+#include <string>
+
#include "base/misc.hh"
-#include "mem/functional_mem/physical_memory.hh"
-#include "dev/simple_disk.hh"
#include "base/trace.hh"
+#include "dev/disk_image.hh"
+#include "dev/simple_disk.hh"
+#include "mem/functional_mem/physical_memory.hh"
+#include "sim/builder.hh"
using namespace std;
diff --git a/kern/tru64/tru64_system.cc b/kern/tru64/tru64_system.cc
index 02b6c4fae..0a4f8ae4e 100644
--- a/kern/tru64/tru64_system.cc
+++ b/kern/tru64/tru64_system.cc
@@ -26,27 +26,28 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "base/remote_gdb.hh"
-#include "base/trace.hh"
#include "base/loader/aout_object.hh"
#include "base/loader/ecoff_object.hh"
#include "base/loader/object_file.hh"
#include "base/loader/symtab.hh"
+#include "base/remote_gdb.hh"
+#include "base/trace.hh"
#include "cpu/exec_context.hh"
#include "kern/tru64/tru64_events.hh"
#include "kern/tru64/tru64_system.hh"
#include "mem/functional_mem/memory_control.hh"
#include "mem/functional_mem/physical_memory.hh"
+#include "sim/builder.hh"
#include "targetarch/isa_traits.hh"
#include "targetarch/vtophys.hh"
using namespace std;
-Tru64System::Tru64System(const string _name, MemoryController *_memCtrl,
- PhysicalMemory *_physmem, const string &kernel_path,
- const string &console_path, const string &palcode,
- const string &boot_osflags)
- : System(_name, _memCtrl, _physmem)
+Tru64System::Tru64System(const string _name, const int _init_param,
+ MemoryController *_memCtrl, PhysicalMemory *_physmem,
+ const string &kernel_path, const string &console_path,
+ const string &palcode, const string &boot_osflags)
+ : System(_name, _init_param, _memCtrl, _physmem)
{
kernelSymtab = new SymbolTable;
consoleSymtab = new SymbolTable;
@@ -207,6 +208,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(Tru64System)
SimObjectParam<MemoryController *> mem_ctl;
SimObjectParam<PhysicalMemory *> physmem;
+ Param<int> init_param;
Param<string> kernel_code;
Param<string> console_code;
@@ -219,6 +221,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(Tru64System)
INIT_PARAM(mem_ctl, "memory controller"),
INIT_PARAM(physmem, "phsyical memory"),
+ INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
INIT_PARAM(kernel_code, "file that contains the kernel code"),
INIT_PARAM(console_code, "file that contains the console code"),
INIT_PARAM(pal_code, "file that contains palcode"),
@@ -229,9 +232,9 @@ END_INIT_SIM_OBJECT_PARAMS(Tru64System)
CREATE_SIM_OBJECT(Tru64System)
{
- Tru64System *sys = new Tru64System(getInstanceName(), mem_ctl, physmem,
- kernel_code, console_code, pal_code,
- boot_osflags);
+ Tru64System *sys = new Tru64System(getInstanceName(), init_param, mem_ctl,
+ physmem, kernel_code, console_code,
+ pal_code, boot_osflags);
return sys;
}
diff --git a/kern/tru64/tru64_system.hh b/kern/tru64/tru64_system.hh
index 087ef038c..7fd337eb5 100644
--- a/kern/tru64/tru64_system.hh
+++ b/kern/tru64/tru64_system.hh
@@ -79,6 +79,7 @@ class Tru64System : public System
public:
Tru64System(const std::string _name,
+ const int _init_param,
MemoryController *_memCtrl,
PhysicalMemory *_physmem,
const std::string &kernel_path,
diff --git a/sim/builder.cc b/sim/builder.cc
new file mode 100644
index 000000000..fa435d322
--- /dev/null
+++ b/sim/builder.cc
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <assert.h>
+
+#include "base/inifile.hh"
+#include "base/misc.hh"
+#include "sim/builder.hh"
+#include "sim/configfile.hh"
+#include "sim/host.hh"
+#include "sim/sim_object.hh"
+#include "sim/sim_stats.hh"
+
+using namespace std;
+
+///////////////////////////////////////////
+//
+// SimObjectBuilder member definitions
+//
+///////////////////////////////////////////
+
+// override ParamContext::parseParams() to check params based on
+// instance name first. If not found, then check based on iniSection
+// (as in default ParamContext implementation).
+void
+SimObjectBuilder::parseParams(IniFile &iniFile)
+{
+ iniFilePtr = &iniFile; // set object member
+
+ ParamList::iterator i;
+
+ for (i = paramList->begin(); i != paramList->end(); ++i) {
+ string string_value;
+
+ if (iniFile.findDefault(instanceName, (*i)->name, string_value)) {
+ (*i)->parse(string_value);
+ }
+ else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) {
+ (*i)->parse(string_value);
+ }
+ }
+}
+
+
+void
+SimObjectBuilder::printErrorProlog(ostream &os)
+{
+ os << "Error creating object '" << getInstanceName()
+ << "' of type '" << simObjClassName
+ << "', section '" << iniSection << "':" << endl;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+//
+// SimObjectClass member definitions
+//
+////////////////////////////////////////////////////////////////////////
+
+// Map of class names to SimObjectBuilder creation functions. Need to
+// make this a pointer so we can force initialization on the first
+// reference; otherwise, some SimObjectClass constructors may be invoked
+// before the classMap constructor.
+map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL;
+
+// SimObjectClass constructor: add mapping to classMap
+SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc)
+{
+ if (classMap == NULL)
+ classMap = new map<string,SimObjectClass::CreateFunc>();
+
+ if ((*classMap)[className])
+ {
+ cerr << "Error: simulation object class " << className << " redefined"
+ << endl;
+ fatal("");
+ }
+
+ // add className --> createFunc to class map
+ (*classMap)[className] = createFunc;
+}
+
+
+//
+//
+SimObject *
+SimObjectClass::createObject(IniFile &configDB,
+ const string &configClassName,
+ const string &objName,
+ ConfigNode *configNode)
+{
+ // find simulation object class name from configuration class
+ // (specified by 'type=' parameter)
+ string simObjClassName;
+
+ if (!configDB.findDefault(configClassName, "type", simObjClassName)) {
+ cerr << "Configuration class '" << configClassName << "' not found."
+ << endl;
+ abort();
+ }
+
+ // look up className to get appropriate createFunc
+ if (classMap->find(simObjClassName) == classMap->end()) {
+ cerr << "Simulator object class '" << simObjClassName << "' not found."
+ << endl;
+ abort();
+ }
+
+ CreateFunc createFunc = (*classMap)[simObjClassName];
+
+ // call createFunc with config hierarchy node to get object
+ // builder instance (context with parameters for object creation)
+ SimObjectBuilder *objectBuilder = (*createFunc)(configClassName,
+ objName, configNode,
+ simObjClassName);
+
+ assert(objectBuilder != NULL);
+
+ // parse all parameters in context to generate parameter values
+ objectBuilder->parseParams(configDB);
+
+ // now create the actual simulation object
+ SimObject *object = objectBuilder->create();
+
+ assert(object != NULL);
+
+ // 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;
+
+ // done with the SimObjectBuilder now
+ delete objectBuilder;
+
+ return object;
+}
+
+
+//
+// static method:
+//
+void
+SimObjectClass::describeAllClasses(ostream &os)
+{
+ map<string,CreateFunc>::iterator iter;
+
+ for (iter = classMap->begin(); iter != classMap->end(); ++iter) {
+ const string &className = iter->first;
+ CreateFunc createFunc = iter->second;
+
+ os << "[" << className << "]\n";
+
+ // create dummy object builder just to instantiate parameters
+ SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, "");
+
+ // now get the object builder to describe ite params
+ objectBuilder->describeParams(os);
+
+ os << endl;
+
+ // done with the object builder now
+ delete objectBuilder;
+ }
+}
diff --git a/sim/builder.hh b/sim/builder.hh
new file mode 100644
index 000000000..0364276bf
--- /dev/null
+++ b/sim/builder.hh
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __BUILDER_HH__
+#define __BUILDER_HH__
+
+#include <map>
+#include <list>
+#include <vector>
+#include <iostream>
+
+#include "sim/param.hh"
+
+class SimObject;
+
+//
+// A SimObjectBuilder serves as an evaluation context for a set of
+// parameters that describe a specific instance of a SimObject. This
+// evaluation context corresponds to a section in the .ini file (as
+// with the base ParamContext) plus an optional node in the
+// configuration hierarchy (the configNode member) for resolving
+// SimObject references. SimObjectBuilder is an abstract superclass;
+// derived classes specialize the class for particular subclasses of
+// SimObject (e.g., BaseCache).
+//
+// For typical usage, see the definition of
+// SimObjectClass::createObject().
+//
+class SimObjectBuilder : public ParamContext
+{
+ private:
+ // name of the instance we are creating
+ std::string instanceName;
+
+ // The corresponding node in the configuration hierarchy.
+ // (optional: may be null if the created object is not in the
+ // hierarchy)
+ ConfigNode *configNode;
+
+ // The external SimObject class name (for error messages)
+ std::string simObjClassName;
+
+ public:
+ 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() {}
+
+ // call parse() on all params in this context to convert string
+ // representations to parameter values
+ virtual void parseParams(IniFile &iniFile);
+
+ // parameter error prolog (override of ParamContext)
+ virtual void printErrorProlog(std::ostream &);
+
+ // generate the name for this SimObject instance (derived from the
+ // configuration hierarchy node label and position)
+ virtual const std::string &getInstanceName() { return instanceName; }
+
+ // return the configuration hierarchy node for this context.
+ virtual ConfigNode *getConfigNode() { return configNode; }
+
+ // Create the actual SimObject corresponding to the parameter
+ // values in this context. This function is overridden in derived
+ // classes to call a specific constructor for a particular
+ // subclass of SimObject.
+ virtual SimObject *create() = 0;
+};
+
+
+//
+// Handy macros for initializing parameter members of classes derived
+// from SimObjectBuilder. Assumes that the name of the parameter
+// member object is the same as the textual parameter name seen by the
+// user. (Note that '#p' is expanded by the preprocessor to '"p"'.)
+//
+#define INIT_PARAM(p, desc) p(this, #p, desc)
+#define INIT_PARAM_DFLT(p, desc, dflt) p(this, #p, desc, dflt)
+
+//
+// Initialize an enumeration variable... assumes that 'map' is the
+// name of an array of mappings (char * for SimpleEnumParam, or
+// EnumParamMap for MappedEnumParam).
+//
+#define INIT_ENUM_PARAM(p, desc, map) \
+ p(this, #p, desc, map, sizeof(map)/sizeof(map[0]))
+#define INIT_ENUM_PARAM_DFLT(p, desc, map, dflt) \
+ p(this, #p, desc, map, sizeof(map)/sizeof(map[0]), dflt)
+
+//
+// An instance of SimObjectClass corresponds to a class derived from
+// SimObject. The SimObjectClass instance serves to bind the string
+// name (found in the config file) to a function that creates an
+// instance of the appropriate derived class.
+//
+// This would be much cleaner in Smalltalk or Objective-C, where types
+// are first-class objects themselves.
+//
+class SimObjectClass
+{
+ public:
+ // Type CreateFunc is a pointer to a function that creates a new
+ // simulation object builder based on a .ini-file parameter
+ // section (specified by the first string argument), a unique name
+ // for the object (specified by the second string argument), and
+ // an optional config hierarchy node (specified by the third
+ // argument). A pointer to the new SimObjectBuilder is returned.
+ typedef SimObjectBuilder *(*CreateFunc)(const std::string &configClassName,
+ const std::string &objName,
+ ConfigNode *configNode,
+ const std::string &simObjClassName);
+
+ static std::map<std::string,CreateFunc> *classMap;
+
+ // Constructor. For example:
+ //
+ // SimObjectClass baseCacheClass("BaseCache", newBaseCacheBuilder);
+ //
+ SimObjectClass(const std::string &className, CreateFunc createFunc);
+
+ // create SimObject given name of class and pointer to
+ // configuration hierarchy node
+ static SimObject *createObject(IniFile &configDB,
+ const std::string &configClassName,
+ const std::string &objName,
+ ConfigNode *configNode);
+
+ // print descriptions of all parameters registered with all
+ // SimObject classes
+ static void describeAllClasses(std::ostream &os);
+};
+
+//
+// Macros to encapsulate the magic of declaring & defining
+// SimObjectBuilder and SimObjectClass objects
+//
+
+#define BEGIN_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \
+class OBJ_CLASS##Builder : public SimObjectBuilder \
+{ \
+ public:
+
+#define END_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \
+ \
+ OBJ_CLASS##Builder(const std::string &configClass, \
+ const std::string &instanceName, \
+ ConfigNode *configNode, \
+ const std::string &simObjClassName); \
+ virtual ~OBJ_CLASS##Builder() {} \
+ \
+ OBJ_CLASS *create(); \
+};
+
+#define BEGIN_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \
+OBJ_CLASS##Builder::OBJ_CLASS##Builder(const std::string &configClass, \
+ const std::string &instanceName, \
+ ConfigNode *configNode, \
+ const std::string &simObjClassName) \
+ : SimObjectBuilder(configClass, instanceName, \
+ configNode, simObjClassName),
+
+
+#define END_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \
+{ \
+}
+
+#define CREATE_SIM_OBJECT(OBJ_CLASS) \
+OBJ_CLASS *OBJ_CLASS##Builder::create()
+
+#define REGISTER_SIM_OBJECT(CLASS_NAME, OBJ_CLASS) \
+SimObjectBuilder * \
+new##OBJ_CLASS##Builder(const std::string &configClass, \
+ const std::string &instanceName, \
+ ConfigNode *configNode, \
+ const std::string &simObjClassName) \
+{ \
+ return new OBJ_CLASS##Builder(configClass, instanceName, \
+ configNode, simObjClassName); \
+} \
+ \
+SimObjectClass the##OBJ_CLASS##Class(CLASS_NAME, \
+ new##OBJ_CLASS##Builder); \
+ \
+/* see param.hh */ \
+DEFINE_SIM_OBJECT_CLASS_NAME(CLASS_NAME, OBJ_CLASS)
+
+
+#endif // __BUILDER_HH__
diff --git a/sim/main.cc b/sim/main.cc
index ae4b5af77..ce9ef5819 100644
--- a/sim/main.cc
+++ b/sim/main.cc
@@ -37,23 +37,22 @@
#include <string>
#include <vector>
-#include "sim/host.hh"
-#include "base/misc.hh"
-
#include "base/copyright.hh"
#include "base/inifile.hh"
-#include "sim/configfile.hh"
+#include "base/misc.hh"
#include "base/pollevent.hh"
#include "base/statistics.hh"
+#include "cpu/base_cpu.hh"
+#include "cpu/full_cpu/smt.hh"
+#include "sim/async.hh"
+#include "sim/builder.hh"
+#include "sim/configfile.hh"
+#include "sim/host.hh"
#include "sim/sim_events.hh"
#include "sim/sim_exit.hh"
#include "sim/sim_object.hh"
#include "sim/sim_stats.hh"
#include "sim/sim_time.hh"
-#include "cpu/full_cpu/smt.hh"
-
-#include "cpu/base_cpu.hh"
-#include "sim/async.hh"
using namespace std;
diff --git a/sim/prog.cc b/sim/prog.cc
index c52d51f63..275e1551b 100644
--- a/sim/prog.cc
+++ b/sim/prog.cc
@@ -28,22 +28,21 @@
#include <unistd.h>
#include <fcntl.h>
-#include <stdio.h>
+#include <cstdio>
#include <string>
-#include "mem/functional_mem/main_memory.hh"
-#include "sim/prog.hh"
-
-#include "eio/eio.hh"
#include "base/intmath.hh"
-#include "cpu/full_cpu/thread.hh"
-#include "sim/fake_syscall.hh"
#include "base/loader/object_file.hh"
+#include "base/statistics.hh"
#include "cpu/exec_context.hh"
#include "cpu/full_cpu/smt.hh"
-
-#include "base/statistics.hh"
+#include "cpu/full_cpu/thread.hh"
+#include "eio/eio.hh"
+#include "mem/functional_mem/main_memory.hh"
+#include "sim/builder.hh"
+#include "sim/fake_syscall.hh"
+#include "sim/prog.hh"
#include "sim/sim_stats.hh"
using namespace std;
diff --git a/sim/sim_object.cc b/sim/sim_object.cc
index 955c43bb8..1ddb15c82 100644
--- a/sim/sim_object.cc
+++ b/sim/sim_object.cc
@@ -121,155 +121,3 @@ SimObject::printAllExtraOutput(ostream &os)
(*i)->printExtraOutput(os);
}
}
-
-///////////////////////////////////////////
-//
-// SimObjectBuilder member definitions
-//
-///////////////////////////////////////////
-
-// override ParamContext::parseParams() to check params based on
-// instance name first. If not found, then check based on iniSection
-// (as in default ParamContext implementation).
-void
-SimObjectBuilder::parseParams(IniFile &iniFile)
-{
- iniFilePtr = &iniFile; // set object member
-
- ParamList::iterator i;
-
- for (i = paramList->begin(); i != paramList->end(); ++i) {
- string string_value;
-
- if (iniFile.findDefault(instanceName, (*i)->name, string_value)) {
- (*i)->parse(string_value);
- }
- else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) {
- (*i)->parse(string_value);
- }
- }
-}
-
-
-void
-SimObjectBuilder::printErrorProlog(ostream &os)
-{
- os << "Error creating object '" << getInstanceName()
- << "' of type '" << simObjClassName
- << "', section '" << iniSection << "':" << endl;
-}
-
-
-////////////////////////////////////////////////////////////////////////
-//
-// SimObjectClass member definitions
-//
-////////////////////////////////////////////////////////////////////////
-
-// Map of class names to SimObjectBuilder creation functions. Need to
-// make this a pointer so we can force initialization on the first
-// reference; otherwise, some SimObjectClass constructors may be invoked
-// before the classMap constructor.
-map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL;
-
-// SimObjectClass constructor: add mapping to classMap
-SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc)
-{
- if (classMap == NULL)
- classMap = new map<string,SimObjectClass::CreateFunc>();
-
- if ((*classMap)[className])
- {
- cerr << "Error: simulation object class " << className << " redefined"
- << endl;
- fatal("");
- }
-
- // add className --> createFunc to class map
- (*classMap)[className] = createFunc;
-}
-
-
-//
-//
-SimObject *
-SimObjectClass::createObject(IniFile &configDB,
- const string &configClassName,
- const string &objName,
- ConfigNode *configNode)
-{
- // find simulation object class name from configuration class
- // (specified by 'type=' parameter)
- string simObjClassName;
-
- if (!configDB.findDefault(configClassName, "type", simObjClassName)) {
- cerr << "Configuration class '" << configClassName << "' not found."
- << endl;
- abort();
- }
-
- // look up className to get appropriate createFunc
- if (classMap->find(simObjClassName) == classMap->end()) {
- cerr << "Simulator object class '" << simObjClassName << "' not found."
- << endl;
- abort();
- }
-
- CreateFunc createFunc = (*classMap)[simObjClassName];
-
- // call createFunc with config hierarchy node to get object
- // builder instance (context with parameters for object creation)
- SimObjectBuilder *objectBuilder = (*createFunc)(configClassName,
- objName, configNode,
- simObjClassName);
-
- assert(objectBuilder != NULL);
-
- // parse all parameters in context to generate parameter values
- objectBuilder->parseParams(configDB);
-
- // now create the actual simulation object
- SimObject *object = objectBuilder->create();
-
- assert(object != NULL);
-
- // 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;
-
- // done with the SimObjectBuilder now
- delete objectBuilder;
-
- return object;
-}
-
-
-//
-// static method:
-//
-void
-SimObjectClass::describeAllClasses(ostream &os)
-{
- map<string,CreateFunc>::iterator iter;
-
- for (iter = classMap->begin(); iter != classMap->end(); ++iter) {
- const string &className = iter->first;
- CreateFunc createFunc = iter->second;
-
- os << "[" << className << "]\n";
-
- // create dummy object builder just to instantiate parameters
- SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, "");
-
- // now get the object builder to describe ite params
- objectBuilder->describeParams(os);
-
- os << endl;
-
- // done with the object builder now
- delete objectBuilder;
- }
-}
diff --git a/sim/sim_object.hh b/sim/sim_object.hh
index 7f71d1852..6c15fc88f 100644
--- a/sim/sim_object.hh
+++ b/sim/sim_object.hh
@@ -76,185 +76,4 @@ class SimObject : public Serializeable
static void printAllExtraOutput(std::ostream&);
};
-
-//
-// A SimObjectBuilder serves as an evaluation context for a set of
-// parameters that describe a specific instance of a SimObject. This
-// evaluation context corresponds to a section in the .ini file (as
-// with the base ParamContext) plus an optional node in the
-// configuration hierarchy (the configNode member) for resolving
-// SimObject references. SimObjectBuilder is an abstract superclass;
-// derived classes specialize the class for particular subclasses of
-// SimObject (e.g., BaseCache).
-//
-// For typical usage, see the definition of
-// SimObjectClass::createObject().
-//
-class SimObjectBuilder : public ParamContext
-{
- private:
- // name of the instance we are creating
- std::string instanceName;
-
- // The corresponding node in the configuration hierarchy.
- // (optional: may be null if the created object is not in the
- // hierarchy)
- ConfigNode *configNode;
-
- // The external SimObject class name (for error messages)
- std::string simObjClassName;
-
- public:
- 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() {}
-
- // call parse() on all params in this context to convert string
- // representations to parameter values
- virtual void parseParams(IniFile &iniFile);
-
- // parameter error prolog (override of ParamContext)
- virtual void printErrorProlog(std::ostream &);
-
- // generate the name for this SimObject instance (derived from the
- // configuration hierarchy node label and position)
- virtual const std::string &getInstanceName() { return instanceName; }
-
- // return the configuration hierarchy node for this context.
- virtual ConfigNode *getConfigNode() { return configNode; }
-
- // Create the actual SimObject corresponding to the parameter
- // values in this context. This function is overridden in derived
- // classes to call a specific constructor for a particular
- // subclass of SimObject.
- virtual SimObject *create() = 0;
-};
-
-
-//
-// Handy macros for initializing parameter members of classes derived
-// from SimObjectBuilder. Assumes that the name of the parameter
-// member object is the same as the textual parameter name seen by the
-// user. (Note that '#p' is expanded by the preprocessor to '"p"'.)
-//
-#define INIT_PARAM(p, desc) p(this, #p, desc)
-#define INIT_PARAM_DFLT(p, desc, dflt) p(this, #p, desc, dflt)
-
-//
-// Initialize an enumeration variable... assumes that 'map' is the
-// name of an array of mappings (char * for SimpleEnumParam, or
-// EnumParamMap for MappedEnumParam).
-//
-#define INIT_ENUM_PARAM(p, desc, map) \
- p(this, #p, desc, map, sizeof(map)/sizeof(map[0]))
-#define INIT_ENUM_PARAM_DFLT(p, desc, map, dflt) \
- p(this, #p, desc, map, sizeof(map)/sizeof(map[0]), dflt)
-
-//
-// An instance of SimObjectClass corresponds to a class derived from
-// SimObject. The SimObjectClass instance serves to bind the string
-// name (found in the config file) to a function that creates an
-// instance of the appropriate derived class.
-//
-// This would be much cleaner in Smalltalk or Objective-C, where types
-// are first-class objects themselves.
-//
-class SimObjectClass
-{
- public:
- // Type CreateFunc is a pointer to a function that creates a new
- // simulation object builder based on a .ini-file parameter
- // section (specified by the first string argument), a unique name
- // for the object (specified by the second string argument), and
- // an optional config hierarchy node (specified by the third
- // argument). A pointer to the new SimObjectBuilder is returned.
- typedef SimObjectBuilder *(*CreateFunc)(const std::string &configClassName,
- const std::string &objName,
- ConfigNode *configNode,
- const std::string &simObjClassName);
-
- static std::map<std::string,CreateFunc> *classMap;
-
- // Constructor. For example:
- //
- // SimObjectClass baseCacheClass("BaseCache", newBaseCacheBuilder);
- //
- SimObjectClass(const std::string &className, CreateFunc createFunc);
-
- // create SimObject given name of class and pointer to
- // configuration hierarchy node
- static SimObject *createObject(IniFile &configDB,
- const std::string &configClassName,
- const std::string &objName,
- ConfigNode *configNode);
-
- // print descriptions of all parameters registered with all
- // SimObject classes
- static void describeAllClasses(std::ostream &os);
-};
-
-//
-// Macros to encapsulate the magic of declaring & defining
-// SimObjectBuilder and SimObjectClass objects
-//
-
-#define BEGIN_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \
-class OBJ_CLASS##Builder : public SimObjectBuilder \
-{ \
- public:
-
-#define END_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \
- \
- OBJ_CLASS##Builder(const std::string &configClass, \
- const std::string &instanceName, \
- ConfigNode *configNode, \
- const std::string &simObjClassName); \
- virtual ~OBJ_CLASS##Builder() {} \
- \
- OBJ_CLASS *create(); \
-};
-
-#define BEGIN_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \
-OBJ_CLASS##Builder::OBJ_CLASS##Builder(const std::string &configClass, \
- const std::string &instanceName, \
- ConfigNode *configNode, \
- const std::string &simObjClassName) \
- : SimObjectBuilder(configClass, instanceName, \
- configNode, simObjClassName),
-
-
-#define END_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \
-{ \
-}
-
-#define CREATE_SIM_OBJECT(OBJ_CLASS) \
-OBJ_CLASS *OBJ_CLASS##Builder::create()
-
-#define REGISTER_SIM_OBJECT(CLASS_NAME, OBJ_CLASS) \
-SimObjectBuilder * \
-new##OBJ_CLASS##Builder(const std::string &configClass, \
- const std::string &instanceName, \
- ConfigNode *configNode, \
- const std::string &simObjClassName) \
-{ \
- return new OBJ_CLASS##Builder(configClass, instanceName, \
- configNode, simObjClassName); \
-} \
- \
-SimObjectClass the##OBJ_CLASS##Class(CLASS_NAME, \
- new##OBJ_CLASS##Builder); \
- \
-/* see param.hh */ \
-DEFINE_SIM_OBJECT_CLASS_NAME(CLASS_NAME, OBJ_CLASS)
-
-
#endif // __SIM_OBJECT_HH__
diff --git a/sim/system.cc b/sim/system.cc
index fd80e23c3..e1e293c90 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -37,9 +37,11 @@ vector<System *> System::systemList;
int System::numSystemsRunning = 0;
System::System(const std::string _name,
+ const int _init_param,
MemoryController *_memCtrl,
PhysicalMemory *_physmem)
: SimObject(_name),
+ init_param(_init_param),
memCtrl(_memCtrl),
physmem(_physmem)
{
diff --git a/sim/system.hh b/sim/system.hh
index bec1011ce..56a3d6a6f 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -46,6 +46,7 @@ class ExecContext;
class System : public SimObject
{
public:
+ const int init_param;
MemoryController *memCtrl;
PhysicalMemory *physmem;
@@ -55,7 +56,8 @@ class System : public SimObject
void registerExecContext(ExecContext *xc);
public:
- System(const std::string name, MemoryController *, PhysicalMemory *);
+ System(const std::string _name, const int _init_param,
+ MemoryController *, PhysicalMemory *);
~System();
virtual void init(ExecContext *xc) = 0;
diff --git a/test/Makefile b/test/Makefile
index 8c36f9806..c95f8cb8d 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -4,15 +4,15 @@ CC= gcc
CXX= g++
CURDIR?= $(shell /bin/pwd)
-SRCDIR?= .
+SRCDIR?= ..
TARGET?= alpha
-TEST_SRCDIR?= $(SRCDIR)
-ARCH_SRCDIR?= $(SRCDIR)/../arch/$(TARGET)
-BASE_SRCDIR?= $(SRCDIR)/../base
-SIM_SRCDIR?= $(SRCDIR)/../sim
-CACHE_SRCDIR?= $(SRCDIR)/../sim/cache
-OLD_SRCDIR= $(SRCDIR)/../old
+TEST_SRCDIR?= $(SRCDIR)/test
+ARCH_SRCDIR?= $(SRCDIR)/arch/$(TARGET)
+BASE_SRCDIR?= $(SRCDIR)/base
+SIM_SRCDIR?= $(SRCDIR)/sim
+CACHE_SRCDIR?= $(SRCDIR)/sim/cache
+OLD_SRCDIR= $(SRCDIR)/old
vpath % $(TEST_SRCDIR)
vpath % $(BASE_SRCDIR)
@@ -20,13 +20,14 @@ vpath % $(SIM_SRCDIR)
vpath % $(CACHE_SRCDIR)
vpath % $(OLD_SRCDIR)
-INCLDIRS= -I$(ARCH_SRCDIR) -I$(BASE_SRCDIR) -I$(SIM_SRCDIR) \
- -I$(CACHE_SRCDIR) -I$(OLD_SRCDIR)
-CCFLAGS= -g -O0 -MMD -I. $(INCLDIRS) -I- -DTRACING_ON=0
+CCFLAGS= -g -O0 -MMD -I. -I$(SRCDIR) -I- -DTRACING_ON=0
default:
@echo "You must specify a target"
+targetarch:
+ ln -s ../arch/$(TARGET) targetarch
+
bitvectest: bitvectest.o
$(CXX) $(LFLAGS) -o $@ $^
@@ -51,7 +52,8 @@ offtest: offtest.o
rangetest: rangetest.o str.o
$(CXX) $(LFLAGS) -o $@ $^
-stattest: statistics.o stattest.o cprintf.o misc.o omisc.o str.o
+stattest: cprintf.o hostinfo.o misc.o sim_stats.o sim_time.o \
+ statistics.o stattest.o str.o
$(CXX) $(LFLAGS) -o $@ $^
strnumtest: strnumtest.o str.o
@@ -63,7 +65,7 @@ symtest: misc.o symtest.o symtab.o str.o
tokentest: tokentest.o str.o
$(CXX) $(LFLAGS) -o $@ $^
-tracetest: tracetest.o trace.o trace_flags.o cprintf.o str.o misc.o omisc.o
+tracetest: tracetest.o trace.o trace_flags.o cprintf.o str.o misc.o
$(CXX) $(LFLAGS) -o $@ $^
clean:
diff --git a/test/stattest.cc b/test/stattest.cc
index a009c16d8..38a15900d 100644
--- a/test/stattest.cc
+++ b/test/stattest.cc
@@ -32,15 +32,16 @@
#include <unistd.h>
#include "base/cprintf.hh"
-#include "sim/host.hh"
#include "base/misc.hh"
#include "base/statistics.hh"
+#include "sim/host.hh"
+#include "sim/sim_stats.hh"
using namespace std;
using namespace Statistics;
Tick curTick = 0;
-//Tick ticksPerSecond = ULL(2000000000);
+Tick ticksPerSecond = ULL(2000000000);
Scalar<> s1;
Scalar<> s2;
@@ -493,10 +494,17 @@ main(int argc, char *argv[])
s12.sample(100);
MainBin::activate(bin1);
+ cout << "dump 1" << endl;
dump(cout);
cout << endl << endl;
MainBin::activate(bin2);
+ cout << "dump 2" << endl;
+ dump(cout);
+ cout << endl << endl;
+
+ cout << "dump 3" << endl;
+ reset();
dump(cout);
cout << endl << endl;