From 65299cf463b054b10b1b4a6709590019d05433aa Mon Sep 17 00:00:00 2001 From: bmeurer Date: Fri, 23 Jan 2015 01:16:32 -0800 Subject: [PATCH] [x86] Blacklist AVX for Windows versions before 6.1 (Windows 7). BUG=v8:3846 LOG=y Review URL: https://codereview.chromium.org/869133002 Cr-Commit-Position: refs/heads/master@{#26239} --- src/ia32/assembler-ia32.cc | 22 ++++++++++++++++++++-- src/x64/assembler-x64.cc | 24 +++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc index 9815f01b2c..19e69b3191 100644 --- a/src/ia32/assembler-ia32.cc +++ b/src/ia32/assembler-ia32.cc @@ -36,14 +36,19 @@ #include "src/ia32/assembler-ia32.h" +#include + +#if V8_TARGET_ARCH_IA32 + #if V8_OS_MACOSX #include #endif -#if V8_TARGET_ARCH_IA32 - #include "src/base/bits.h" #include "src/base/cpu.h" +#if V8_OS_WIN +#include "src/base/win32-headers.h" +#endif #include "src/disassembler.h" #include "src/macro-assembler.h" #include "src/v8.h" @@ -73,6 +78,19 @@ bool EnableAVX() { *period_pos = '\0'; long kernel_version_major = strtol(buffer, nullptr, 10); // NOLINT if (kernel_version_major <= 13) return false; +#elif V8_OS_WIN + // The same problem seems to appear on Windows XP and Vista. + OSVERSIONINFOEX osvi; + DWORDLONG mask = 0; + memset(&osvi, 0, sizeof(osvi)); + osvi.dwOSVersionInfoSize = sizeof(osvi); + osvi.dwMajorVersion = 6; + osvi.dwMinorVersion = 1; + VER_SET_CONDITION(mask, VER_MAJORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(mask, VER_MINORVERSION, VER_GREATER_EQUAL); + if (!VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, mask)) { + return false; + } #endif // V8_OS_MACOSX return FLAG_enable_avx; } diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc index e4d099392c..1806d5d639 100644 --- a/src/x64/assembler-x64.cc +++ b/src/x64/assembler-x64.cc @@ -4,13 +4,18 @@ #include "src/x64/assembler-x64.h" +#include + +#if V8_TARGET_ARCH_X64 + #if V8_OS_MACOSX #include #endif -#if V8_TARGET_ARCH_X64 - #include "src/base/bits.h" +#if V8_OS_WIN +#include "src/base/win32-headers.h" +#endif #include "src/macro-assembler.h" #include "src/v8.h" @@ -28,7 +33,7 @@ bool EnableAVX() { // caused by ISRs, so we detect that here and disable AVX in that case. char buffer[128]; size_t buffer_size = arraysize(buffer); - int ctl_name[] = { CTL_KERN , KERN_OSRELEASE }; + int ctl_name[] = {CTL_KERN, KERN_OSRELEASE}; if (sysctl(ctl_name, 2, buffer, &buffer_size, nullptr, 0) != 0) { V8_Fatal(__FILE__, __LINE__, "V8 failed to get kernel version"); } @@ -39,6 +44,19 @@ bool EnableAVX() { *period_pos = '\0'; long kernel_version_major = strtol(buffer, nullptr, 10); // NOLINT if (kernel_version_major <= 13) return false; +#elif V8_OS_WIN + // The same problem seems to appear on Windows XP and Vista. + OSVERSIONINFOEX osvi; + DWORDLONG mask = 0; + memset(&osvi, 0, sizeof(osvi)); + osvi.dwOSVersionInfoSize = sizeof(osvi); + osvi.dwMajorVersion = 6; + osvi.dwMinorVersion = 1; + VER_SET_CONDITION(mask, VER_MAJORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(mask, VER_MINORVERSION, VER_GREATER_EQUAL); + if (!VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, mask)) { + return false; + } #endif // V8_OS_MACOSX return FLAG_enable_avx; }