|
From: <sv...@va...> - 2006-11-14 17:50:21
|
Author: sewardj
Date: 2006-11-14 17:50:16 +0000 (Tue, 14 Nov 2006)
New Revision: 1676
Log:
Handle 'ret imm16'. Fixes #136650.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/priv/guest-amd64/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-amd64/toIR.c 2006-11-14 17:46:12 UTC (rev 1675)
+++ trunk/priv/guest-amd64/toIR.c 2006-11-14 17:50:16 UTC (rev 1676)
@@ -514,13 +514,13 @@
return v;
}
=20
-//.. static UInt getUDisp16 ( Long delta )
-//.. {
-//.. UInt v =3D guest_code[delta+1]; v <<=3D 8;
-//.. v |=3D guest_code[delta+0];
-//.. return v & 0xFFFF;
-//.. }
-//..=20
+static UInt getUDisp16 ( Long delta )
+{
+ UInt v =3D guest_code[delta+1]; v <<=3D 8;
+ v |=3D guest_code[delta+0];
+ return v & 0xFFFF;
+}
+
//.. static UInt getUDisp ( Int size, Long delta )
//.. {
//.. switch (size) {
@@ -733,6 +733,12 @@
return toBool( ! haveNo66noF2noF3(pfx) );
}
=20
+/* Return True iff pfx has 66 or F2 set */
+static Bool have66orF2 ( Prefix pfx )
+{
+ return toBool((pfx & (PFX_66|PFX_F2)) > 0);
+}
+
/* Clear all the segment-override bits in a prefix. */
static Prefix clearSegBits ( Prefix p )
{
@@ -12172,15 +12178,17 @@
=20
/* ------------------------ Control flow --------------- */
=20
-//.. case 0xC2: /* RET imm16 */
-//.. d32 =3D getUDisp16(delta);=20
-//.. delta +=3D 2;
-//.. dis_ret(d32);
-//.. whatNext =3D Dis_StopHere;
-//.. DIP("ret %d\n", d32);
-//.. break;
+ case 0xC2: /* RET imm16 */
+ if (have66orF2orF3(pfx)) goto decode_failure;
+ d64 =3D getUDisp16(delta);=20
+ delta +=3D 2;
+ dis_ret(vmi, d64);
+ dres.whatNext =3D Dis_StopHere;
+ DIP("ret %lld\n", d64);
+ break;
+
case 0xC3: /* RET */
- if (haveF2(pfx)) goto decode_failure;
+ if (have66orF2(pfx)) goto decode_failure;
/* F3 is acceptable on AMD. */
dis_ret(vmi, 0);
dres.whatNext =3D Dis_StopHere;
|