X86: Make some of the bits of CR0 do what they're supposed to.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 12 Nov 2007 22:38:02 +0000 (14:38 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 12 Nov 2007 22:38:02 +0000 (14:38 -0800)
--HG--
extra : convert_revision : 13e79ef1ef09bd842d5e075e31f98ab2a4357901

src/arch/x86/miscregfile.cc

index e2c39c7cd5ce9d00467bd280a7391ffe8526349e..cd76e96aae8a5f7cbd59de18fb059127acdeb170 100644 (file)
@@ -154,7 +154,30 @@ void MiscRegFile::setRegNoEffect(int miscReg, const MiscReg &val)
 void MiscRegFile::setReg(int miscReg,
         const MiscReg &val, ThreadContext * tc)
 {
-    setRegNoEffect(miscReg, val);
+    MiscReg newVal = val;
+    switch(miscReg)
+    {
+      case MISCREG_CR0:
+        CR0 toggled = regVal[miscReg] ^ val;
+        CR0 newCR0 = val;
+        Efer efer = regVal[MISCREG_EFER];
+        if (toggled.pg && efer.lme) {
+            if (newCR0.pg) {
+                //Turning on long mode
+                efer.lma = 1;
+                regVal[MISCREG_EFER] = efer;
+            } else {
+                //Turning off long mode
+                efer.lma = 0;
+                regVal[MISCREG_EFER] = efer;
+            }
+        }
+        //This must always be 1.
+        newCR0.et = 1;
+        newVal = newCR0;
+        break;
+    }
+    setRegNoEffect(miscReg, newVal);
 }
 
 void MiscRegFile::serialize(std::ostream & os)