diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2003-10-23 19:07:52 -0700 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2003-10-23 19:07:52 -0700 |
commit | f5da73b6881991a28844ed59e8dcc1d154ddae7e (patch) | |
tree | bc89728af5db24ef0bf1580045c3bcd26a206e85 /sim | |
parent | 73b050a541b1778596f9ebffa8a9f780446365c3 (diff) | |
download | gem5-f5da73b6881991a28844ed59e8dcc1d154ddae7e.tar.xz |
Initial support for CPU switching. New SamplingCPU object encompasses a set
of CPUs that get switched round-robin (though currently we're only shooting for
two CPUs and one switch event, and even that doesn't quite work yet). Registration
of ExecContexts with System/Process object factored out so we can create two CPUs
but only register one of them at a time. Also worked at making behavior and naming
in System and Process objects more consistent.
arch/alpha/ev5.cc:
Rename ipr_init to initIPRs and get rid of unused mem arg.
arch/alpha/fake_syscall.cc:
Process:numCpus is now a function (not a data member).
base/remote_gdb.hh:
Support for ExecContext switching.
cpu/base_cpu.cc:
cpu/base_cpu.hh:
cpu/exec_context.cc:
cpu/exec_context.hh:
cpu/simple_cpu/simple_cpu.hh:
Support for ExecContext switching.
Renamed contexts array to execContexts to be consistent with Process.
CPU ID now auto-assigned by system object.
cpu/simple_cpu/simple_cpu.cc:
Support for ExecContext switching.
Renamed contexts array to execContexts to be consistent with Process.
CPU ID now auto-assigned by system object.
Cleaned up MP full-system initialization a bit.
dev/alpha_console.cc:
Renamed xcvec array to execContexts to be consistent with Process.
kern/tru64/tru64_system.cc:
kern/tru64/tru64_system.hh:
Support for ExecContext switching.
CPU ID now auto-assigned by system object.
sim/prog.cc:
sim/prog.hh:
Support for ExecContext switching.
Process:numCpus is now a function (not a data member).
sim/system.cc:
sim/system.hh:
Support for ExecContext switching.
Renamed xcvec array to execContexts to be consistent with Process.
--HG--
extra : convert_revision : 79649cffad5bf3e83de8df44236941907926d791
Diffstat (limited to 'sim')
-rw-r--r-- | sim/prog.cc | 36 | ||||
-rw-r--r-- | sim/prog.hh | 18 | ||||
-rw-r--r-- | sim/system.cc | 20 | ||||
-rw-r--r-- | sim/system.hh | 8 |
4 files changed, 52 insertions, 30 deletions
diff --git a/sim/prog.cc b/sim/prog.cc index 275e1551b..599a0ca9a 100644 --- a/sim/prog.cc +++ b/sim/prog.cc @@ -85,8 +85,6 @@ Process::Process(const string &name, fd_map[i] = -1; } - numCpus = 0; - num_syscalls = 0; // other parameters will be initialized when the program is loaded @@ -136,30 +134,42 @@ Process::openOutputFile(const string &filename) } -void -Process::registerExecContext(ExecContext *ec) +int +Process::registerExecContext(ExecContext *xc) { - if (execContexts.empty()) { + // add to list + int myIndex = execContexts.size(); + execContexts.push_back(xc); + + if (myIndex == 0) { // first exec context for this process... initialize & enable // copy process's initial regs struct - ec->regs = *init_regs; + xc->regs = *init_regs; // mark this context as active - ec->setStatus(ExecContext::Active); + xc->initStatus(ExecContext::Active); } else { - ec->setStatus(ExecContext::Unallocated); + xc->initStatus(ExecContext::Unallocated); } - // add to list - execContexts.push_back(ec); - - // increment available CPU count - ++numCpus; + // return CPU number to caller and increment available CPU count + return myIndex; } +void +Process::replaceExecContext(int xcIndex, ExecContext *xc) +{ + if (xcIndex >= execContexts.size()) { + panic("replaceExecContext: bad xcIndex, %d >= %d\n", + xcIndex, execContexts.size()); + } + + execContexts[xcIndex] = xc; +} + // map simulator fd sim_fd to target fd tgt_fd void Process::dup_fd(int sim_fd, int tgt_fd) diff --git a/sim/prog.hh b/sim/prog.hh index ee4bc59fe..e93dd684c 100644 --- a/sim/prog.hh +++ b/sim/prog.hh @@ -36,7 +36,7 @@ // #ifndef FULL_SYSTEM -#include <list> +#include <vector> #include "targetarch/isa_traits.hh" #include "sim/sim_object.hh" @@ -55,10 +55,10 @@ class Process : public SimObject bool initialContextLoaded; // execution contexts associated with this process - std::list<ExecContext *> execContexts; - // number of CPUs assigned to this process: should match number of - // contexts in execContexts list - unsigned numCpus; + std::vector<ExecContext *> execContexts; + + // number of CPUs (esxec contexts, really) assigned to this process. + unsigned int numCpus() { return execContexts.size(); } // record of blocked context struct WaitRec @@ -123,8 +123,12 @@ class Process : public SimObject // override of virtual SimObject method: register statistics virtual void regStats(); - // register an execution context for this process - void registerExecContext(ExecContext *); + // register an execution context for this process. + // returns xc's cpu number (index into execContexts[]) + int registerExecContext(ExecContext *xc); + + + void replaceExecContext(int xcIndex, ExecContext *xc); // map simulator fd sim_fd to target fd tgt_fd void dup_fd(int sim_fd, int tgt_fd); diff --git a/sim/system.cc b/sim/system.cc index 0e0b83332..76c895a88 100644 --- a/sim/system.cc +++ b/sim/system.cc @@ -56,16 +56,24 @@ System::~System() } -void +int System::registerExecContext(ExecContext *xc) { - if (xc->cpu_id >= 12/*MAX_CPUS*/) - panic("Too many CPU's\n"); + int myIndex = execContexts.size(); + execContexts.push_back(xc); + return myIndex; +} + - if (xc->cpu_id >= xcvec.size()) - xcvec.resize(xc->cpu_id + 1); +void +System::replaceExecContext(int xcIndex, ExecContext *xc) +{ + if (xcIndex >= execContexts.size()) { + panic("replaceExecContext: bad xcIndex, %d >= %d\n", + xcIndex, execContexts.size()); + } - xcvec[xc->cpu_id] = xc; + execContexts[xcIndex] = xc; } diff --git a/sim/system.hh b/sim/system.hh index 56a3d6a6f..1c4440b9a 100644 --- a/sim/system.hh +++ b/sim/system.hh @@ -52,16 +52,16 @@ class System : public SimObject PCEventQueue pcEventQueue; - std::vector<ExecContext *> xcvec; - void registerExecContext(ExecContext *xc); + std::vector<ExecContext *> execContexts; + + virtual int registerExecContext(ExecContext *xc); + virtual void replaceExecContext(int xcIndex, ExecContext *xc); public: System(const std::string _name, const int _init_param, MemoryController *, PhysicalMemory *); ~System(); - virtual void init(ExecContext *xc) = 0; - virtual Addr getKernelStart() const = 0; virtual Addr getKernelEnd() const = 0; virtual Addr getKernelEntry() const = 0; |