Author: sewardj
Date: 2008-02-10 13:29:19 +0000 (Sun, 10 Feb 2008)
New Revision: 1810

Log:
Fix CPUID:
- when EAX=4, output also depends on ECX
- handle out-of-range EAX correctly


Modified:
   trunk/priv/guest-amd64/ghelpers.c
   trunk/priv/guest-amd64/toIR.c
   trunk/priv/guest-x86/ghelpers.c
   trunk/priv/guest-x86/toIR.c


Modified: trunk/priv/guest-amd64/ghelpers.c
===================================================================
--- trunk/priv/guest-amd64/ghelpers.c   2008-02-09 01:16:02 UTC (rev 1809)
+++ trunk/priv/guest-amd64/ghelpers.c   2008-02-10 13:29:19 UTC (rev 1810)
@@ -1807,9 +1807,19 @@
       case 0x00000003:
          SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000);
          break;
-      case 0x00000004:
-         SET_ABCD(0x04000121, 0x01c0003f, 0x0000003f, 0x00000001);
+      case 0x00000004: {
+         switch (0xFFFFFFFF & st->guest_RCX) {
+            case 0x00000000: SET_ABCD(0x04000121, 0x01c0003f,
+                                      0x0000003f, 0x00000001); break;
+            case 0x00000001: SET_ABCD(0x04000122, 0x01c0003f,
+                                      0x0000003f, 0x00000001); break;
+            case 0x00000002: SET_ABCD(0x04004143, 0x03c0003f,
+                                      0x00000fff, 0x00000001); break;
+            default:         SET_ABCD(0x00000000, 0x00000000,
+                                      0x00000000, 0x00000000); break;
+         }
          break;
+      }
       case 0x00000005:
          SET_ABCD(0x00000040, 0x00000040, 0x00000003, 0x00000020);
          break;
@@ -1826,6 +1836,7 @@
          SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000);
          break;
       case 0x0000000a:
+      unhandled_eax_value:
          SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
          break;
       case 0x80000000:
@@ -1855,15 +1866,8 @@
       case 0x80000008:
          SET_ABCD(0x00003024, 0x00000000, 0x00000000, 0x00000000);
          break;
-      case 0x80860000:
-         SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
-         break;
-      case 0xc0000000:
-         SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
-         break;
       default:         
-         SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000); 
-         break;
+         goto unhandled_eax_value;
    }
 #  undef SET_ABCD
 }

Modified: trunk/priv/guest-amd64/toIR.c
===================================================================
--- trunk/priv/guest-amd64/toIR.c       2008-02-09 01:16:02 UTC (rev 1809)
+++ trunk/priv/guest-amd64/toIR.c       2008-02-10 13:29:19 UTC (rev 1810)
@@ -15337,7 +15337,7 @@
          d->fxState[1].fx     = Ifx_Write;
          d->fxState[1].offset = OFFB_RBX;
          d->fxState[1].size   = 8;
-         d->fxState[2].fx     = Ifx_Write;
+         d->fxState[2].fx     = Ifx_Modify;
          d->fxState[2].offset = OFFB_RCX;
          d->fxState[2].size   = 8;
          d->fxState[3].fx     = Ifx_Write;

Modified: trunk/priv/guest-x86/ghelpers.c
===================================================================
--- trunk/priv/guest-x86/ghelpers.c     2008-02-09 01:16:02 UTC (rev 1809)
+++ trunk/priv/guest-x86/ghelpers.c     2008-02-10 13:29:19 UTC (rev 1810)
@@ -2124,9 +2124,19 @@
       case 0x00000003:
          SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000);
          break;
-      case 0x00000004:
-         SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000);
+      case 0x00000004: {
+         switch (st->guest_ECX) {
+            case 0x00000000: SET_ABCD(0x04000121, 0x01c0003f,
+                                      0x0000003f, 0x00000001); break;
+            case 0x00000001: SET_ABCD(0x04000122, 0x01c0003f,
+                                      0x0000003f, 0x00000001); break;
+            case 0x00000002: SET_ABCD(0x04004143, 0x03c0003f,
+                                      0x00000fff, 0x00000001); break;
+            default:         SET_ABCD(0x00000000, 0x00000000,
+                                      0x00000000, 0x00000000); break;
+         }
          break;
+      }
       case 0x00000005:
          SET_ABCD(0x00000040, 0x00000040, 0x00000003, 0x00000020);
          break;
@@ -2143,6 +2153,7 @@
          SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000);
          break;
       case 0x0000000a:
+      unhandled_eax_value:
          SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
          break;
       case 0x80000000:
@@ -2172,15 +2183,8 @@
       case 0x80000008:
          SET_ABCD(0x00003024, 0x00000000, 0x00000000, 0x00000000);
          break;
-      case 0x80860000:
-         SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
-         break;
-      case 0xc0000000:
-         SET_ABCD(0x07280202, 0x00000000, 0x00000000, 0x00000000);
-         break;
-      default:         
-         SET_ABCD(0x00000000, 0x00000000, 0x00000000, 0x00000000); 
-         break;
+      default:
+         goto unhandled_eax_value;
    }
 #  undef SET_ABCD
 }

Modified: trunk/priv/guest-x86/toIR.c
===================================================================
--- trunk/priv/guest-x86/toIR.c 2008-02-09 01:16:02 UTC (rev 1809)
+++ trunk/priv/guest-x86/toIR.c 2008-02-10 13:29:19 UTC (rev 1810)
@@ -13907,7 +13907,7 @@
          d->fxState[1].fx     = Ifx_Write;
          d->fxState[1].offset = OFFB_EBX;
          d->fxState[1].size   = 4;
-         d->fxState[2].fx     = Ifx_Write;
+         d->fxState[2].fx     = Ifx_Modify;
          d->fxState[2].offset = OFFB_ECX;
          d->fxState[2].size   = 4;
          d->fxState[3].fx     = Ifx_Write;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to