1 // Copyright 2021 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "cpu_features_macros.h" 16 17 #ifdef CPU_FEATURES_ARCH_AARCH64 18 #if defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) 19 20 #include "impl_aarch64__base_implementation.inl" 21 22 #if !defined(HAVE_SYSCTLBYNAME) 23 #error "Darwin needs support for sysctlbyname" 24 #endif 25 #include <sys/sysctl.h> 26 27 #if defined(CPU_FEATURES_MOCK_SYSCTL_AARCH64) 28 extern bool GetDarwinSysCtlByName(const char*); 29 extern int GetDarwinSysCtlByNameValue(const char* name); 30 #else GetDarwinSysCtlByNameValue(const char * name)31static int GetDarwinSysCtlByNameValue(const char* name) { 32 int enabled; 33 size_t enabled_len = sizeof(enabled); 34 const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0); 35 return failure ? 0 : enabled; 36 } 37 GetDarwinSysCtlByName(const char * name)38static bool GetDarwinSysCtlByName(const char* name) { 39 return GetDarwinSysCtlByNameValue(name) != 0; 40 } 41 #endif 42 43 static const Aarch64Info kEmptyAarch64Info; 44 GetAarch64Info(void)45Aarch64Info GetAarch64Info(void) { 46 Aarch64Info info = kEmptyAarch64Info; 47 48 // Handling Darwin platform through sysctlbyname. 49 info.implementer = GetDarwinSysCtlByNameValue("hw.cputype"); 50 info.variant = GetDarwinSysCtlByNameValue("hw.cpusubtype"); 51 info.part = GetDarwinSysCtlByNameValue("hw.cpufamily"); 52 info.revision = GetDarwinSysCtlByNameValue("hw.cpusubfamily"); 53 54 info.features.fp = GetDarwinSysCtlByName("hw.optional.floatingpoint"); 55 info.features.asimd = GetDarwinSysCtlByName("hw.optional.AdvSIMD"); 56 info.features.aes = GetDarwinSysCtlByName("hw.optional.arm.FEAT_AES"); 57 info.features.pmull = GetDarwinSysCtlByName("hw.optional.arm.FEAT_PMULL"); 58 info.features.sha1 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA1"); 59 info.features.sha2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA256"); 60 info.features.crc32 = GetDarwinSysCtlByName("hw.optional.armv8_crc32"); 61 info.features.atomics = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LSE"); 62 info.features.fphp = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FP16"); 63 info.features.asimdhp = GetDarwinSysCtlByName("hw.optional.arm.AdvSIMD_HPFPCvt"); 64 info.features.asimdrdm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_RDM"); 65 info.features.jscvt = GetDarwinSysCtlByName("hw.optional.arm.FEAT_JSCVT"); 66 info.features.fcma = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FCMA"); 67 info.features.lrcpc = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LRCPC"); 68 info.features.dcpop = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DPB"); 69 info.features.sha3 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA3"); 70 info.features.asimddp = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DotProd"); 71 info.features.sha512 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SHA512"); 72 info.features.asimdfhm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FHM"); 73 info.features.dit = GetDarwinSysCtlByName("hw.optional.arm.FEAT_DIT"); 74 info.features.uscat = GetDarwinSysCtlByName("hw.optional.arm.FEAT_LSE2"); 75 info.features.flagm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FlagM"); 76 info.features.ssbs = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SSBS"); 77 info.features.sb = GetDarwinSysCtlByName("hw.optional.arm.FEAT_SB"); 78 info.features.flagm2 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FlagM2"); 79 info.features.frint = GetDarwinSysCtlByName("hw.optional.arm.FEAT_FRINTTS"); 80 info.features.i8mm = GetDarwinSysCtlByName("hw.optional.arm.FEAT_I8MM"); 81 info.features.bf16 = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BF16"); 82 info.features.bti = GetDarwinSysCtlByName("hw.optional.arm.FEAT_BTI"); 83 84 return info; 85 } 86 87 #endif // defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_IPHONE) 88 #endif // CPU_FEATURES_ARCH_AARCH64 89