summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
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;
}
//