summaryrefslogtreecommitdiff
path: root/src/arch/arm/utility.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/utility.cc')
-rw-r--r--src/arch/arm/utility.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/arch/arm/utility.cc b/src/arch/arm/utility.cc
index 0d91c9f90..6bca63291 100644
--- a/src/arch/arm/utility.cc
+++ b/src/arch/arm/utility.cc
@@ -124,8 +124,21 @@ void
copyRegs(ThreadContext *src, ThreadContext *dest)
{
int i;
+
+ int saved_mode = ((CPSR)src->readMiscReg(MISCREG_CPSR)).mode;
+
+ // Make sure we're in user mode, so we can easily see all the registers
+ // in the copy loop
+ src->setMiscReg(MISCREG_CPSR_MODE, MODE_USER);
+ dest->setMiscReg(MISCREG_CPSR_MODE, MODE_USER);
+
for(i = 0; i < TheISA::NumIntRegs; i++)
dest->setIntReg(i, src->readIntReg(i));
+
+ // Restore us back to the old mode
+ src->setMiscReg(MISCREG_CPSR_MODE, saved_mode);
+ dest->setMiscReg(MISCREG_CPSR_MODE, saved_mode);
+
for(i = 0; i < TheISA::NumFloatRegs; i++)
dest->setFloatReg(i, src->readFloatReg(i));
for(i = 0; i < TheISA::NumMiscRegs; i++)