summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2006-01-28 00:08:22 -0500
committerSteve Reinhardt <stever@eecs.umich.edu>2006-01-28 00:08:22 -0500
commit03a2aca9a9fc6afa8d7e6f92cc9acc1e9b37a7cd (patch)
tree3f7061edd21acae37fc6208a3895f7b37f76512a /cpu
parent9df80550d43dd875e3449bd2287b0bccde36dcad (diff)
downloadgem5-03a2aca9a9fc6afa8d7e6f92cc9acc1e9b37a7cd.tar.xz
Changes for Process object initialization in merged-memory environment.
System object now exists for both fullsys and syscall emulation, as the latter needs it so that Process objects can find the shared PhysicalMemory for initialization. Changes are incomplete: still need to fix up Process (& EioProcess) memory initialization and syscall emulation code for new mem interface. arch/alpha/alpha_linux_process.cc: arch/alpha/alpha_linux_process.hh: arch/alpha/alpha_tru64_process.cc: arch/alpha/alpha_tru64_process.hh: cpu/base.cc: cpu/base.hh: Take System argument in constructor. cpu/exec_context.cc: Take System argument in constructor. Merge two constructors into a single one. cpu/exec_context.hh: Take System argument in constructor. Merge two constructors into a single one. Replace dummy translation with lookup in Process object's page table. python/m5/objects/Process.py: Add System parameter to Process object (& subobjects). python/m5/objects/System.py: Segregate full-system only Process parameters (most of them!). sim/process.cc: Take System argument in constructor. Move initialization to startup() callback to occur after system & cpus are initialized. Generate ProxyMemory object to pass to loader for transparent virtual page allocation. sim/process.hh: Take System argument in constructor. Move initialization to startup() callback to occur after system & cpus are initialized. sim/system.cc: sim/system.hh: Enable System object for non-full-system too. Basically involved putting most of the existing code inside '#ifdef FULL_SYSTEM'. Key thing needed for syscall emulation at this point is the PhysicalMemory object (for Process initialization). --HG-- extra : convert_revision : f0f34b47bd4f77b502191affd3d03b4d6d9bcdd8
Diffstat (limited to 'cpu')
-rw-r--r--cpu/base.cc15
-rw-r--r--cpu/base.hh7
-rw-r--r--cpu/exec_context.cc16
-rw-r--r--cpu/exec_context.hh38
4 files changed, 30 insertions, 46 deletions
diff --git a/cpu/base.cc b/cpu/base.cc
index 8b94b8533..64ea9aaa8 100644
--- a/cpu/base.cc
+++ b/cpu/base.cc
@@ -59,7 +59,7 @@ BaseCPU::BaseCPU(Params *p)
#else
BaseCPU::BaseCPU(Params *p)
: SimObject(p->name), clock(p->clock), params(p),
- number_of_threads(p->numberOfThreads)
+ number_of_threads(p->numberOfThreads), system(p->system)
#endif
{
DPRINTF(FullCPU, "BaseCPU: Creating object, mem address %#x.\n", this);
@@ -211,15 +211,18 @@ BaseCPU::registerExecContexts()
{
for (int i = 0; i < execContexts.size(); ++i) {
ExecContext *xc = execContexts[i];
+
+ if (xc->status() == ExecContext::Suspended) {
#if FULL_SYSTEM
- int id = params->cpu_id;
- if (id != -1)
- id += i;
+ int id = params->cpu_id;
+ if (id != -1)
+ id += i;
- xc->cpu_id = system->registerExecContext(xc, id);
+ xc->cpu_id = system->registerExecContext(xc, id);
#else
- xc->cpu_id = xc->process->registerExecContext(xc);
+ xc->cpu_id = xc->process->registerExecContext(xc);
#endif
+ }
}
}
diff --git a/cpu/base.hh b/cpu/base.hh
index 4a44ab804..826dcb2ec 100644
--- a/cpu/base.hh
+++ b/cpu/base.hh
@@ -38,10 +38,7 @@
#include "sim/sim_object.hh"
#include "targetarch/isa_traits.hh"
-#if FULL_SYSTEM
class System;
-#endif
-
class BranchPred;
class ExecContext;
@@ -122,8 +119,8 @@ class BaseCPU : public SimObject
Tick clock;
bool functionTrace;
Tick functionTraceStart;
-#if FULL_SYSTEM
System *system;
+#if FULL_SYSTEM
int cpu_id;
Tick profile;
#endif
@@ -170,9 +167,9 @@ class BaseCPU : public SimObject
*/
EventQueue **comLoadEventQueue;
-#if FULL_SYSTEM
System *system;
+#if FULL_SYSTEM
/**
* Serialize this object to the given output stream.
* @param os The stream to serialize to.
diff --git a/cpu/exec_context.cc b/cpu/exec_context.cc
index 9bed3ba47..037319a8f 100644
--- a/cpu/exec_context.cc
+++ b/cpu/exec_context.cc
@@ -76,19 +76,13 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
profilePC = 3;
}
#else
-ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
- Process *_process, int _asid)
+ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_system,
+ FunctionalMemory *_mem, Process *_process, int _asid)
: _status(ExecContext::Unallocated),
cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
- process(_process), mem(process->getMemory()), asid(_asid),
- func_exe_inst(0), storeCondFailures(0)
-{
- memset(&regs, 0, sizeof(RegFile));
-}
-
-ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
- FunctionalMemory *_mem, int _asid)
- : cpu(_cpu), thread_num(_thread_num), process(0), mem(_mem), asid(_asid),
+ system(_system), mem(_mem),
+ process(_process),
+ asid(_asid),
func_exe_inst(0), storeCondFailures(0)
{
memset(&regs, 0, sizeof(RegFile));
diff --git a/cpu/exec_context.hh b/cpu/exec_context.hh
index 6f38a6960..70d731517 100644
--- a/cpu/exec_context.hh
+++ b/cpu/exec_context.hh
@@ -31,13 +31,12 @@
#include "config/full_system.hh"
#include "mem/functional/functional.hh"
+#include "mem/mem_interface.hh"
#include "mem/mem_req.hh"
#include "sim/host.hh"
#include "sim/serialize.hh"
#include "targetarch/byte_swap.hh"
-// forward declaration: see functional_memory.hh
-class FunctionalMemory;
class PhysicalMemory;
class BaseCPU;
@@ -123,11 +122,12 @@ class ExecContext
// it belongs. For full-system mode, this is the system CPU ID.
int cpu_id;
-#if FULL_SYSTEM
+ System *system;
FunctionalMemory *mem;
+
+#if FULL_SYSTEM
AlphaITB *itb;
AlphaDTB *dtb;
- System *system;
// the following two fields are redundant, since we can always
// look them up through the system pointer, but we'll leave them
@@ -148,8 +148,6 @@ class ExecContext
#else
Process *process;
- FunctionalMemory *mem; // functional storage for process address space
-
// Address space ID. Note that this is used for TIMING cache
// simulation only; all functional memory accesses should use
// one of the FunctionalMemory pointers above.
@@ -186,9 +184,8 @@ class ExecContext
ExecContext(BaseCPU *_cpu, int _thread_num, System *_system,
AlphaITB *_itb, AlphaDTB *_dtb, FunctionalMemory *_dem);
#else
- ExecContext(BaseCPU *_cpu, int _thread_num, Process *_process, int _asid);
- ExecContext(BaseCPU *_cpu, int _thread_num, FunctionalMemory *_mem,
- int _asid);
+ ExecContext(BaseCPU *_cpu, int _thread_num, System *_system,
+ FunctionalMemory *_mem, Process *_process, int _asid);
#endif
virtual ~ExecContext();
@@ -230,28 +227,19 @@ class ExecContext
int getInstAsid() { return asid; }
int getDataAsid() { return asid; }
- Fault dummyTranslation(MemReqPtr &req)
- {
-#if 0
- assert((req->vaddr >> 48 & 0xffff) == 0);
-#endif
-
- // put the asid in the upper 16 bits of the paddr
- req->paddr = req->vaddr & ~((Addr)0xffff << sizeof(Addr) * 8 - 16);
- req->paddr = req->paddr | (Addr)req->asid << sizeof(Addr) * 8 - 16;
- return No_Fault;
- }
Fault translateInstReq(MemReqPtr &req)
{
- return dummyTranslation(req);
+ return process->pTable->translate(req);
}
+
Fault translateDataReadReq(MemReqPtr &req)
{
- return dummyTranslation(req);
+ return process->pTable->translate(req);
}
+
Fault translateDataWriteReq(MemReqPtr &req)
{
- return dummyTranslation(req);
+ return process->pTable->translate(req);
}
#endif
@@ -334,7 +322,9 @@ class ExecContext
Fault instRead(MemReqPtr &req)
{
- return mem->read(req, inst);
+ panic("instRead not implemented");
+ // return funcPhysMem->read(req, inst);
+ return No_Fault;
}
//