From: bmeurer Date: Wed, 7 Jan 2015 10:03:39 +0000 (-0800) Subject: [x86] Disable AVX on Mac OS X 10.9. X-Git-Tag: upstream/4.7.83~5075 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4f6290cae02ce1e52ea0378922b42aed9382dfae;p=platform%2Fupstream%2Fv8.git [x86] Disable AVX on Mac OS X 10.9. Mac OS X 10.9 (Mavericks) has a bug that causes AVX transitions in ISRs, so we better not use AVX there. Review URL: https://codereview.chromium.org/826683003 Cr-Commit-Position: refs/heads/master@{#25965} --- diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc index 2805fa0..168a196 100644 --- a/src/ia32/assembler-ia32.cc +++ b/src/ia32/assembler-ia32.cc @@ -34,7 +34,11 @@ // significantly by Google Inc. // Copyright 2012 the V8 project authors. All rights reserved. -#include "src/v8.h" +#include "src/ia32/assembler-ia32.h" + +#if V8_OS_MACOSX +#include +#endif #if V8_TARGET_ARCH_IA32 @@ -42,7 +46,7 @@ #include "src/base/cpu.h" #include "src/disassembler.h" #include "src/macro-assembler.h" -#include "src/serialize.h" +#include "src/v8.h" namespace v8 { namespace internal { @@ -50,6 +54,29 @@ namespace internal { // ----------------------------------------------------------------------------- // Implementation of CpuFeatures +namespace { + +bool EnableAVX() { +#if V8_OS_MACOSX + // Mac OS X 10.9 has a bug where AVX transitions were indeed being caused by + // ISRs, so we detect Mac OS X 10.9 here and disable AVX in that case. + char buffer[128]; + size_t buffer_size = arraysize(buffer); + 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"); + } + // The buffer now contains a string of the form XX.YY.ZZ, where + // XX is the major kernel version component. 13.x.x (Mavericks) is + // affected by this bug, so disable AVX there. + if (memcmp(buffer, "13.", 3) == 0) return false; +#endif // V8_OS_MACOSX + return FLAG_enable_avx; +} + +} // namespace + + void CpuFeatures::ProbeImpl(bool cross_compile) { base::CPU cpu; CHECK(cpu.has_sse2()); // SSE2 support is mandatory. @@ -60,7 +87,7 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1; if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; - if (cpu.has_avx() && FLAG_enable_avx) supported_ |= 1u << AVX; + if (cpu.has_avx() && EnableAVX()) supported_ |= 1u << AVX; if (cpu.has_fma3() && FLAG_enable_fma3) supported_ |= 1u << FMA3; } diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc index 469ebe9..fd722b2 100644 --- a/src/x64/assembler-x64.cc +++ b/src/x64/assembler-x64.cc @@ -2,13 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "src/v8.h" +#include "src/x64/assembler-x64.h" + +#if V8_OS_MACOSX +#include +#endif #if V8_TARGET_ARCH_X64 #include "src/base/bits.h" #include "src/macro-assembler.h" -#include "src/serialize.h" +#include "src/v8.h" namespace v8 { namespace internal { @@ -16,6 +20,29 @@ namespace internal { // ----------------------------------------------------------------------------- // Implementation of CpuFeatures +namespace { + +bool EnableAVX() { +#if V8_OS_MACOSX + // Mac OS X 10.9 has a bug where AVX transitions were indeed being caused by + // ISRs, so we detect Mac OS X 10.9 here and disable AVX in that case. + char buffer[128]; + size_t buffer_size = arraysize(buffer); + 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"); + } + // The buffer now contains a string of the form XX.YY.ZZ, where + // XX is the major kernel version component. 13.x.x (Mavericks) is + // affected by this bug, so disable AVX there. + if (memcmp(buffer, "13.", 3) == 0) return false; +#endif // V8_OS_MACOSX + return FLAG_enable_avx; +} + +} // namespace + + void CpuFeatures::ProbeImpl(bool cross_compile) { base::CPU cpu; CHECK(cpu.has_sse2()); // SSE2 support is mandatory. @@ -28,7 +55,7 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; // SAHF is not generally available in long mode. if (cpu.has_sahf() && FLAG_enable_sahf) supported_ |= 1u << SAHF; - if (cpu.has_avx() && FLAG_enable_avx) supported_ |= 1u << AVX; + if (cpu.has_avx() && EnableAVX()) supported_ |= 1u << AVX; if (cpu.has_fma3() && FLAG_enable_fma3) supported_ |= 1u << FMA3; }