diff options
Diffstat (limited to 'src/cpu/thread_context.cc')
-rw-r--r-- | src/cpu/thread_context.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc index 4a4038297..a5a05a264 100644 --- a/src/cpu/thread_context.cc +++ b/src/cpu/thread_context.cc @@ -43,8 +43,11 @@ #include "base/misc.hh" #include "base/trace.hh" #include "config/the_isa.hh" +#include "cpu/base.hh" +#include "cpu/quiesce_event.hh" #include "cpu/thread_context.hh" #include "debug/Context.hh" +#include "sim/full_system.hh" void ThreadContext::compare(ThreadContext *one, ThreadContext *two) @@ -136,3 +139,37 @@ unserialize(ThreadContext &tc, Checkpoint *cp, const std::string §ion) // thread_num and cpu_id are deterministic from the config } + +void +takeOverFrom(ThreadContext &ntc, ThreadContext &otc) +{ + assert(ntc.getProcessPtr() == otc.getProcessPtr()); + + ntc.setStatus(otc.status()); + ntc.copyArchRegs(&otc); + ntc.setContextId(otc.contextId()); + ntc.setThreadId(otc.threadId()); + + if (FullSystem) { + assert(ntc.getSystemPtr() == otc.getSystemPtr()); + + BaseCPU *ncpu(ntc.getCpuPtr()); + assert(ncpu); + EndQuiesceEvent *oqe(otc.getQuiesceEvent()); + assert(oqe); + assert(oqe->tc == &otc); + + BaseCPU *ocpu(otc.getCpuPtr()); + assert(ocpu); + EndQuiesceEvent *nqe(ntc.getQuiesceEvent()); + assert(nqe); + assert(nqe->tc == &ntc); + + if (oqe->scheduled()) { + ncpu->schedule(nqe, oqe->when()); + ocpu->deschedule(oqe); + } + } + + otc.setStatus(ThreadContext::Halted); +} |