]> git.saurik.com Git - apple/xnu.git/blame - EXTERNAL_HEADERS/corecrypto/cc_runtime_config.h
xnu-7195.60.75.tar.gz
[apple/xnu.git] / EXTERNAL_HEADERS / corecrypto / cc_runtime_config.h
CommitLineData
f427ee49 1/* Copyright (c) (2012,2014,2015,2016,2017,2018,2019,2020) Apple Inc. All rights reserved.
5ba3f43e 2 *
f427ee49
A
3 * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which
4 * is contained in the License.txt file distributed with corecrypto) and only to
5 * people who accept that license. IMPORTANT: Any license rights granted to you by
6 * Apple Inc. (if any) are limited to internal use within your organization only on
7 * devices and computers you own or control, for the sole purpose of verifying the
8 * security characteristics and correct functioning of the Apple Software. You may
9 * not, directly or indirectly, redistribute the Apple Software or any portions thereof.
5ba3f43e
A
10 */
11
12#ifndef CORECRYPTO_CC_RUNTIME_CONFIG_H_
13#define CORECRYPTO_CC_RUNTIME_CONFIG_H_
14
15#include <corecrypto/cc_config.h>
16
17/* Only intel systems have these runtime switches today. */
cb323159
A
18
19#if defined(__x86_64__) || defined(__i386__)
20
21#if CC_KERNEL
22 #include <i386/cpuid.h>
23 #define CC_HAS_RDRAND() ((cpuid_features() & CPUID_FEATURE_RDRAND) != 0)
5ba3f43e
A
24 #define CC_HAS_AESNI() ((cpuid_features() & CPUID_FEATURE_AES) != 0)
25 #define CC_HAS_SupplementalSSE3() ((cpuid_features() & CPUID_FEATURE_SSSE3) != 0)
26 #define CC_HAS_AVX1() ((cpuid_features() & CPUID_FEATURE_AVX1_0) != 0)
27 #define CC_HAS_AVX2() ((cpuid_info()->cpuid_leaf7_features & CPUID_LEAF7_FEATURE_AVX2) != 0)
d9a64523 28 #define CC_HAS_AVX512_AND_IN_KERNEL() ((cpuid_info()->cpuid_leaf7_features & CPUID_LEAF7_FEATURE_AVX512F) !=0)
f427ee49
A
29 #define CC_HAS_BMI2() ((cpuid_info()->cpuid_leaf7_features & CPUID_LEAF7_FEATURE_BMI2) != 0)
30 #define CC_HAS_ADX() ((cpuid_info()->cpuid_leaf7_features & CPUID_LEAF7_FEATURE_ADX) != 0)
5ba3f43e 31
f427ee49 32#elif CC_XNU_KERNEL_AVAILABLE && CC_INTERNAL_SDK
cb323159 33 #include <System/i386/cpu_capabilities.h>
f427ee49
A
34 #define CC_HAS_RDRAND() (_get_cpu_capabilities() & kHasRDRAND)
35 #define CC_HAS_AESNI() (_get_cpu_capabilities() & kHasAES)
36 #define CC_HAS_SupplementalSSE3() (_get_cpu_capabilities() & kHasSupplementalSSE3)
37 #define CC_HAS_AVX1() (_get_cpu_capabilities() & kHasAVX1_0)
38 #define CC_HAS_AVX2() (_get_cpu_capabilities() & kHasAVX2_0)
d9a64523 39 #define CC_HAS_AVX512_AND_IN_KERNEL() 0
f427ee49
A
40 #define CC_HAS_BMI2() (_get_cpu_capabilities() & kHasBMI2)
41 #define CC_HAS_ADX() (_get_cpu_capabilities() & kHasADX)
42
43#elif CC_SGX
44// SGX has no cpuid function, so these will fail
5ba3f43e
A
45 #define CC_HAS_AESNI() 0
46 #define CC_HAS_SupplementalSSE3() 0
47 #define CC_HAS_AVX1() 0
48 #define CC_HAS_AVX2() 0
f427ee49
A
49 #define CC_HAS_AVX512_AND_IN_KERNEL() 0
50 #define CC_HAS_BMI2() 0
51 #define CC_HAS_RDRAND() 0
52 #define CC_HAS_ADX() 0
53#else
54 #define CC_HAS_AESNI() __builtin_cpu_supports("aes")
55 #define CC_HAS_SupplementalSSE3() __builtin_cpu_supports("ssse3")
56 #define CC_HAS_AVX1() __builtin_cpu_supports("avx")
57 #define CC_HAS_AVX2() __builtin_cpu_supports("avx2")
58 #define CC_HAS_AVX512_AND_IN_KERNEL() 0
59 #define CC_HAS_BMI2() __builtin_cpu_supports("bmi2")
60#if CC_LINUX || !CC_INTERNAL_SDK
61 #include <cpuid.h>
62 #include <stdbool.h>
63
64 CC_INLINE bool _cpu_supports_rdrand()
65 {
66 unsigned int eax, ebx, ecx, edx;
67 __cpuid(1, eax, ebx, ecx, edx);
68 return ecx & bit_RDRND;
69 }
70
71 CC_INLINE bool _cpu_supports_adx()
72 {
73 unsigned int eax, ebx, ecx, edx;
74 __cpuid_count(7, 0, eax, ebx, ecx, edx);
75 return ebx & bit_ADX;
76 }
77
78 #define CC_HAS_RDRAND() _cpu_supports_rdrand()
79 #define CC_HAS_ADX() _cpu_supports_adx()
80#else
81 #define CC_HAS_RDRAND() 0
82 #define CC_HAS_ADX() 0
5ba3f43e
A
83#endif
84
f427ee49 85#endif
cb323159
A
86
87#endif // defined(__x86_64__) || defined(__i386__)
5ba3f43e
A
88
89#endif /* CORECRYPTO_CC_RUNTIME_CONFIG_H_ */