diff --git a/src/arch/alpha/decoder.hh b/src/arch/alpha/decoder.hh index 45e737e52..d33722867 100644 --- a/src/arch/alpha/decoder.hh +++ b/src/arch/alpha/decoder.hh @@ -83,6 +83,8 @@ class Decoder return instDone; } + void takeOverFrom(Decoder * old) {} + protected: /// A cache of decoded instruction objects. static GenericISA::BasicDecodeCache defaultCache; diff --git a/src/arch/arm/decoder.hh b/src/arch/arm/decoder.hh index 83a16da4c..72776bcfd 100644 --- a/src/arch/arm/decoder.hh +++ b/src/arch/arm/decoder.hh @@ -116,6 +116,8 @@ class Decoder fpscrStride = fpscr.stride; } + void takeOverFrom(Decoder *old) {} + protected: /// A cache of decoded instruction objects. static GenericISA::BasicDecodeCache defaultCache; diff --git a/src/arch/mips/decoder.hh b/src/arch/mips/decoder.hh index 080614dee..a3a68ad07 100644 --- a/src/arch/mips/decoder.hh +++ b/src/arch/mips/decoder.hh @@ -83,6 +83,8 @@ class Decoder return instDone; } + void takeOverFrom(Decoder *old) {} + protected: /// A cache of decoded instruction objects. static GenericISA::BasicDecodeCache defaultCache; diff --git a/src/arch/power/decoder.hh b/src/arch/power/decoder.hh index 830636aed..a70802ced 100644 --- a/src/arch/power/decoder.hh +++ b/src/arch/power/decoder.hh @@ -89,6 +89,9 @@ class Decoder { return instDone; } + + void takeOverFrom(Decoder *old) {} + protected: /// A cache of decoded instruction objects. static GenericISA::BasicDecodeCache defaultCache; diff --git a/src/arch/sparc/decoder.hh b/src/arch/sparc/decoder.hh index e7a806d81..b87ee682e 100644 --- a/src/arch/sparc/decoder.hh +++ b/src/arch/sparc/decoder.hh @@ -97,6 +97,8 @@ class Decoder asi = _asi; } + void takeOverFrom(Decoder *old) {} + protected: /// A cache of decoded instruction objects. static GenericISA::BasicDecodeCache defaultCache; diff --git a/src/arch/x86/decoder.hh b/src/arch/x86/decoder.hh index 6f55ab26f..ca7ef96fe 100644 --- a/src/arch/x86/decoder.hh +++ b/src/arch/x86/decoder.hh @@ -250,6 +250,19 @@ class Decoder } } + void takeOverFrom(Decoder *old) + { + mode = old->mode; + submode = old->submode; + emi.mode.mode = mode; + emi.mode.submode = submode; + altOp = old->altOp; + defOp = old->defOp; + altAddr = old->altAddr; + defAddr = old->defAddr; + stack = old->stack; + } + void reset() { state = ResetState; diff --git a/src/cpu/o3/thread_context_impl.hh b/src/cpu/o3/thread_context_impl.hh index 6de5c5731..f818cc3dc 100755 --- a/src/cpu/o3/thread_context_impl.hh +++ b/src/cpu/o3/thread_context_impl.hh @@ -67,6 +67,9 @@ void O3ThreadContext::takeOverFrom(ThreadContext *old_context) { ::takeOverFrom(*this, *old_context); + TheISA::Decoder *newDecoder = getDecoderPtr(); + TheISA::Decoder *oldDecoder = old_context->getDecoderPtr(); + newDecoder->takeOverFrom(oldDecoder); thread->kernelStats = old_context->getKernelStats(); thread->funcExeInst = old_context->readFuncExeInst(); diff --git a/src/cpu/simple_thread.cc b/src/cpu/simple_thread.cc index 77569aa68..de01124e0 100644 --- a/src/cpu/simple_thread.cc +++ b/src/cpu/simple_thread.cc @@ -108,6 +108,7 @@ void SimpleThread::takeOverFrom(ThreadContext *oldContext) { ::takeOverFrom(*tc, *oldContext); + decoder.takeOverFrom(oldContext->getDecoderPtr()); kernelStats = oldContext->getKernelStats(); funcExeInst = oldContext->readFuncExeInst();