xref: /aosp_15_r20/external/cpu_features/src/impl_aarch64_macos_or_iphone.c (revision eca53ba6d2e951e174b64682eaf56a36b8204c89)
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)31 static 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)38 static bool GetDarwinSysCtlByName(const char* name) {
39   return GetDarwinSysCtlByNameValue(name) != 0;
40 }
41 #endif
42 
43 static const Aarch64Info kEmptyAarch64Info;
44 
GetAarch64Info(void)45 Aarch64Info 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