|
From: <sv...@va...> - 2006-03-06 13:35:57
|
Author: sewardj
Date: 2006-03-06 13:35:42 +0000 (Mon, 06 Mar 2006)
New Revision: 1583
Log:
Handle byte-size 'xadd reg,mem'. Also, don't bomb out for the
unhandled 'xadd reg,reg' case; instead synth a SIGILL in the usual
way. Fixes #121662.
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2006-03-06 13:16:18 UTC (rev 1582)
+++ trunk/priv/guest-x86/toIR.c 2006-03-06 13:35:42 UTC (rev 1583)
@@ -6299,7 +6299,7 @@
=20
=20
static
-UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0 )
+UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0, Bool* decodeOK )
{
Int len;
UChar rm =3D getIByte(delta0);
@@ -6314,7 +6314,9 @@
IRTemp tmpt1 =3D newTemp(ty);
=20
if (epartIsReg(rm)) {
- unimplemented("x86 xadd instruction with register operand");
+ *decodeOK =3D False;
+ return delta0;
+ /* Currently we don't handle xadd_G_E with register operand. */
#if 0
uInstr2(cb, GET, sz, ArchReg, eregOfRM(rm), TempReg, tmpd);
uInstr2(cb, GET, sz, ArchReg, gregOfRM(rm), TempReg, tmpt);
@@ -6336,6 +6338,7 @@
putIReg(sz, gregOfRM(rm), mkexpr(tmpd));
DIP("xadd%c %s, %s\n",
nameISize(sz), nameIReg(sz,gregOfRM(rm)), dis_buf);
+ *decodeOK =3D True;
return len+delta0;
}
}
@@ -12491,12 +12494,18 @@
=20
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- XADD -=3D-=3D-=3D-=3D-=3D-=
=3D-=3D-=3D-=3D-=3D */
=20
-//-- case 0xC0: /* XADD Gb,Eb */
-//-- eip =3D dis_xadd_G_E ( cb, sorb, 1, eip );
-//-- break;
- case 0xC1: /* XADD Gv,Ev */
- delta =3D dis_xadd_G_E ( sorb, sz, delta );
+ case 0xC0: { /* XADD Gb,Eb */
+ Bool decodeOK;
+ delta =3D dis_xadd_G_E ( sorb, 1, delta, &decodeOK );
+ if (!decodeOK) goto decode_failure;
break;
+ }
+ case 0xC1: { /* XADD Gv,Ev */
+ Bool decodeOK;
+ delta =3D dis_xadd_G_E ( sorb, sz, delta, &decodeOK );
+ if (!decodeOK) goto decode_failure;
+ break;
+ }
=20
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- MMXery =3D-=3D-=3D-=3D-=3D=
-=3D-=3D-=3D-=3D-=3D-=3D */
=20
|