10#if (SYMCRYPT_CPU_ARM | SYMCRYPT_CPU_ARM64) & SYMCRYPT_MS_VC
14#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
17#pragma clang attribute push (__attribute__((target("xsave"))), apply_to=function)
19#pragma GCC push_options
20#pragma GCC target("xsave")
32#define CPUID_1_ECX_RDRAND_BIT 30
33#define CPUID_1_ECX_PCLMULQDQ_BIT 1
34#define CPUID_1_ECX_AESNI_BIT 25
35#define CPUID_1_ECX_SSSE3_BIT 9
36#define CPUID_1_ECX_SSE3_BIT 0
37#define CPUID_1_EDX_SSE2_BIT 26
38#define CPUID_1_EDX_SSE_BIT 25
39#define CPUID_1_ECX_AVX_BIT 28
40#define CPUID_1_ECX_CMPXCHG16B_BIT 13
41#define CPUID_70_EBX_AVX2_BIT 5
42#define CPUID_70_EBX_RDSEED_BIT 18
43#define CPUID_70_EBX_SHANI_BIT 29
44#define CPUID_70_EBX_ADX_BIT 19
45#define CPUID_70_EBX_BMI2_BIT 8
46#define CPUID_70_EBX_AVX512F_BIT 16
47#define CPUID_70_EBX_AVX512BW_BIT 30
48#define CPUID_70_EBX_AVX512DQ_BIT 17
49#define CPUID_70_EBX_AVX512VL_BIT 31
50#define CPUID_70_ECX_VAES_BIT 9
51#define CPUID_70_ECX_VPCLMULQDQ_BIT 10
54#define CPUID_1_ECX_OSXSAVE_BIT 27
56typedef struct _CPUID_BIT_INFO {
68int g_SymCryptCpuid1[4];
71CPUID_BIT_INFO cpuidBitInfo[] = {
72 {1, WORD_ECX, CPUID_1_ECX_RDRAND_BIT, SYMCRYPT_CPU_FEATURE_RDRAND },
73 {1, WORD_ECX, CPUID_1_ECX_PCLMULQDQ_BIT, SYMCRYPT_CPU_FEATURE_PCLMULQDQ },
74 {1, WORD_ECX, CPUID_1_ECX_AESNI_BIT, SYMCRYPT_CPU_FEATURE_AESNI },
75 {1, WORD_EDX, CPUID_1_EDX_SSE_BIT, SYMCRYPT_CPU_FEATURE_SSE2 | SYMCRYPT_CPU_FEATURE_SSSE3 },
76 {1, WORD_EDX, CPUID_1_EDX_SSE2_BIT, SYMCRYPT_CPU_FEATURE_SSE2 | SYMCRYPT_CPU_FEATURE_SSSE3 },
77 {1, WORD_ECX, CPUID_1_ECX_SSE3_BIT, SYMCRYPT_CPU_FEATURE_SSSE3 },
78 {1, WORD_ECX, CPUID_1_ECX_SSSE3_BIT, SYMCRYPT_CPU_FEATURE_SSSE3 },
79 {1, WORD_ECX, CPUID_1_ECX_AVX_BIT, SYMCRYPT_CPU_FEATURE_AVX2 },
80 {1, WORD_ECX, CPUID_1_ECX_CMPXCHG16B_BIT, SYMCRYPT_CPU_FEATURE_CMPXCHG16B },
81 {7, WORD_EBX, CPUID_70_EBX_AVX2_BIT, SYMCRYPT_CPU_FEATURE_AVX2 },
82 {7, WORD_EBX, CPUID_70_EBX_RDSEED_BIT, SYMCRYPT_CPU_FEATURE_RDSEED },
83 {7, WORD_EBX, CPUID_70_EBX_SHANI_BIT, SYMCRYPT_CPU_FEATURE_SHANI },
84 {7, WORD_EBX, CPUID_70_EBX_ADX_BIT, SYMCRYPT_CPU_FEATURE_ADX },
85 {7, WORD_EBX, CPUID_70_EBX_BMI2_BIT, SYMCRYPT_CPU_FEATURE_BMI2 },
86 {7, WORD_EBX, CPUID_70_EBX_AVX512F_BIT, SYMCRYPT_CPU_FEATURE_AVX512 },
87 {7, WORD_EBX, CPUID_70_EBX_AVX512VL_BIT, SYMCRYPT_CPU_FEATURE_AVX512 },
88 {7, WORD_EBX, CPUID_70_EBX_AVX512BW_BIT, SYMCRYPT_CPU_FEATURE_AVX512 },
89 {7, WORD_EBX, CPUID_70_EBX_AVX512DQ_BIT, SYMCRYPT_CPU_FEATURE_AVX512 },
90 {7, WORD_ECX, CPUID_70_ECX_VAES_BIT, SYMCRYPT_CPU_FEATURE_VAES },
91 {7, WORD_ECX, CPUID_70_ECX_VPCLMULQDQ_BIT, SYMCRYPT_CPU_FEATURE_VAES },
110 SYMCRYPT_CPU_FEATURE_SSE2 |
111 SYMCRYPT_CPU_FEATURE_SSSE3 |
112 SYMCRYPT_CPU_FEATURE_AESNI |
113 SYMCRYPT_CPU_FEATURE_PCLMULQDQ |
114 SYMCRYPT_CPU_FEATURE_AVX2 |
115 SYMCRYPT_CPU_FEATURE_SHANI |
116 SYMCRYPT_CPU_FEATURE_BMI2 |
117 SYMCRYPT_CPU_FEATURE_ADX |
118 SYMCRYPT_CPU_FEATURE_RDRAND |
119 SYMCRYPT_CPU_FEATURE_RDSEED |
120 SYMCRYPT_CPU_FEATURE_AVX512 |
121 SYMCRYPT_CPU_FEATURE_VAES |
122 SYMCRYPT_CPU_FEATURE_CMPXCHG16B
129 maxInfoType = CPUInfo[WORD_EAX];
131 for(
i=0;
i<
sizeof( cpuidBitInfo ) /
sizeof( *cpuidBitInfo );
i++ )
133 if( cpuidBitInfo[
i].leaf != InfoType )
135 InfoType = cpuidBitInfo[
i].leaf;
138 if( cpuidBitInfo[
i].leaf > maxInfoType || (CPUInfo[ cpuidBitInfo[
i].
word ] & (1UL << cpuidBitInfo[
i].bitno) ) == 0 )
140 result |= cpuidBitInfo[
i].requiredBy;
161 if( (CPUInfo[WORD_ECX] & (1 << CPUID_1_ECX_OSXSAVE_BIT)) != 0 )
164 xGetBvResult =
_xgetbv( _XCR_XFEATURE_ENABLED_MASK );
167 if( (xGetBvResult & 0x6) == 0x6)
184 if( (xGetBvResult & 0xe0) == 0xe0)
194 result |= SYMCRYPT_CPU_FEATURE_AVX2;
203 result |= SYMCRYPT_CPU_FEATURE_AVX512;
208 if( (
result & SYMCRYPT_CPU_FEATURE_AESNI) == 0 )
230 if( CPUInfo[WORD_EBX] ==
'htuA'
231 && CPUInfo[WORD_ECX] ==
'DMAc'
232 && CPUInfo[WORD_EDX] ==
'itne' )
247 baseFamily = (CPUInfo[WORD_EAX] >> 8) & 0xf;
249 extFamily = (CPUInfo[WORD_EAX] >> 20) & 0xff;
251 if( baseFamily < 0xf )
255 family = baseFamily + extFamily;
263 result |= SYMCRYPT_CPU_FEATURE_AESNI;
274#pragma clang attribute pop
276#pragma GCC pop_options
279#elif SYMCRYPT_CPU_ARM
281#define CP15_ISAR5 15, 0, 0, 2, 5
283#define READ_ARM_FEATURE(_FeatureRegister, _Index) \
284 (((ULONG)_MoveFromCoprocessor(_FeatureRegister) >> ((_Index) * 4)) & 0xF)
287#define ISAR5_AES_AESE 1
288#define ISAR5_AES_PMULL 2
291#define ISAR5_SHA2_SHA256H 1
294#define ISAR5_CRC32_IMP 1
309 SYMCRYPT_CPU_FEATURE_NEON |
310 SYMCRYPT_CPU_FEATURE_NEON_AES |
311 SYMCRYPT_CPU_FEATURE_NEON_PMULL |
312 SYMCRYPT_CPU_FEATURE_NEON_SHA256
320 if( READ_ARM_FEATURE(
CP15_ISAR5, ISAR5_AES) < ISAR5_AES_AESE )
322 result |= SYMCRYPT_CPU_FEATURE_NEON_AES;
325 if( READ_ARM_FEATURE(
CP15_ISAR5, ISAR5_AES) < ISAR5_AES_PMULL )
327 result |= SYMCRYPT_CPU_FEATURE_NEON_PMULL;
330 if( READ_ARM_FEATURE(
CP15_ISAR5, ISAR5_SHA2) < ISAR5_SHA2_SHA256H )
332 result |= SYMCRYPT_CPU_FEATURE_NEON_SHA256;
339 result |= SYMCRYPT_CPU_FEATURE_NEON_AES | SYMCRYPT_CPU_FEATURE_NEON_PMULL | SYMCRYPT_CPU_FEATURE_NEON_SHA256;
351#elif SYMCRYPT_CPU_ARM64 && !SYMCRYPT_PLATFORM_WINE
354#define ARM64_SYSREG(op0, op1, crn, crm, op2) \
355 ( ((op0 & 1) << 14) | \
356 ((op1 & 7) << 11) | \
357 ((crn & 15) << 7) | \
358 ((crm & 15) << 3) | \
361#define ARM64_ID_AA64ISAR0_EL1 ARM64_SYSREG(3,0, 0, 6,0)
364#define ISAR0_AES_NI 0
365#define ISAR0_AES_INSTRUCTIONS 1
366#define ISAR0_AES_PLUS_PMULL64 2
369#define ISAR0_SHA2_NI 0
370#define ISAR0_SHA2_INSTRUCTIONS 1
373#define ISAR0_CRC32_NI 0
374#define ISAR0_CRC32_INSTRUCTIONS 1
376#define READ_ARM64_FEATURE(_FeatureRegister, _Index) \
377 (((ULONG64)_ReadStatusReg(_FeatureRegister) >> ((_Index) * 4)) & 0xF)
386 SYMCRYPT_CPU_FEATURE_NEON |
387 SYMCRYPT_CPU_FEATURE_NEON_AES |
388 SYMCRYPT_CPU_FEATURE_NEON_PMULL |
389 SYMCRYPT_CPU_FEATURE_NEON_SHA256
395 if( READ_ARM64_FEATURE(ARM64_ID_AA64ISAR0_EL1, ISAR0_AES) < ISAR0_AES_INSTRUCTIONS )
397 result |= SYMCRYPT_CPU_FEATURE_NEON_AES;
400 if( READ_ARM64_FEATURE(ARM64_ID_AA64ISAR0_EL1, ISAR0_AES) < ISAR0_AES_PLUS_PMULL64 )
402 result |= SYMCRYPT_CPU_FEATURE_NEON_PMULL;
405 if( READ_ARM64_FEATURE(ARM64_ID_AA64ISAR0_EL1, ISAR0_SHA2) < ISAR0_SHA2_INSTRUCTIONS )
407 result |= SYMCRYPT_CPU_FEATURE_NEON_SHA256;
COMPILER_DEPENDENT_INT64 INT64
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
unsigned __int64 __cdecl _xgetbv(unsigned int)
#define EXCEPTION_EXECUTE_HANDLER
VOID SYMCRYPT_CALL SymCryptCpuidExFunc(int cpuInfo[4], int function_id, int subfunction_id)
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromRegisters(void)
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesByCpuid(UINT32 flags)
#define SYMCRYPT_CPUID_DETECT_FLAG_CHECK_OS_SUPPORT_FOR_YMM
UINT32 SYMCRYPT_CPU_FEATURES
SYMCRYPT_CPU_FEATURES g_SymCryptCpuFeaturesNotPresent