summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2013-01-22 00:10:10 -0600
committerNilay Vaish <nilay@cs.wisc.edu>2013-01-22 00:10:10 -0600
commitfc57ae640130c2d7610f4ff20a3d8816b88042bf (patch)
tree80da33f0f19a5e21cfeed4e94d8ea45d6db27076
parent62544f938a8a7387bd22b397d36c637a2656f34a (diff)
downloadgem5-fc57ae640130c2d7610f4ff20a3d8816b88042bf.tar.xz
x86, cpu: corrects 270c9a75e91f, take over decoder on cpu switch
The changes made by the changeset 270c9a75e91f do not work well with switching of cpus. The problem is that decoder for the old thread context holds state that is not taken over by the new decoder. This patch adds a takeOverFrom() function to Decoder class in each ISA. Except for x86, functions in other ISAs are blank. For x86, the function copies state from the old decoder to the new decoder.
-rw-r--r--src/arch/alpha/decoder.hh2
-rw-r--r--src/arch/arm/decoder.hh2
-rw-r--r--src/arch/mips/decoder.hh2
-rw-r--r--src/arch/power/decoder.hh3
-rw-r--r--src/arch/sparc/decoder.hh2
-rw-r--r--src/arch/x86/decoder.hh13
-rwxr-xr-xsrc/cpu/o3/thread_context_impl.hh3
-rw-r--r--src/cpu/simple_thread.cc1
8 files changed, 28 insertions, 0 deletions
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<Impl>::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();