6 #ifndef EXCEPTION_EXECUTE_HANDLER 7 # define EXCEPTION_EXECUTE_HANDLER 1 10 #ifndef CRYPTOPP_IMPORTS 17 # include <sys/systemcfg.h> 26 #if (((__GLIBC__ * 100) + __GLIBC_MINOR__) >= 216) 27 # define CRYPTOPP_GETAUXV_AVAILABLE 1 30 #if CRYPTOPP_GETAUXV_AVAILABLE 31 # include <sys/auxv.h> 33 unsigned long int getauxval(
unsigned long int) {
return 0; }
36 #if defined(__APPLE__) && (defined(__aarch64__) || defined(__POWERPC__)) 37 # include <sys/utsname.h> 42 #if defined(__ANDROID__) 43 # include "cpu-features.h" 46 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 53 #ifndef CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 55 typedef void (*SigHandler)(int);
60 static jmp_buf s_jmpNoCPUID;
61 static void SigIllHandlerCPUID(
int unused)
63 CRYPTOPP_UNUSED(unused);
64 longjmp(s_jmpNoCPUID, 1);
67 #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 71 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 73 extern bool CPU_ProbeSSE2();
77 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
79 __cpuidex((
int *)output, func, subfunc);
83 #elif _MSC_VER >= 1400 && CRYPTOPP_BOOL_X64 85 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
90 __cpuid((
int *)output, func);
98 bool CpuId(word32 func, word32 subfunc, word32 output[4])
100 #if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) || defined(__BORLANDC__) 122 __except (EXCEPTION_EXECUTE_HANDLER)
131 return output[0] != 0;
137 volatile bool result =
true;
139 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandlerCPUID);
140 if (oldHandler == SIG_ERR)
144 volatile sigset_t oldMask;
145 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
149 if (setjmp(s_jmpNoCPUID))
157 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 158 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" 160 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" 162 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
163 :
"a" (func),
"c" (subfunc)
169 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
172 signal(SIGILL, oldHandler);
179 bool CRYPTOPP_SECTION_INIT g_x86DetectionDone =
false;
180 bool CRYPTOPP_SECTION_INIT CRYPTOPP_SECTION_INIT g_hasSSE2 =
false, CRYPTOPP_SECTION_INIT g_hasSSSE3 =
false;
181 bool CRYPTOPP_SECTION_INIT g_hasSSE41 =
false, CRYPTOPP_SECTION_INIT g_hasSSE42 =
false;
182 bool CRYPTOPP_SECTION_INIT g_hasAESNI =
false, CRYPTOPP_SECTION_INIT g_hasCLMUL =
false;
183 bool CRYPTOPP_SECTION_INIT g_hasADX =
false, CRYPTOPP_SECTION_INIT g_hasSHA =
false;
184 bool CRYPTOPP_SECTION_INIT g_hasRDRAND =
false, CRYPTOPP_SECTION_INIT g_hasRDSEED =
false, CRYPTOPP_SECTION_INIT g_isP4 =
false;
185 bool CRYPTOPP_SECTION_INIT g_hasPadlockRNG =
false, CRYPTOPP_SECTION_INIT g_hasPadlockACE =
false, CRYPTOPP_SECTION_INIT g_hasPadlockACE2 =
false;
186 bool CRYPTOPP_SECTION_INIT g_hasPadlockPHE =
false, CRYPTOPP_SECTION_INIT g_hasPadlockPMM =
false;
187 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
189 static inline bool IsIntel(
const word32 output[4])
192 return (output[1] == 0x756e6547) &&
193 (output[2] == 0x6c65746e) &&
194 (output[3] == 0x49656e69);
197 static inline bool IsAMD(
const word32 output[4])
200 return (output[1] == 0x68747541) &&
201 (output[2] == 0x444D4163) &&
202 (output[3] == 0x69746E65);
205 static inline bool IsVIA(
const word32 output[4])
208 return (output[1] == 0x746e6543) &&
209 (output[2] == 0x736c7561) &&
210 (output[3] == 0x48727561);
213 void DetectX86Features()
216 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
217 if (!CpuId(0, 0, cpuid0))
219 if (!CpuId(1, 0, cpuid1))
224 if ((cpuid1[3] & (1 << 26)) != 0)
225 g_hasSSE2 = ((cpuid1[2] & (1 << 27)) != 0) || CPU_ProbeSSE2();
227 g_hasSSSE3 = g_hasSSE2 && ((cpuid1[2] & (1<< 9)) != 0);
228 g_hasSSE41 = g_hasSSE2 && ((cpuid1[2] & (1<<19)) != 0);
229 g_hasSSE42 = g_hasSSE2 && ((cpuid1[2] & (1<<20)) != 0);
230 g_hasAESNI = g_hasSSE2 && ((cpuid1[2] & (1<<25)) != 0);
231 g_hasCLMUL = g_hasSSE2 && ((cpuid1[2] & (1<< 1)) != 0);
235 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
236 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
237 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
238 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
240 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
241 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
242 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
246 if (CpuId(7, 0, cpuid2))
248 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
249 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
250 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
254 else if (IsAMD(cpuid0))
256 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
257 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
258 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
259 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
261 CpuId(0x80000005, 0, cpuid2);
262 g_cacheLineSize = GETBYTE(cpuid2[2], 0);
263 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
267 if (CpuId(7, 0, cpuid2))
269 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
270 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
271 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
275 else if (IsVIA(cpuid0))
277 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2))
278 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6))
279 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8))
280 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10))
281 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12))
283 CpuId(0xC0000000, 0, cpuid2);
284 if (cpuid2[0] >= 0xC0000001)
287 CpuId(0xC0000001, 0, cpuid2);
288 g_hasPadlockRNG = (cpuid2[3] & RNG_FLAGS) != 0;
289 g_hasPadlockACE = (cpuid2[3] & ACE_FLAGS) != 0;
290 g_hasPadlockACE2 = (cpuid2[3] & ACE2_FLAGS) != 0;
291 g_hasPadlockPHE = (cpuid2[3] & PHE_FLAGS) != 0;
292 g_hasPadlockPMM = (cpuid2[3] & PMM_FLAGS) != 0;
296 if (!g_cacheLineSize)
297 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
299 *
const_cast<volatile bool*
>(&g_x86DetectionDone) =
true;
304 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) 306 bool CRYPTOPP_SECTION_INIT g_ArmDetectionDone =
false;
307 bool CRYPTOPP_SECTION_INIT g_hasNEON =
false, CRYPTOPP_SECTION_INIT g_hasPMULL =
false, CRYPTOPP_SECTION_INIT g_hasCRC32 =
false;
308 bool CRYPTOPP_SECTION_INIT g_hasAES =
false, CRYPTOPP_SECTION_INIT g_hasSHA1 =
false, CRYPTOPP_SECTION_INIT g_hasSHA2 =
false;
309 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
324 extern bool CPU_ProbeNEON();
325 extern bool CPU_ProbeCRC32();
326 extern bool CPU_ProbeAES();
327 extern bool CPU_ProbeSHA1();
328 extern bool CPU_ProbeSHA2();
329 extern bool CPU_ProbePMULL();
332 # define HWCAP_ASIMD (1 << 1) 334 #ifndef HWCAP_ARM_NEON 335 # define HWCAP_ARM_NEON 4096 338 # define HWCAP_CRC32 (1 << 7) 341 # define HWCAP2_CRC32 (1 << 4) 344 # define HWCAP_PMULL (1 << 4) 347 # define HWCAP2_PMULL (1 << 1) 350 # define HWCAP_AES (1 << 3) 353 # define HWCAP2_AES (1 << 0) 356 # define HWCAP_SHA1 (1 << 5) 359 # define HWCAP_SHA2 (1 << 6) 362 # define HWCAP2_SHA1 (1 << 2) 365 # define HWCAP2_SHA2 (1 << 3) 368 inline bool CPU_QueryNEON()
370 #if defined(__ANDROID__) && defined(__aarch64__) 371 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
372 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD))
374 #elif defined(__ANDROID__) && defined(__arm__) 375 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
376 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON))
378 #elif defined(__linux__) && defined(__aarch64__) 379 if (getauxval(AT_HWCAP) & HWCAP_ASIMD)
381 #elif defined(__linux__) && defined(__aarch32__) 382 if (getauxval(AT_HWCAP2) & HWCAP2_ASIMD)
384 #elif defined(__linux__) && defined(__arm__) 385 if (getauxval(AT_HWCAP) & HWCAP_ARM_NEON)
387 #elif defined(__APPLE__) && defined(__aarch64__) 394 inline bool CPU_QueryCRC32()
396 #if defined(__ANDROID__) && defined(__aarch64__) 397 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
398 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32))
400 #elif defined(__ANDROID__) && defined(__aarch32__) 401 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
402 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32))
404 #elif defined(__linux__) && defined(__aarch64__) 405 if (getauxval(AT_HWCAP) & HWCAP_CRC32)
407 #elif defined(__linux__) && defined(__aarch32__) 408 if (getauxval(AT_HWCAP2) & HWCAP2_CRC32)
410 #elif defined(__APPLE__) && defined(__aarch64__) 417 inline bool CPU_QueryPMULL()
419 #if defined(__ANDROID__) && defined(__aarch64__) 420 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
421 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL))
423 #elif defined(__ANDROID__) && defined(__aarch32__) 424 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
425 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL))
427 #elif defined(__linux__) && defined(__aarch64__) 428 if (getauxval(AT_HWCAP) & HWCAP_PMULL)
430 #elif defined(__linux__) && defined(__aarch32__) 431 if (getauxval(AT_HWCAP2) & HWCAP2_PMULL)
433 #elif defined(__APPLE__) && defined(__aarch64__) 440 inline bool CPU_QueryAES()
442 #if defined(__ANDROID__) && defined(__aarch64__) 443 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
444 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES))
446 #elif defined(__ANDROID__) && defined(__aarch32__) 447 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
448 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES))
450 #elif defined(__linux__) && defined(__aarch64__) 451 if (getauxval(AT_HWCAP) & HWCAP_AES)
453 #elif defined(__linux__) && defined(__aarch32__) 454 if (getauxval(AT_HWCAP2) & HWCAP2_AES)
456 #elif defined(__APPLE__) && defined(__aarch64__) 458 struct utsname systemInfo;
459 systemInfo.machine[0] =
'\0';
463 std::string machine(systemInfo.machine);
464 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
465 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
466 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
467 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
475 inline bool CPU_QuerySHA1()
477 #if defined(__ANDROID__) && defined(__aarch64__) 478 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
479 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1))
481 #elif defined(__ANDROID__) && defined(__aarch32__) 482 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
483 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1))
485 #elif defined(__linux__) && defined(__aarch64__) 486 if (getauxval(AT_HWCAP) & HWCAP_SHA1)
488 #elif defined(__linux__) && defined(__aarch32__) 489 if (getauxval(AT_HWCAP2) & HWCAP2_SHA1)
491 #elif defined(__APPLE__) && defined(__aarch64__) 493 struct utsname systemInfo;
494 systemInfo.machine[0] =
'\0';
498 std::string machine(systemInfo.machine);
499 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
500 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
501 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
502 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
510 inline bool CPU_QuerySHA2()
512 #if defined(__ANDROID__) && defined(__aarch64__) 513 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
514 (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2))
516 #elif defined(__ANDROID__) && defined(__aarch32__) 517 if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
518 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2))
520 #elif defined(__linux__) && defined(__aarch64__) 521 if (getauxval(AT_HWCAP) & HWCAP_SHA2)
523 #elif defined(__linux__) && defined(__aarch32__) 524 if (getauxval(AT_HWCAP2) & HWCAP2_SHA2)
526 #elif defined(__APPLE__) && defined(__aarch64__) 528 struct utsname systemInfo;
529 systemInfo.machine[0] =
'\0';
533 std::string machine(systemInfo.machine);
534 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
535 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
536 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
537 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
545 void DetectArmFeatures()
549 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
550 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
551 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
552 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
553 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
554 g_hasSHA2 = CPU_QuerySHA2() || CPU_ProbeSHA2();
556 #if defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 557 g_cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
560 if (!g_cacheLineSize)
561 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
563 *
const_cast<volatile bool*
>(&g_ArmDetectionDone) =
true;
568 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) 570 bool CRYPTOPP_SECTION_INIT g_PowerpcDetectionDone =
false;
571 bool CRYPTOPP_SECTION_INIT g_hasAltivec =
false, CRYPTOPP_SECTION_INIT g_hasPower7 =
false, CRYPTOPP_SECTION_INIT g_hasPower8 =
false;
572 bool CRYPTOPP_SECTION_INIT g_hasAES =
false, CRYPTOPP_SECTION_INIT g_hasSHA256 =
false, CRYPTOPP_SECTION_INIT g_hasSHA512 =
false;
573 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
575 extern bool CPU_ProbeAltivec();
576 extern bool CPU_ProbePower7();
577 extern bool CPU_ProbePower8();
578 extern bool CPU_ProbeAES();
579 extern bool CPU_ProbeSHA256();
580 extern bool CPU_ProbeSHA512();
582 #ifndef PPC_FEATURE_HAS_ALTIVEC 583 # define PPC_FEATURE_HAS_ALTIVEC 0x10000000 585 #ifndef PPC_FEATURE_ARCH_2_06 586 # define PPC_FEATURE_ARCH_2_06 0x00000100 588 #ifndef PPC_FEATURE2_ARCH_2_07 589 # define PPC_FEATURE2_ARCH_2_07 0x80000000 591 #ifndef PPC_FEATURE2_VEC_CRYPTO 592 # define PPC_FEATURE2_VEC_CRYPTO 0x02000000 595 inline bool CPU_QueryAltivec()
597 #if defined(__linux__) 598 if (getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC)
600 #elif defined(__APPLE__) && defined(__POWERPC__) 602 struct utsname systemInfo;
603 systemInfo.machine[0] =
'\0';
607 std::string machine(systemInfo.machine);
608 if (machine.substr(0, 15) ==
"Power Macintosh")
616 inline bool CPU_QueryPower7()
619 #if defined(__linux__) 620 if (getauxval(AT_HWCAP2) & PPC_FEATURE_ARCH_2_06)
626 inline bool CPU_QueryPower8()
629 #if defined(__linux__) 630 if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07)
636 inline bool CPU_QueryAES()
640 #if defined(__linux__) 641 if (getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO)
649 inline bool CPU_QuerySHA256()
653 #if defined(__linux__) 654 if (getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO)
661 inline bool CPU_QuerySHA512()
665 #if defined(__linux__) 666 if (getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO)
674 void DetectPowerpcFeatures()
678 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
679 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
680 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
682 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
683 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
684 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
688 g_cacheLineSize = getsystemcfg(SC_L1C_DLS);
689 #elif defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 691 g_cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
694 if (g_cacheLineSize <= 0)
695 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
697 *
const_cast<volatile bool*
>(&g_PowerpcDetectionDone) =
true;
705 ANONYMOUS_NAMESPACE_BEGIN
712 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 713 CryptoPP::DetectX86Features();
714 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 715 CryptoPP::DetectArmFeatures();
716 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64 717 CryptoPP::DetectPowerpcFeatures();
726 #if HAVE_GCC_INIT_PRIORITY 727 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
728 #elif HAVE_MSC_INIT_PRIORITY 729 #pragma warning(disable: 4075) 730 #pragma init_seg(".CRT$XCU") 731 const InitCpu s_init;
732 #pragma warning(default: 4075) 734 const InitCpu s_init;
737 ANONYMOUS_NAMESPACE_END
739 #endif // CRYPTOPP_IMPORTS Utility functions for the Crypto++ library.
Library configuration file.
Functions for CPU features and intrinsics.
Crypto++ library namespace.