From 876b209dd4ff8dc3d49522017788c11e770e8873 Mon Sep 17 00:00:00 2001 From: Philippe Waroquiers Date: Wed, 17 Jun 2015 21:33:19 +0000 Subject: [PATCH] A SSE2 only CPU was reported to the guest as a SSE3 CPU. The guest code might then select functions calling invalid instructions. E.G. giving: vex x86->IR: unhandled instruction bytes: 0x66 0xF 0x3A 0xF ==13094== valgrind: Unrecognised instruction at address 0x496d4d3. ==13094== at 0x496D4D3: __mempcpy_ssse3 (memcpy-ssse3.S:771) ==13094== by 0x125E0B: ??? (in /bin/dash) as the host hw cap is not SSE3 enabled, while the guest believes SSE3 can be used. So, change CPUID so as to report an SSE3 if the hw is SSE3, and otherwise SSE1 or lower. (an SSE2 cpu might be added later on) git-svn-id: svn://svn.valgrind.org/vex/trunk@3153 --- VEX/priv/guest_x86_defs.h | 2 +- VEX/priv/guest_x86_helpers.c | 2 +- VEX/priv/guest_x86_toIR.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VEX/priv/guest_x86_defs.h b/VEX/priv/guest_x86_defs.h index 412ee94007..0b5a1a6412 100644 --- a/VEX/priv/guest_x86_defs.h +++ b/VEX/priv/guest_x86_defs.h @@ -147,7 +147,7 @@ extern void x86g_dirtyhelper_storeF80le ( Addr, ULong ); extern void x86g_dirtyhelper_CPUID_sse0 ( VexGuestX86State* ); extern void x86g_dirtyhelper_CPUID_mmxext ( VexGuestX86State* ); extern void x86g_dirtyhelper_CPUID_sse1 ( VexGuestX86State* ); -extern void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* ); +extern void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State* ); extern void x86g_dirtyhelper_FINIT ( VexGuestX86State* ); diff --git a/VEX/priv/guest_x86_helpers.c b/VEX/priv/guest_x86_helpers.c index b4875ee9f9..035d229778 100644 --- a/VEX/priv/guest_x86_helpers.c +++ b/VEX/priv/guest_x86_helpers.c @@ -2324,7 +2324,7 @@ void x86g_dirtyhelper_CPUID_sse1 ( VexGuestX86State* st ) address sizes : 36 bits physical, 48 bits virtual power management: */ -void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* st ) +void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State* st ) { # define SET_ABCD(_a,_b,_c,_d) \ do { st->guest_EAX = (UInt)(_a); \ diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c index fc402cea94..bcddea5b59 100644 --- a/VEX/priv/guest_x86_toIR.c +++ b/VEX/priv/guest_x86_toIR.c @@ -14842,9 +14842,9 @@ DisResult disInstr_X86_WRK ( IRDirty* d = NULL; void* fAddr = NULL; const HChar* fName = NULL; - if (archinfo->hwcaps & VEX_HWCAPS_X86_SSE2) { - fName = "x86g_dirtyhelper_CPUID_sse2"; - fAddr = &x86g_dirtyhelper_CPUID_sse2; + if (archinfo->hwcaps & VEX_HWCAPS_X86_SSE3) { + fName = "x86g_dirtyhelper_CPUID_sse3"; + fAddr = &x86g_dirtyhelper_CPUID_sse3; } else if (archinfo->hwcaps & VEX_HWCAPS_X86_SSE1) { -- 2.47.2