diff options
Diffstat (limited to 'src/cpu/inorder')
-rw-r--r-- | src/cpu/inorder/cpu.cc | 8 | ||||
-rw-r--r-- | src/cpu/inorder/inorder_dyn_inst.cc | 12 | ||||
-rw-r--r-- | src/cpu/inorder/thread_context.cc | 6 | ||||
-rw-r--r-- | src/cpu/inorder/thread_state.hh | 14 |
4 files changed, 23 insertions, 17 deletions
diff --git a/src/cpu/inorder/cpu.cc b/src/cpu/inorder/cpu.cc index 3dad7d1f4..5815775f9 100644 --- a/src/cpu/inorder/cpu.cc +++ b/src/cpu/inorder/cpu.cc @@ -786,9 +786,9 @@ InOrderCPU::init() BaseCPU::init(); for (ThreadID tid = 0; tid < numThreads; ++tid) { - // Set inSyscall so that the CPU doesn't squash when initially + // Set noSquashFromTC so that the CPU doesn't squash when initially // setting up registers. - thread[tid]->inSyscall = true; + thread[tid]->noSquashFromTC = true; // Initialise the ThreadContext's memory proxies thread[tid]->initMemProxies(thread[tid]->getTC()); } @@ -800,9 +800,9 @@ InOrderCPU::init() } } - // Clear inSyscall. + // Clear noSquashFromTC. for (ThreadID tid = 0; tid < numThreads; ++tid) - thread[tid]->inSyscall = false; + thread[tid]->noSquashFromTC = false; // Call Initializiation Routine for Resource Pool resPool->init(); diff --git a/src/cpu/inorder/inorder_dyn_inst.cc b/src/cpu/inorder/inorder_dyn_inst.cc index 760c63948..dcf0ce6ae 100644 --- a/src/cpu/inorder/inorder_dyn_inst.cc +++ b/src/cpu/inorder/inorder_dyn_inst.cc @@ -220,12 +220,12 @@ InOrderDynInst::execute() // when using the TC during an instruction's execution // (specifically for instructions that have side-effects that use // the TC). Fix this. - bool in_syscall = this->thread->inSyscall; - this->thread->inSyscall = true; + bool no_squash_from_TC = this->thread->noSquashFromTC; + this->thread->noSquashFromTC = true; this->fault = this->staticInst->execute(this, this->traceData); - this->thread->inSyscall = in_syscall; + this->thread->noSquashFromTC = no_squash_from_TC; return this->fault; } @@ -244,12 +244,12 @@ InOrderDynInst::initiateAcc() // when using the TC during an instruction's execution // (specifically for instructions that have side-effects that use // the TC). Fix this. - bool in_syscall = this->thread->inSyscall; - this->thread->inSyscall = true; + bool no_squash_from_TC = this->thread->noSquashFromTC; + this->thread->noSquashFromTC = true; this->fault = this->staticInst->initiateAcc(this, this->traceData); - this->thread->inSyscall = in_syscall; + this->thread->noSquashFromTC = no_squash_from_TC; return this->fault; } diff --git a/src/cpu/inorder/thread_context.cc b/src/cpu/inorder/thread_context.cc index 16ffd5b0f..b8662ef4c 100644 --- a/src/cpu/inorder/thread_context.cc +++ b/src/cpu/inorder/thread_context.cc @@ -90,10 +90,10 @@ InOrderThreadContext::takeOverFrom(ThreadContext *old_context) copyArchRegs(old_context); thread->funcExeInst = old_context->readFuncExeInst(); - + old_context->setStatus(ThreadContext::Halted); - thread->inSyscall = false; + thread->noSquashFromTC = false; thread->trapPending = false; } @@ -159,7 +159,7 @@ InOrderThreadContext::serialize(std::ostream &os) void InOrderThreadContext::unserialize(Checkpoint *cp, const std::string §ion) { - panic("unserialize unimplemented"); + panic("unserialize unimplemented"); } diff --git a/src/cpu/inorder/thread_state.hh b/src/cpu/inorder/thread_state.hh index 34c146b42..4472bf1dd 100644 --- a/src/cpu/inorder/thread_state.hh +++ b/src/cpu/inorder/thread_state.hh @@ -61,10 +61,15 @@ class InOrderThreadState : public ThreadState { InOrderCPU *cpu; public: - /** Whether or not the thread is currently in syscall mode, and - * thus able to be externally updated without squashing. + /* This variable controls if writes to a thread context should cause a all + * dynamic/speculative state to be thrown away. Nominally this is the + * desired behavior because the external thread context write has updated + * some state that could be used by an inflight instruction, however there + * are some cases like in a fault/trap handler where this behavior would + * lead to successive restarts and forward progress couldn't be made. This + * variable controls if the squashing will occur. */ - bool inSyscall; + bool noSquashFromTC; /** Whether or not the thread is currently waiting on a trap, and * thus able to be externally updated without squashing. @@ -75,7 +80,8 @@ class InOrderThreadState : public ThreadState { Process *_process) : ThreadState(reinterpret_cast<BaseCPU*>(_cpu), _thread_num, _process), - cpu(_cpu), inSyscall(0), trapPending(0), lastGradIsBranch(false) + cpu(_cpu), noSquashFromTC(false), trapPending(false), + lastGradIsBranch(false) { } /** Handles the syscall. */ |