|
From: <sv...@va...> - 2005-07-20 09:23:25
|
Author: sewardj
Date: 2005-07-20 10:23:13 +0100 (Wed, 20 Jul 2005)
New Revision: 1281
Log:
Implement F3 90 (rep nop).
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 2005-07-20 01:12:48 UTC (rev 1280)
+++ trunk/priv/guest-amd64/toIR.c 2005-07-20 09:23:13 UTC (rev 1281)
@@ -619,6 +619,9 @@
static Bool haveF3 ( Prefix pfx ) {
return toBool((pfx & PFX_F3) > 0);
}
+static Bool have66 ( Prefix pfx ) {
+ return toBool((pfx & PFX_66) > 0);
+}
=20
/* Return True iff pfx has 66 set and F2 and F3 clear */
static Bool have66noF2noF3 ( Prefix pfx )
@@ -12430,66 +12433,7 @@
}
goto decode_failure;
=20
-//.. case 0xA5:=20
-//.. dis_string_op( dis_MOVS, ( opc =3D=3D 0xA4 ? 1 : sz ), "movs"=
, sorb );
-//.. break;
=20
-//.. case 0xA4: /* MOVS, no REP prefix */
-//.. case 0xA5:=20
-//.. dis_string_op( dis_MOVS, ( opc =3D=3D 0xA4 ? 1 : sz ), "movs"=
, sorb );
-//.. break;
-
-//.. case 0xF3: {=20
-//.. Addr32 eip_orig =3D guest_eip_bbstart + delta - 1;
-//.. vassert(sorb =3D=3D 0);
-//.. abyte =3D getUChar(delta); delta++;
-//..=20
-//.. if (abyte =3D=3D 0x66) { sz =3D 2; abyte =3D getUChar(delta);=
delta++; }
-//.. whatNext =3D Dis_StopHere;
-//..=20
-//.. switch (abyte) {
-//.. case 0xA4: sz =3D 1; /* REP MOVS<sz> */
-//.. case 0xA5:
-//.. dis_REP_op ( X86CondAlways, dis_MOVS, sz, eip_orig,=20
-//.. guest_eip_bbstart+delta, "rep =
movs" );
-//.. break;
-//..=20
-//.. case 0xA6: sz =3D 1; /* REPE CMP<sz> */
-//.. case 0xA7:
-//.. dis_REP_op ( X86CondZ, dis_CMPS, sz, eip_orig,=20
-//.. guest_eip_bbstart+delta, "repe cmps=
" );
-//.. break;
-//..=20
-//.. case 0xAA: sz =3D 1; /* REP STOS<sz> */
-//.. case 0xAB:
-//.. dis_REP_op ( X86CondAlways, dis_STOS, sz, eip_orig,=20
-//.. guest_eip_bbstart+delta, "rep =
stos" );
-//.. break;
-//.. //--=20
-//.. //-- case 0xAE: sz =3D 1; /* REPE SCAS<sz> */
-//.. //-- case 0xAF:=20
-//.. //-- dis_REP_op ( cb, CondZ, dis_SCAS, sz, eip_orig, eip, =
"repe scas" );
-//.. //-- break;
-//.. =20
-//.. case 0x90: /* REP NOP (PAUSE) */
-//.. /* a hint to the P4 re spin-wait loop */
-//.. DIP("rep nop (P4 pause)\n");
-//.. jmp_lit(Ijk_Yield, ((Addr32)guest_eip_bbstart)+delta);
-//.. whatNext =3D Dis_StopHere;
-//.. break;
-//..=20
-//.. //-- case 0xC3: /* REP RET */
-//.. //-- /* AMD K7/K8-specific optimisation; faster than vanil=
la RET */
-//.. //-- dis_ret(cb, 0);
-//.. //-- DIP("rep ret\n");
-//.. //-- break;
-//..=20
-//.. default:
-//.. goto decode_failure;
-//.. }
-//.. break;
-//.. }
-
/* ------------------------ XCHG ----------------------- */
=20
case 0x86: /* XCHG Gb,Eb */
@@ -12522,6 +12466,15 @@
break;
=20
case 0x90: /* XCHG eAX,eAX */
+ /* detect and handle F3 90 (rep nop) specially */
+ if (!have66(pfx) && !haveF2(pfx) && haveF3(pfx)) {
+ DIP("rep nop (P4 pause)\n");
+ /* "observe" the hint. The Vex client needs to be careful not
+ to cause very long delays as a result, though. */
+ jmp_lit(Ijk_Yield, guest_RIP_bbstart+delta);
+ dres.whatNext =3D Dis_StopHere;
+ break;
+ }
/* detect and handle NOPs specially */
if (/* F2/F3 probably change meaning completely */
!haveF2orF3(pfx)
|