X86: implements copyRegs() function
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Jul 2011 21:52:52 +0000 (16:52 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 11 Jul 2011 21:52:52 +0000 (16:52 -0500)
This patch implements the copyRegs() function for the x86 architecture.
The patch assumes that no side effects other than TLB invalidation need
to be considered while copying the registers. This may not hold true in
future.

src/arch/x86/utility.cc

index 756e9d526f17083f4b01bef26246dd2a24dbaa21..29c770f3d68e369c31cd24a55e6e7e711d732338 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2007 The Hewlett-Packard Development Company
+ * Copyright (c) 2011 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -42,9 +43,8 @@
 #if FULL_SYSTEM
 #include "arch/x86/interrupts.hh"
 #endif
-#include "arch/x86/regs/int.hh"
-#include "arch/x86/regs/misc.hh"
-#include "arch/x86/regs/segment.hh"
+#include "arch/x86/registers.hh"
+#include "arch/x86/tlb.hh"
 #include "arch/x86/utility.hh"
 #include "arch/x86/x86_traits.hh"
 #include "cpu/base.hh"
@@ -214,7 +214,9 @@ void startupCPU(ThreadContext *tc, int cpuId)
 void
 copyMiscRegs(ThreadContext *src, ThreadContext *dest)
 {
-    warn("copyMiscRegs is naively implemented for x86\n");
+    // This function assumes no side effects other than TLB invalidation
+    // need to be considered while copying state. That will likely not be
+    // true in the future.
     for (int i = 0; i < NUM_MISCREGS; ++i) {
         if ( ( i != MISCREG_CR1 &&
              !(i > MISCREG_CR4 && i < MISCREG_CR8) &&
@@ -223,16 +225,21 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest)
         }
         dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i));
     }
+
+    dest->getITBPtr()->invalidateAll();
+    dest->getDTBPtr()->invalidateAll();
 }
 
 void
 copyRegs(ThreadContext *src, ThreadContext *dest)
 {
-    panic("copyRegs not implemented for x86!\n");
     //copy int regs
+    for (int i = 0; i < NumIntRegs; ++i)
+         dest->setIntReg(i, src->readIntReg(i));
     //copy float regs
+    for (int i = 0; i < NumFloatRegs; ++i)
+         dest->setFloatRegBits(i, src->readFloatRegBits(i));
     copyMiscRegs(src, dest);
-
     dest->pcState(src->pcState());
 }