|
From: <sv...@va...> - 2005-08-24 17:23:45
|
Author: sewardj
Date: 2005-08-24 18:23:37 +0100 (Wed, 24 Aug 2005)
New Revision: 1354
Log:
Merge r1344 (x86 rdtsc implementation)
Modified:
branches/VEX_3_0_BRANCH/priv/guest-x86/gdefs.h
branches/VEX_3_0_BRANCH/priv/guest-x86/ghelpers.c
branches/VEX_3_0_BRANCH/priv/guest-x86/toIR.c
Modified: branches/VEX_3_0_BRANCH/priv/guest-x86/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-x86/gdefs.h 2005-08-24 10:56:01 UT=
C (rev 1353)
+++ branches/VEX_3_0_BRANCH/priv/guest-x86/gdefs.h 2005-08-24 17:23:37 UT=
C (rev 1354)
@@ -148,6 +148,8 @@
extern void x86g_dirtyhelper_FSAVE ( VexGuestX86State*, HWord );
extern void x86g_dirtyhelper_FSTENV ( VexGuestX86State*, HWord );
=20
+extern ULong x86g_dirtyhelper_RDTSC ( void );
+
extern VexEmWarn
x86g_dirtyhelper_FRSTOR ( VexGuestX86State*, HWord );
=20
Modified: branches/VEX_3_0_BRANCH/priv/guest-x86/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-x86/ghelpers.c 2005-08-24 10:56:01=
UTC (rev 1353)
+++ branches/VEX_3_0_BRANCH/priv/guest-x86/ghelpers.c 2005-08-24 17:23:37=
UTC (rev 1354)
@@ -1639,6 +1639,21 @@
=20
=20
/* CALLED FROM GENERATED CODE */
+/* DIRTY HELPER (non-referentially-transparent) */
+/* Horrible hack. On non-x86 platforms, return 1. */
+ULong x86g_dirtyhelper_RDTSC ( void )
+{
+# if defined(__i386__)
+ ULong res;
+ __asm__ __volatile__("rdtsc" : "=3DA" (res));
+ return res;
+# else
+ return 1ULL;
+# endif
+}
+
+
+/* CALLED FROM GENERATED CODE */
/* DIRTY HELPER (modifies guest state) */
/* Claim to be a P55C (Intel Pentium/MMX) */
void x86g_dirtyhelper_CPUID_sse0 ( VexGuestX86State* st )
Modified: branches/VEX_3_0_BRANCH/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
--- branches/VEX_3_0_BRANCH/priv/guest-x86/toIR.c 2005-08-24 10:56:01 UTC=
(rev 1353)
+++ branches/VEX_3_0_BRANCH/priv/guest-x86/toIR.c 2005-08-24 17:23:37 UTC=
(rev 1354)
@@ -11926,35 +11926,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 */
+ IRTemp val =3D newTemp(Ity_I64);
+ IRExpr** args =3D mkIRExprVec_0();
+ IRDirty* d =3D unsafeIRDirty_1_N (=20
+ val,=20
+ 0/*regparms*/,=20
+ "x86g_dirtyhelper_RDTSC",=20
+ &x86g_dirtyhelper_RDTSC,=20
+ args=20
+ );
+ /* execute the dirty call, dumping the result in val. */
+ stmt( IRStmt_Dirty(d) );
+ putIReg(4, R_EDX, unop(Iop_64HIto32, mkexpr(val)));
+ putIReg(4, R_EAX, unop(Iop_64to32, mkexpr(val)));
+ DIP("rdtsc\n");
+ break;
+ }
=20
- case 0x31: /* RDTSC */
- if (0) vex_printf("vex x86->IR: kludged rdtsc\n");
- putIReg(4, R_EAX, mkU32(1));
- putIReg(4, R_EDX, 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_helper,=
need
-//-- // them to be defined (for Memcheck). The TempRegs pushed=
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);
- DIP("rdtsc\n");
- break;
-
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- PUSH/POP Sreg =3D-=3D-=3D-=
=3D-=3D-=3D-=3D-=3D-=3D-=3D */
=20
case 0xA1: /* POP %FS */
|