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