|
From: <sv...@va...> - 2005-08-24 17:28:42
|
Author: sewardj
Date: 2005-08-24 18:28:27 +0100 (Wed, 24 Aug 2005)
New Revision: 1355
Log:
Merge r1346 (amd64 rdtsc implementation)
Modified:
branches/VEX_3_0_BRANCH/priv/guest-amd64/gdefs.h
branches/VEX_3_0_BRANCH/priv/guest-amd64/ghelpers.c
branches/VEX_3_0_BRANCH/priv/guest-amd64/toIR.c
Modified: branches/VEX_3_0_BRANCH/priv/guest-amd64/gdefs.h
=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
--- branches/VEX_3_0_BRANCH/priv/guest-amd64/gdefs.h 2005-08-24 17:23:37 =
UTC (rev 1354)
+++ branches/VEX_3_0_BRANCH/priv/guest-amd64/gdefs.h 2005-08-24 17:28:27 =
UTC (rev 1355)
@@ -145,6 +145,8 @@
=20
extern void amd64g_dirtyhelper_CPUID ( VexGuestAMD64State* st );
=20
+extern ULong amd64g_dirtyhelper_RDTSC ( void );
+
//extern void amd64g_dirtyhelper_CPUID_sse0 ( VexGuestAMD64State* );
//extern void amd64g_dirtyhelper_CPUID_sse1 ( VexGuestAMD64State* );
//extern void amd64g_dirtyhelper_CPUID_sse2 ( VexGuestAMD64State* );
Modified: branches/VEX_3_0_BRANCH/priv/guest-amd64/ghelpers.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
--- branches/VEX_3_0_BRANCH/priv/guest-amd64/ghelpers.c 2005-08-24 17:23:=
37 UTC (rev 1354)
+++ branches/VEX_3_0_BRANCH/priv/guest-amd64/ghelpers.c 2005-08-24 17:28:=
27 UTC (rev 1355)
@@ -1676,6 +1676,21 @@
}
=20
=20
+/* CALLED FROM GENERATED CODE */
+/* DIRTY HELPER (non-referentially-transparent) */
+/* Horrible hack. On non-amd64 platforms, return 1. */
+ULong amd64g_dirtyhelper_RDTSC ( void )
+{
+# if defined(__x86_64__)
+ UInt eax, edx;
+ __asm__ __volatile__("rdtsc" : "=3Da" (eax), "=3Dd" (edx));
+ return (((ULong)edx) << 32) | ((ULong)eax);
+# else
+ return 1ULL;
+# endif
+}
+
+
/*---------------------------------------------------------------*/
/*--- Helpers for MMX/SSE/SSE2. ---*/
/*---------------------------------------------------------------*/
Modified: branches/VEX_3_0_BRANCH/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
--- branches/VEX_3_0_BRANCH/priv/guest-amd64/toIR.c 2005-08-24 17:23:37 U=
TC (rev 1354)
+++ branches/VEX_3_0_BRANCH/priv/guest-amd64/toIR.c 2005-08-24 17:28:27 U=
TC (rev 1355)
@@ -13084,35 +13084,24 @@
break;
=20
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- RDTSC -=3D-=3D-=3D-=3D-=3D=
-=3D-=3D-=3D-=3D-=3D-=3D */
-
- case 0x31: /* RDTSC */
- if (haveF2orF3(pfx)) goto decode_failure;
- if (0) vex_printf("vex amd64->IR: kludged rdtsc\n");
- putIRegRAX(4, mkU32(1));
- putIRegRDX(4, mkU32(0));
-
-//.. //-- t1 =3D newTemp(cb);
-//.. //-- t2 =3D newTemp(cb);
-//.. //-- t3 =3D newTemp(cb);
-//.. //-- uInstr0(cb, CALLM_S, 0);
-//.. //-- // Nb: even though these args aren't used by RDTSC_he=
lper, need
-//.. //-- // them to be defined (for Memcheck). The TempRegs p=
ushed must
-//.. //-- // also be distinct.
-//.. //-- uInstr2(cb, MOV, 4, Literal, 0, TempReg, t1);
-//.. //-- uLiteral(cb, 0);
-//.. //-- uInstr1(cb, PUSH, 4, TempReg, t1);
-//.. //-- uInstr2(cb, MOV, 4, Literal, 0, TempReg, t2);
-//.. //-- uLiteral(cb, 0);
-//.. //-- uInstr1(cb, PUSH, 4, TempReg, t2);
-//.. //-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_RDTSC));
-//.. //-- uFlagsRWU(cb, FlagsEmpty, FlagsEmpty, FlagsEmpty);
-//.. //-- uInstr1(cb, POP, 4, TempReg, t3);
-//.. //-- uInstr2(cb, PUT, 4, TempReg, t3, ArchReg, R_EDX);
-//.. //-- uInstr1(cb, POP, 4, TempReg, t3);
-//.. //-- uInstr2(cb, PUT, 4, TempReg, t3, ArchReg, R_EAX);
-//.. //-- uInstr0(cb, CALLM_E, 0);
+ case 0x31: { /* RDTSC */
+ IRTemp val =3D newTemp(Ity_I64);
+ IRExpr** args =3D mkIRExprVec_0();
+ IRDirty* d =3D unsafeIRDirty_1_N (=20
+ val,=20
+ 0/*regparms*/,=20
+ "amd64g_dirtyhelper_RDTSC",=20
+ &amd64g_dirtyhelper_RDTSC,=20
+ args=20
+ );
+ if (have66orF2orF3(pfx)) goto decode_failure;
+ /* execute the dirty call, dumping the result in val. */
+ stmt( IRStmt_Dirty(d) );
+ putIRegRDX(4, unop(Iop_64HIto32, mkexpr(val)));
+ putIRegRAX(4, unop(Iop_64to32, mkexpr(val)));
DIP("rdtsc\n");
break;
+ }
=20
//.. /* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- PUSH/POP Sreg =3D-=3D=
-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D */
//..=20
|