summaryrefslogtreecommitdiff
path: root/src/arch/x86/utility.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas@sandberg.pp.se>2014-02-05 14:08:13 +0100
committerAndreas Sandberg <andreas@sandberg.pp.se>2014-02-05 14:08:13 +0100
commite76a37985f9ab9678ed00809cc2ec8385c293ba5 (patch)
tree5eb81a3d156c3a3db70782d17812868149c1bbfe /src/arch/x86/utility.cc
parentc6279f2d19cf3d8b625ffcd54b1d0183c1986fe1 (diff)
downloadgem5-e76a37985f9ab9678ed00809cc2ec8385c293ba5.tar.xz
x86: Fix x87 state transfer bug
Changeset 7274310be1bb (isa: clean up register constants) increased the value of NumFloatRegs, which triggered a bug in X86ISA::copyRegs(). This bug is caused by the x87 stack being copied twice since register indexes past NUM_FLOATREGS are mapped into the x87 stack relative to the top of the stack, which is undefined when the copy takes place. This changeset updates the copyRegs() function to use access registers using the non-flattening interface, which guarantees that undesirable register folding does not happen.
Diffstat (limited to 'src/arch/x86/utility.cc')
-rw-r--r--src/arch/x86/utility.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/arch/x86/utility.cc b/src/arch/x86/utility.cc
index 8f1a419f1..fcd52d38a 100644
--- a/src/arch/x86/utility.cc
+++ b/src/arch/x86/utility.cc
@@ -240,13 +240,13 @@ copyRegs(ThreadContext *src, ThreadContext *dest)
{
//copy int regs
for (int i = 0; i < NumIntRegs; ++i)
- dest->setIntReg(i, src->readIntReg(i));
+ dest->setIntRegFlat(i, src->readIntRegFlat(i));
//copy float regs
for (int i = 0; i < NumFloatRegs; ++i)
- dest->setFloatRegBits(i, src->readFloatRegBits(i));
+ dest->setFloatRegBitsFlat(i, src->readFloatRegBitsFlat(i));
//copy condition-code regs
for (int i = 0; i < NumCCRegs; ++i)
- dest->setCCReg(i, src->readCCReg(i));
+ dest->setCCRegFlat(i, src->readCCRegFlat(i));
copyMiscRegs(src, dest);
dest->pcState(src->pcState());
}