// Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "cpu_features_macros.h" #ifdef CPU_FEATURES_ARCH_X86 #ifdef CPU_FEATURES_OS_MACOS #include "impl_x86__base_implementation.inl" #if !defined(HAVE_SYSCTLBYNAME) #error "Darwin needs support for sysctlbyname" #endif #include #if defined(CPU_FEATURES_MOCK_CPUID_X86) extern bool GetDarwinSysCtlByName(const char*); #else // CPU_FEATURES_MOCK_CPUID_X86 static bool GetDarwinSysCtlByName(const char* name) { int enabled; size_t enabled_len = sizeof(enabled); const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); return failure ? false : enabled; } #endif static void OverrideOsPreserves(OsPreserves* os_preserves) { // On Darwin AVX512 support is On-demand. // We have to query the OS instead of querying the Zmm save/restore state. // https://github.com/apple/darwin-xnu/blob/8f02f2a044b9bb1ad951987ef5bab20ec9486310/osfmk/i386/fpu.c#L173-L199 os_preserves->avx512_registers = GetDarwinSysCtlByName("hw.optional.avx512f"); } static void DetectFeaturesFromOs(X86Info* info, X86Features* features) { (void)info; // Handling Darwin platform through sysctlbyname. features->sse = GetDarwinSysCtlByName("hw.optional.sse"); features->sse2 = GetDarwinSysCtlByName("hw.optional.sse2"); features->sse3 = GetDarwinSysCtlByName("hw.optional.sse3"); features->ssse3 = GetDarwinSysCtlByName("hw.optional.supplementalsse3"); features->sse4_1 = GetDarwinSysCtlByName("hw.optional.sse4_1"); features->sse4_2 = GetDarwinSysCtlByName("hw.optional.sse4_2"); } #endif // CPU_FEATURES_OS_MACOS #endif // CPU_FEATURES_ARCH_X86