diff options
author | Andreas Sandberg <andreas@sandberg.pp.se> | 2014-02-05 14:08:13 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas@sandberg.pp.se> | 2014-02-05 14:08:13 +0100 |
commit | e76a37985f9ab9678ed00809cc2ec8385c293ba5 (patch) | |
tree | 5eb81a3d156c3a3db70782d17812868149c1bbfe | |
parent | c6279f2d19cf3d8b625ffcd54b1d0183c1986fe1 (diff) | |
download | gem5-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.
-rw-r--r-- | src/arch/x86/utility.cc | 6 |
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()); } |