]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix CPUID:
authorJulian Seward <jseward@acm.org>
Sun, 10 Feb 2008 13:29:19 +0000 (13:29 +0000)
committerJulian Seward <jseward@acm.org>
Sun, 10 Feb 2008 13:29:19 +0000 (13:29 +0000)
- when EAX=4, output also depends on ECX
- handle out-of-range EAX correctly

git-svn-id: svn://svn.valgrind.org/vex/trunk@1810

VEX/priv/guest-amd64/ghelpers.c
VEX/priv/guest-amd64/toIR.c
VEX/priv/guest-x86/ghelpers.c
VEX/priv/guest-x86/toIR.c

index 3526f54552ff4f68c4b5204f01d96b84551e6e70..e76ed0defbb70cb77fbcc17132b6a2e8dd8f5cbe 100644 (file)
@@ -1807,9 +1807,19 @@ void amd64g_dirtyhelper_CPUID ( VexGuestAMD64State* st )
       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 @@ void amd64g_dirtyhelper_CPUID ( VexGuestAMD64State* st )
          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 @@ void amd64g_dirtyhelper_CPUID ( VexGuestAMD64State* st )
       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
 }
index 630fccc6eab86c3654e5b8da0f5d56abb1926739..28083742ae666a8f0f43a2184880c9650a46db9a 100644 (file)
@@ -15337,7 +15337,7 @@ DisResult disInstr_AMD64_WRK (
          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;
index 8351120e51f5522c255e3e11eb398e617e980202..2c900087ac6c0abddbbef5bbcf3e5c576f0e1512 100644 (file)
@@ -2124,9 +2124,19 @@ void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* st )
       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 @@ void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* st )
          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 @@ void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* st )
       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
 }
index 86a9ac573bc4874a7cf426ea4b095c00e9236d1b..343a4f6c030c7e7b1319f3f5a4d9a2cf87fe0374 100644 (file)
@@ -13907,7 +13907,7 @@ DisResult disInstr_X86_WRK (
          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;