// Copyright 2021 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_AARCH64 #if defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) #include "impl_aarch64__base_implementation.inl" #if !defined(HAVE_SYSCTLBYNAME) #error "Darwin needs support for sysctlbyname" #endif #include #if defined(CPU_FEATURES_MOCK_SYSCTL_AARCH64) extern bool GetDarwinSysCtlByName(const char*); extern int GetDarwinSysCtlByNameValue(const char* name); #else static int GetDarwinSysCtlByNameValue(const char* name) { int enabled; size_t enabled_len = sizeof(enabled); const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); return failure ? 0 : enabled; } static bool GetDarwinSysCtlByName(const char* name) { return GetDarwinSysCtlByNameValue(name) != 0; } #endif static const Aarch64Info kEmptyAarch64Info; Aarch64Info GetAarch64Info(void) { Aarch64Info info = kEmptyAarch64Info; // Handling Darwin platform through sysctlbyname. info.implementer = GetDarwinSysCtlByNameValue("hw.cputype"); info.variant = GetDarwinSysCtlByNameValue("hw.cpusubtype"); info.part = GetDarwinSysCtlByNameValue("hw.cpufamily"); info.revision = GetDarwinSysCtlByNameValue("hw.cpusubfamily"); info.features.fp = GetDarwinSysCtlByName("hw.optional.floatingpoint"); info.features.asimd = GetDarwinSysCtlByName("hw.optional.AdvSIMD"); info.features.aes = GetDarwinSysCtlByName("hw.optional.arm.FEAT_AES"); info.features.pmull = GetDarwinSysCtlByName("hw.optional.arm.FEAT_PMULL"); info.features.sha1 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA1"); info.features.sha2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA256"); info.features.crc32 = GetDarwinSysCtlByName("hw.optional.armv8_crc32"); info.features.atomics = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LSE"); info.features.fphp = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FP16"); info.features.asimdhp = GetDarwinSysCtlByName("hw.optional.arm.AdvSIMD_HPFPCvt"); info.features.asimdrdm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_RDM"); info.features.jscvt = GetDarwinSysCtlByName("hw.optional.arm.FEAT_JSCVT"); info.features.fcma = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FCMA"); info.features.lrcpc = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LRCPC"); info.features.dcpop = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DPB"); info.features.sha3 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA3"); info.features.asimddp = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DotProd"); info.features.sha512 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA512"); info.features.asimdfhm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FHM"); info.features.dit = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DIT"); info.features.uscat = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LSE2"); info.features.flagm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FlagM"); info.features.ssbs = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SSBS"); info.features.sb = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SB"); info.features.flagm2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FlagM2"); info.features.frint = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FRINTTS"); info.features.i8mm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_I8MM"); info.features.bf16 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BF16"); info.features.bti = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BTI"); return info; } #endif // defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) #endif // CPU_FEATURES_ARCH_AARCH64