summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cpu')
-rw-r--r--cpu/base_cpu.cc6
-rw-r--r--cpu/exec_context.cc5
-rw-r--r--cpu/exec_context.hh6
-rw-r--r--cpu/simple_cpu/simple_cpu.cc31
4 files changed, 13 insertions, 35 deletions
diff --git a/cpu/base_cpu.cc b/cpu/base_cpu.cc
index 604ee335d..367662f25 100644
--- a/cpu/base_cpu.cc
+++ b/cpu/base_cpu.cc
@@ -184,6 +184,12 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
newXC->process->replaceExecContext(newXC->cpu_id, newXC);
#endif
}
+
+#ifdef FULL_SYSTEM
+ for (int i = 0; i < NumInterruptLevels; ++i)
+ interrupts[i] = oldCPU->interrupts[i];
+ intstatus = oldCPU->intstatus;
+#endif
}
diff --git a/cpu/exec_context.cc b/cpu/exec_context.cc
index 6a5f463cd..b0ebb9622 100644
--- a/cpu/exec_context.cc
+++ b/cpu/exec_context.cc
@@ -48,10 +48,7 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
kernelStats(this, _cpu), cpu(_cpu), thread_num(_thread_num),
cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys),
memCtrl(_sys->memCtrl), physmem(_sys->physmem),
-#ifdef FS_MEASURE
- swCtx(NULL),
-#endif
- func_exe_inst(0), storeCondFailures(0)
+ swCtx(NULL), func_exe_inst(0), storeCondFailures(0)
{
memset(&regs, 0, sizeof(RegFile));
}
diff --git a/cpu/exec_context.hh b/cpu/exec_context.hh
index ccb01f486..a72516ac7 100644
--- a/cpu/exec_context.hh
+++ b/cpu/exec_context.hh
@@ -45,10 +45,7 @@ class MemoryController;
#include "kern/tru64/kernel_stats.hh"
#include "sim/system.hh"
-
-#ifdef FS_MEASURE
#include "sim/sw_context.hh"
-#endif
#else // !FULL_SYSTEM
@@ -137,10 +134,7 @@ class ExecContext
MemoryController *memCtrl;
PhysicalMemory *physmem;
-#ifdef FS_MEASURE
SWContext *swCtx;
-#endif
-
#else
Process *process;
diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc
index 2553bd22a..c2796efd0 100644
--- a/cpu/simple_cpu/simple_cpu.cc
+++ b/cpu/simple_cpu/simple_cpu.cc
@@ -715,32 +715,13 @@ SimpleCPU::tick()
xc->func_exe_inst++;
fault = si->execute(this, xc, traceData);
-#ifdef FS_MEASURE
- if (!(xc->misspeculating()) && (xc->system->bin)) {
- SWContext *ctx = xc->swCtx;
- if (ctx && !ctx->callStack.empty()) {
- if (si->isCall()) {
- ctx->calls++;
- }
- if (si->isReturn()) {
- if (ctx->calls == 0) {
- fnCall *top = ctx->callStack.top();
- DPRINTF(TCPIP, "Removing %s from callstack.\n", top->name);
- delete top;
- ctx->callStack.pop();
- if (ctx->callStack.empty())
- xc->system->nonPath->activate();
- else
- ctx->callStack.top()->myBin->activate();
-
- xc->system->dumpState(xc);
- } else {
- ctx->calls--;
- }
- }
- }
- }
+
+#ifdef FULL_SYSTEM
+ SWContext *ctx = xc->swCtx;
+ if (ctx)
+ ctx->process(xc, si.get());
#endif
+
if (si->isMemRef()) {
numMemRefs++;
}