|
From: <sv...@va...> - 2008-02-10 13:29:27
|
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;
|