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> 39 unsigned long int getauxval(
unsigned long int) {
return 0; }
42 #if defined(__APPLE__) 43 # include <sys/utsname.h> 50 #if defined(__ANDROID__) 51 # include "cpu-features.h" 54 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 60 #if defined(_MSC_VER) && _MSC_VER <= 1500 && defined(_M_X64) 61 extern "C" unsigned long long __fastcall ExtendedControlRegister(
unsigned int);
64 ANONYMOUS_NAMESPACE_BEGIN
66 #if defined(__APPLE__) 67 enum {PowerMac=1, Mac, iPhone, iPod, iPad, AppleTV, AppleWatch};
68 void GetAppleMachineInfo(
unsigned int& device,
unsigned int& version)
72 struct utsname systemInfo;
73 systemInfo.machine[0] =
'\0';
76 std::string machine(systemInfo.machine);
77 if (machine.find(
"PowerMac") != std::string::npos ||
78 machine.find(
"Power Macintosh") != std::string::npos)
80 else if (machine.find(
"Mac") != std::string::npos ||
81 machine.find(
"Macintosh") != std::string::npos)
83 else if (machine.find(
"iPhone") != std::string::npos)
85 else if (machine.find(
"iPod") != std::string::npos)
87 else if (machine.find(
"iPad") != std::string::npos)
89 else if (machine.find(
"AppleTV") != std::string::npos)
91 else if (machine.find(
"AppleWatch") != std::string::npos)
94 std::string::size_type pos = machine.find_first_of(
"0123456789");
95 if (pos != std::string::npos)
96 version = std::atoi(machine.substr(pos).c_str());
100 bool IsAppleMachineARMv8(
unsigned int device,
unsigned int version)
102 if ((device == iPhone && version >= 6) ||
103 (device == iPad && version >= 4))
110 bool IsAppleMachineARMv84(
unsigned int device,
unsigned int version)
116 ANONYMOUS_NAMESPACE_END
120 #ifndef CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 122 typedef void (*SigHandler)(int);
127 static jmp_buf s_jmpNoCPUID;
128 static void SigIllHandlerCPUID(
int unused)
130 CRYPTOPP_UNUSED(unused);
131 longjmp(s_jmpNoCPUID, 1);
134 #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 138 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 140 extern bool CPU_ProbeSSE2();
144 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
146 __cpuidex((
int *)output, func, subfunc);
150 #elif _MSC_VER >= 1400 && CRYPTOPP_BOOL_X64 152 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
157 __cpuid((
int *)output, func);
165 bool CpuId(word32 func, word32 subfunc, word32 output[4])
167 #if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) || defined(__BORLANDC__) 189 __except (EXCEPTION_EXECUTE_HANDLER)
198 return output[0] != 0;
204 volatile bool result =
true;
206 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandlerCPUID);
207 if (oldHandler == SIG_ERR)
211 volatile sigset_t oldMask;
212 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
216 if (setjmp(s_jmpNoCPUID))
224 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 225 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" 227 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" 229 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
230 :
"a" (func),
"c" (subfunc)
236 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
239 signal(SIGILL, oldHandler);
246 bool CRYPTOPP_SECTION_INIT g_x86DetectionDone =
false;
247 bool CRYPTOPP_SECTION_INIT g_hasSSE2 =
false;
248 bool CRYPTOPP_SECTION_INIT g_hasSSSE3 =
false;
249 bool CRYPTOPP_SECTION_INIT g_hasSSE41 =
false;
250 bool CRYPTOPP_SECTION_INIT g_hasSSE42 =
false;
251 bool CRYPTOPP_SECTION_INIT g_hasAVX =
false;
252 bool CRYPTOPP_SECTION_INIT g_hasAVX2 =
false;
253 bool CRYPTOPP_SECTION_INIT g_hasAESNI =
false;
254 bool CRYPTOPP_SECTION_INIT g_hasCLMUL =
false;
255 bool CRYPTOPP_SECTION_INIT g_hasADX =
false;
256 bool CRYPTOPP_SECTION_INIT g_hasSHA =
false;
257 bool CRYPTOPP_SECTION_INIT g_hasRDRAND =
false;
258 bool CRYPTOPP_SECTION_INIT g_hasRDSEED =
false;
259 bool CRYPTOPP_SECTION_INIT g_isP4 =
false;
260 bool CRYPTOPP_SECTION_INIT g_hasPadlockRNG =
false;
261 bool CRYPTOPP_SECTION_INIT g_hasPadlockACE =
false;
262 bool CRYPTOPP_SECTION_INIT g_hasPadlockACE2 =
false;
263 bool CRYPTOPP_SECTION_INIT g_hasPadlockPHE =
false;
264 bool CRYPTOPP_SECTION_INIT g_hasPadlockPMM =
false;
265 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
267 static inline bool IsIntel(
const word32 output[4])
270 return (output[1] == 0x756e6547) &&
271 (output[2] == 0x6c65746e) &&
272 (output[3] == 0x49656e69);
275 static inline bool IsAMD(
const word32 output[4])
278 return (output[1] == 0x68747541) &&
279 (output[2] == 0x444D4163) &&
280 (output[3] == 0x69746E65);
283 static inline bool IsHygon(
const word32 output[4])
286 return (output[1] == 0x6f677948) &&
287 (output[2] == 0x656e6975) &&
288 (output[3] == 0x6e65476e);
291 static inline bool IsVIA(
const word32 output[4])
294 return (output[1] == 0x746e6543) &&
295 (output[2] == 0x736c7561) &&
296 (output[3] == 0x48727561);
299 void DetectX86Features()
302 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
303 if (!CpuId(0, 0, cpuid0))
305 if (!CpuId(1, 0, cpuid1))
310 if ((cpuid1[3] & (1 << 26)) != 0)
311 g_hasSSE2 = ((cpuid1[2] & (1 << 27)) != 0) || CPU_ProbeSSE2();
313 g_hasSSSE3 = g_hasSSE2 && ((cpuid1[2] & (1<< 9)) != 0);
314 g_hasSSE41 = g_hasSSE2 && ((cpuid1[2] & (1<<19)) != 0);
315 g_hasSSE42 = g_hasSSE2 && ((cpuid1[2] & (1<<20)) != 0);
316 g_hasAESNI = g_hasSSE2 && ((cpuid1[2] & (1<<25)) != 0);
317 g_hasCLMUL = g_hasSSE2 && ((cpuid1[2] & (1<< 1)) != 0);
321 CRYPTOPP_CONSTANT(YMM_FLAG = (3 << 1))
322 CRYPTOPP_CONSTANT(AVX_FLAG = (3 << 27))
323 if ((cpuid1[2] & AVX_FLAG) == AVX_FLAG)
326 #if defined(__GNUC__) || (__SUNPRO_CC >= 0x5100) || defined(__BORLANDC__) 333 ".byte 0x0f, 0x01, 0xd0" "\n\t" 334 :
"=a"(a),
"=d"(d) :
"c"(0) :
336 word64 xcr0 = a |
static_cast<word64
>(d) << 32;
337 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
340 #elif defined(_MSC_VER) && _MSC_VER <= 1500 && defined(_M_IX86) 356 word64 xcr0 = a |
static_cast<word64
>(d) << 32;
357 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
360 #elif defined(_MSC_VER) && _MSC_VER <= 1500 && defined(_M_X64) 361 word64 xcr0 = ExtendedControlRegister(0);
362 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
363 #elif defined(__SUNPRO_CC) // fall into 366 word64 xcr0 = _xgetbv(0);
367 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
373 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
374 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
375 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
376 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
377 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5))
379 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
380 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
381 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
385 if (CpuId(7, 0, cpuid2))
387 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
388 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
389 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
390 g_hasAVX2 = (cpuid2[1] & AVX2_FLAG) != 0;
394 else if (IsAMD(cpuid0) || IsHygon(cpuid0))
396 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
397 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
398 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
399 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
400 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5))
402 CpuId(0x80000005, 0, cpuid2);
403 g_cacheLineSize = GETBYTE(cpuid2[2], 0);
404 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
408 if (CpuId(7, 0, cpuid2))
410 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
411 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
412 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
413 g_hasAVX2 = (cpuid2[1] & AVX2_FLAG) != 0;
417 else if (IsVIA(cpuid0))
419 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2))
420 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6))
421 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8))
422 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10))
423 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12))
425 CpuId(0xC0000000, 0, cpuid2);
426 if (cpuid2[0] >= 0xC0000001)
429 CpuId(0xC0000001, 0, cpuid2);
430 g_hasPadlockRNG = (cpuid2[3] & RNG_FLAGS) == RNG_FLAGS;
431 g_hasPadlockACE = (cpuid2[3] & ACE_FLAGS) == ACE_FLAGS;
432 g_hasPadlockACE2 = (cpuid2[3] & ACE2_FLAGS) == ACE2_FLAGS;
433 g_hasPadlockPHE = (cpuid2[3] & PHE_FLAGS) == PHE_FLAGS;
434 g_hasPadlockPMM = (cpuid2[3] & PMM_FLAGS) == PMM_FLAGS;
438 if (g_cacheLineSize == 0)
439 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
441 *
const_cast<volatile bool*
>(&g_x86DetectionDone) =
true;
446 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8) 448 bool CRYPTOPP_SECTION_INIT g_ArmDetectionDone =
false;
449 bool CRYPTOPP_SECTION_INIT g_hasARMv7 =
false;
450 bool CRYPTOPP_SECTION_INIT g_hasNEON =
false;
451 bool CRYPTOPP_SECTION_INIT g_hasPMULL =
false;
452 bool CRYPTOPP_SECTION_INIT g_hasCRC32 =
false;
453 bool CRYPTOPP_SECTION_INIT g_hasAES =
false;
454 bool CRYPTOPP_SECTION_INIT g_hasSHA1 =
false;
455 bool CRYPTOPP_SECTION_INIT g_hasSHA2 =
false;
456 bool CRYPTOPP_SECTION_INIT g_hasSHA512 =
false;
457 bool CRYPTOPP_SECTION_INIT g_hasSHA3 =
false;
458 bool CRYPTOPP_SECTION_INIT g_hasSM3 =
false;
459 bool CRYPTOPP_SECTION_INIT g_hasSM4 =
false;
460 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
475 extern bool CPU_ProbeARMv7();
476 extern bool CPU_ProbeNEON();
477 extern bool CPU_ProbeCRC32();
478 extern bool CPU_ProbeAES();
479 extern bool CPU_ProbeSHA1();
480 extern bool CPU_ProbeSHA2();
481 extern bool CPU_ProbeSHA512();
482 extern bool CPU_ProbeSHA3();
483 extern bool CPU_ProbeSM3();
484 extern bool CPU_ProbeSM4();
485 extern bool CPU_ProbePMULL();
489 # define HWCAP_ARMv7 (1 << 29) 492 # define HWCAP_ASIMD (1 << 1) 494 #ifndef HWCAP_ARM_NEON 495 # define HWCAP_ARM_NEON 4096 498 # define HWCAP_CRC32 (1 << 7) 501 # define HWCAP2_CRC32 (1 << 4) 504 # define HWCAP_PMULL (1 << 4) 507 # define HWCAP2_PMULL (1 << 1) 510 # define HWCAP_AES (1 << 3) 513 # define HWCAP2_AES (1 << 0) 516 # define HWCAP_SHA1 (1 << 5) 519 # define HWCAP_SHA2 (1 << 6) 522 # define HWCAP2_SHA1 (1 << 2) 525 # define HWCAP2_SHA2 (1 << 3) 528 # define HWCAP_SHA3 (1 << 17) 531 # define HWCAP_SM3 (1 << 18) 534 # define HWCAP_SM4 (1 << 19) 537 # define HWCAP_SHA512 (1 << 21) 540 inline bool CPU_QueryARMv7()
542 #if defined(__aarch32__) || defined(__aarch64__) 545 #elif defined(__ANDROID__) && defined(__arm__) 546 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
547 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
549 #elif defined(__linux__) && defined(__arm__) 550 if ((getauxval(AT_HWCAP) & HWCAP_ARMv7) != 0)
552 #elif defined(__APPLE__) && defined(__arm__) 559 inline bool CPU_QueryNEON()
561 #if defined(__ANDROID__) && defined(__aarch64__) 562 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
563 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
565 #elif defined(__ANDROID__) && defined(__arm__) 566 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
567 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
569 #elif defined(__linux__) && defined(__aarch64__) 570 if ((getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0)
572 #elif defined(__linux__) && defined(__aarch32__) 573 if ((getauxval(AT_HWCAP2) & HWCAP2_ASIMD) != 0)
575 #elif defined(__linux__) && defined(__arm__) 576 if ((getauxval(AT_HWCAP) & HWCAP_ARM_NEON) != 0)
578 #elif defined(__APPLE__) && defined(__aarch64__) 585 inline bool CPU_QueryCRC32()
587 #if defined(__ANDROID__) && defined(__aarch64__) 588 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
589 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) != 0))
591 #elif defined(__ANDROID__) && defined(__aarch32__) 592 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
593 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32) != 0))
595 #elif defined(__linux__) && defined(__aarch64__) 596 if ((getauxval(AT_HWCAP) & HWCAP_CRC32) != 0)
598 #elif defined(__linux__) && defined(__aarch32__) 599 if ((getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0)
601 #elif defined(__APPLE__) && defined(__aarch64__) 608 inline bool CPU_QueryPMULL()
610 #if defined(__ANDROID__) && defined(__aarch64__) 611 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
612 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) != 0))
614 #elif defined(__ANDROID__) && defined(__aarch32__) 615 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
616 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL) != 0))
618 #elif defined(__linux__) && defined(__aarch64__) 619 if ((getauxval(AT_HWCAP) & HWCAP_PMULL) != 0)
621 #elif defined(__linux__) && defined(__aarch32__) 622 if ((getauxval(AT_HWCAP2) & HWCAP2_PMULL) != 0)
624 #elif defined(__APPLE__) && defined(__aarch64__) 631 inline bool CPU_QueryAES()
633 #if defined(__ANDROID__) && defined(__aarch64__) 634 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
635 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) != 0))
637 #elif defined(__ANDROID__) && defined(__aarch32__) 638 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
639 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES) != 0))
641 #elif defined(__linux__) && defined(__aarch64__) 642 if ((getauxval(AT_HWCAP) & HWCAP_AES) != 0)
644 #elif defined(__linux__) && defined(__aarch32__) 645 if ((getauxval(AT_HWCAP2) & HWCAP2_AES) != 0)
647 #elif defined(__APPLE__) && defined(__aarch64__) 648 unsigned int device, version;
649 GetAppleMachineInfo(device, version);
650 return IsAppleMachineARMv8(device, version);
655 inline bool CPU_QuerySHA1()
657 #if defined(__ANDROID__) && defined(__aarch64__) 658 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
659 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) != 0))
661 #elif defined(__ANDROID__) && defined(__aarch32__) 662 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
663 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1) != 0))
665 #elif defined(__linux__) && defined(__aarch64__) 666 if ((getauxval(AT_HWCAP) & HWCAP_SHA1) != 0)
668 #elif defined(__linux__) && defined(__aarch32__) 669 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA1) != 0)
671 #elif defined(__APPLE__) && defined(__aarch64__) 672 unsigned int device, version;
673 GetAppleMachineInfo(device, version);
674 return IsAppleMachineARMv8(device, version);
679 inline bool CPU_QuerySHA2()
681 #if defined(__ANDROID__) && defined(__aarch64__) 682 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
683 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) != 0))
685 #elif defined(__ANDROID__) && defined(__aarch32__) 686 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
687 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2) != 0))
689 #elif defined(__linux__) && defined(__aarch64__) 690 if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
692 #elif defined(__linux__) && defined(__aarch32__) 693 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA2) != 0)
695 #elif defined(__APPLE__) && defined(__aarch64__) 696 unsigned int device, version;
697 GetAppleMachineInfo(device, version);
698 return IsAppleMachineARMv8(device, version);
703 inline bool CPU_QuerySHA512()
706 #if defined(__ANDROID__) && defined(__aarch64__) && 0 707 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
708 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA512) != 0))
710 #elif defined(__ANDROID__) && defined(__aarch32__) && 0 711 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
712 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA512) != 0))
714 #elif defined(__linux__) && defined(__aarch64__) 715 if ((getauxval(AT_HWCAP) & HWCAP_SHA512) != 0)
717 #elif defined(__linux__) && defined(__aarch32__) 718 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA512) != 0)
720 #elif defined(__APPLE__) && defined(__aarch64__) && 0 721 unsigned int device, version;
722 GetAppleMachineInfo(device, version);
723 return IsAppleMachineARMv84(device, version);
728 inline bool CPU_QuerySHA3()
731 #if defined(__ANDROID__) && defined(__aarch64__) && 0 732 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
733 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA3) != 0))
735 #elif defined(__ANDROID__) && defined(__aarch32__) && 0 736 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
737 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA3) != 0))
739 #elif defined(__linux__) && defined(__aarch64__) 740 if ((getauxval(AT_HWCAP) & HWCAP_SHA3) != 0)
742 #elif defined(__linux__) && defined(__aarch32__) 743 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA3) != 0)
745 #elif defined(__APPLE__) && defined(__aarch64__) && 0 746 unsigned int device, version;
747 GetAppleMachineInfo(device, version);
748 return IsAppleMachineARMv84(device, version);
753 inline bool CPU_QuerySM3()
756 #if defined(__ANDROID__) && defined(__aarch64__) && 0 757 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
758 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM3) != 0))
760 #elif defined(__ANDROID__) && defined(__aarch32__) && 0 761 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
762 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM3) != 0))
764 #elif defined(__linux__) && defined(__aarch64__) 765 if ((getauxval(AT_HWCAP) & HWCAP_SM3) != 0)
767 #elif defined(__linux__) && defined(__aarch32__) 768 if ((getauxval(AT_HWCAP2) & HWCAP2_SM3) != 0)
770 #elif defined(__APPLE__) && defined(__aarch64__) && 0 771 unsigned int device, version;
772 GetAppleMachineInfo(device, version);
773 return IsAppleMachineARMv84(device, version);
778 inline bool CPU_QuerySM4()
781 #if defined(__ANDROID__) && defined(__aarch64__) && 0 782 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
783 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM4) != 0))
785 #elif defined(__ANDROID__) && defined(__aarch32__) && 0 786 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
787 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM4) != 0))
789 #elif defined(__linux__) && defined(__aarch64__) 790 if ((getauxval(AT_HWCAP) & HWCAP_SM4) != 0)
792 #elif defined(__linux__) && defined(__aarch32__) 793 if ((getauxval(AT_HWCAP2) & HWCAP2_SM4) != 0)
795 #elif defined(__APPLE__) && defined(__aarch64__) && 0 796 unsigned int device, version;
797 GetAppleMachineInfo(device, version);
798 return IsAppleMachineARMv84(device, version);
803 void DetectArmFeatures()
807 g_hasARMv7 = CPU_QueryARMv7() || CPU_ProbeARMv7();
808 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
809 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
810 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
811 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
812 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
813 g_hasSHA2 = CPU_QuerySHA2() || CPU_ProbeSHA2();
814 g_hasSHA512 = CPU_QuerySHA512();
815 g_hasSHA3 = CPU_QuerySHA3();
816 g_hasSM3 = CPU_QuerySM3();
817 g_hasSM4 = CPU_QuerySM4();
819 #if defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 822 int cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
823 if (cacheLineSize > 0)
824 g_cacheLineSize = cacheLineSize;
827 *
const_cast<volatile bool*
>(&g_ArmDetectionDone) =
true;
832 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) 834 bool CRYPTOPP_SECTION_INIT g_PowerpcDetectionDone =
false;
835 bool CRYPTOPP_SECTION_INIT g_hasAltivec =
false;
836 bool CRYPTOPP_SECTION_INIT g_hasPower7 =
false;
837 bool CRYPTOPP_SECTION_INIT g_hasPower8 =
false;
838 bool CRYPTOPP_SECTION_INIT g_hasPower9 =
false;
839 bool CRYPTOPP_SECTION_INIT g_hasAES =
false;
840 bool CRYPTOPP_SECTION_INIT g_hasPMULL =
false;
841 bool CRYPTOPP_SECTION_INIT g_hasSHA256 =
false;
842 bool CRYPTOPP_SECTION_INIT g_hasSHA512 =
false;
843 bool CRYPTOPP_SECTION_INIT g_hasDARN =
false;
844 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
846 extern bool CPU_ProbeAltivec();
847 extern bool CPU_ProbePower7();
848 extern bool CPU_ProbePower8();
849 extern bool CPU_ProbePower9();
850 extern bool CPU_ProbeAES();
851 extern bool CPU_ProbePMULL();
852 extern bool CPU_ProbeSHA256();
853 extern bool CPU_ProbeSHA512();
854 extern bool CPU_ProbeDARN();
858 #ifndef PPC_FEATURE_HAS_ALTIVEC 859 # define PPC_FEATURE_HAS_ALTIVEC 0x10000000 861 #ifndef PPC_FEATURE_ARCH_2_06 862 # define PPC_FEATURE_ARCH_2_06 0x00000100 864 #ifndef PPC_FEATURE2_ARCH_2_07 865 # define PPC_FEATURE2_ARCH_2_07 0x80000000 867 #ifndef PPC_FEATURE2_ARCH_3_00 868 # define PPC_FEATURE2_ARCH_3_00 0x00800000 870 #ifndef PPC_FEATURE2_VEC_CRYPTO 871 # define PPC_FEATURE2_VEC_CRYPTO 0x02000000 878 #ifndef __power_6_andup 879 # define __power_6_andup() __power_set(0xffffffffU<<14) 881 #ifndef __power_7_andup 882 # define __power_7_andup() __power_set(0xffffffffU<<15) 884 #ifndef __power_8_andup 885 # define __power_8_andup() __power_set(0xffffffffU<<16) 887 #ifndef __power_9_andup 888 # define __power_9_andup() __power_set(0xffffffffU<<17) 893 inline bool CPU_QueryAltivec()
895 #if defined(__linux__) 896 if ((getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC) != 0)
899 if (__power_6_andup() != 0)
901 #elif defined(__APPLE__) && defined(__POWERPC__) 902 unsigned int device, version;
903 GetAppleMachineInfo(device, version);
904 return device == PowerMac;
909 inline bool CPU_QueryPower7()
912 #if defined(__linux__) 913 if ((getauxval(AT_HWCAP) & PPC_FEATURE_ARCH_2_06) != 0)
916 if (__power_7_andup() != 0)
922 inline bool CPU_QueryPower8()
925 #if defined(__linux__) 926 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) != 0)
929 if (__power_8_andup() != 0)
935 inline bool CPU_QueryPower9()
938 #if defined(__linux__) 939 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
942 if (__power_9_andup() != 0)
948 inline bool CPU_QueryAES()
952 #if defined(__linux__) 953 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
956 if (__power_8_andup() != 0)
962 inline bool CPU_QueryPMULL()
966 #if defined(__linux__) 967 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
970 if (__power_8_andup() != 0)
976 inline bool CPU_QuerySHA256()
980 #if defined(__linux__) 981 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
984 if (__power_8_andup() != 0)
989 inline bool CPU_QuerySHA512()
993 #if defined(__linux__) 994 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
997 if (__power_8_andup() != 0)
1004 inline bool CPU_QueryDARN()
1007 #if defined(__linux__) 1008 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1011 if (__power_9_andup() != 0)
1017 void DetectPowerpcFeatures()
1021 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
1022 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
1023 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
1024 g_hasPower9 = CPU_QueryPower9() || CPU_ProbePower9();
1025 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1026 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1027 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1028 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
1029 g_hasDARN = CPU_QueryDARN() || CPU_ProbeDARN();
1031 #if defined(_AIX) && defined(SC_L1C_DLS) 1033 int cacheLineSize = getsystemcfg(SC_L1C_DLS);
1034 if (cacheLineSize > 0)
1035 g_cacheLineSize = cacheLineSize;
1036 #elif defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 1039 int cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1040 if (cacheLineSize > 0)
1041 g_cacheLineSize = cacheLineSize;
1044 *
const_cast<volatile bool*
>(&g_PowerpcDetectionDone) =
true;
1052 ANONYMOUS_NAMESPACE_BEGIN
1059 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 1060 CryptoPP::DetectX86Features();
1061 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8 1062 CryptoPP::DetectArmFeatures();
1063 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64 1064 CryptoPP::DetectPowerpcFeatures();
1073 #if HAVE_GCC_INIT_PRIORITY 1074 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
1075 #elif HAVE_MSC_INIT_PRIORITY 1076 #pragma warning(disable: 4075) 1077 #pragma init_seg(".CRT$XCU") 1078 const InitCpu s_init;
1079 #pragma warning(default: 4075) 1080 #elif HAVE_XLC_INIT_PRIORITY 1082 #pragma priority(270) 1083 const InitCpu s_init;
1085 const InitCpu s_init;
1088 ANONYMOUS_NAMESPACE_END
1090 #endif // CRYPTOPP_IMPORTS Utility functions for the Crypto++ library.
Library configuration file.
Functions for CPU features and intrinsics.
Crypto++ library namespace.