7 #ifndef EXCEPTION_EXECUTE_HANDLER
8 # define EXCEPTION_EXECUTE_HANDLER 1
11 #ifndef CRYPTOPP_IMPORTS
19 #if _MSC_VER >= 1600 && (defined(_M_IX86) || defined(_M_X64))
20 # include <immintrin.h>
24 # include <sys/systemcfg.h>
33 #if (((__GLIBC__ * 100) + __GLIBC_MINOR__) >= 216)
34 # define CRYPTOPP_GETAUXV_AVAILABLE 1
37 #if CRYPTOPP_GETAUXV_AVAILABLE
38 # include <sys/auxv.h>
46 unsigned long int getauxval(
unsigned long int) {
return 0; }
49 #if defined(__APPLE__)
50 # include <sys/utsname.h>
57 #if defined(__ANDROID__)
58 # include "cpu-features.h"
61 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
68 #if defined(_MSC_VER) && defined(_M_X64)
69 extern "C" unsigned long long __fastcall XGETBV64(
unsigned int);
70 extern "C" unsigned long long __fastcall CPUID64(
unsigned int,
unsigned int,
unsigned int*);
73 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
75 typedef void (*SigHandler)(int);
80 static jmp_buf s_jmpNoCPUID;
81 static void SigIllHandler(
int)
83 longjmp(s_jmpNoCPUID, 1);
86 #endif // CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
88 ANONYMOUS_NAMESPACE_BEGIN
90 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
94 inline bool IsIntel(
const word32 output[4])
97 return (output[1] == 0x756e6547) &&
98 (output[2] == 0x6c65746e) &&
99 (output[3] == 0x49656e69);
102 inline bool IsAMD(
const word32 output[4])
105 return ((output[1] == 0x68747541) &&
106 (output[2] == 0x444D4163) &&
107 (output[3] == 0x69746E65)) ||
109 ((output[1] == 0x69444d41) &&
110 (output[2] == 0x74656273) &&
111 (output[3] == 0x21726574));
114 inline bool IsHygon(
const word32 output[4])
117 return (output[1] == 0x6f677948) &&
118 (output[2] == 0x656e6975) &&
119 (output[3] == 0x6e65476e);
122 inline bool IsVIA(
const word32 output[4])
125 return ((output[1] == 0x746e6543) &&
126 (output[2] == 0x736c7561) &&
127 (output[3] == 0x48727561)) ||
129 ((output[1] == 0x32414956) &&
130 (output[2] == 0x32414956) &&
131 (output[3] == 0x32414956));
134 #endif // X86, X32 and X64
136 #if defined(__APPLE__)
139 class AppleMachineInfo
142 enum { PowerMac=1, Mac, iPhone, iPod, iPad, AppleTV, AppleWatch };
143 enum { PowerPC=1, I386, I686, X86_64, ARM32, ARMV8, ARMV84 };
145 AppleMachineInfo() : m_device(0), m_version(0), m_arch(0)
147 struct utsname systemInfo;
148 systemInfo.machine[0] =
'\0';
151 std::string machine(systemInfo.machine);
153 std::string::size_type pos = machine.find_first_of(
"0123456789");
154 if (pos != std::string::npos)
155 m_version = std::atoi(machine.substr(pos).c_str());
157 if (machine.find(
"iPhone") != std::string::npos)
160 if (m_version >= 6) { m_arch = ARMV8; }
161 else { m_arch = ARM32; }
163 else if (machine.find(
"iPod") != std::string::npos)
166 if (m_version >= 6) { m_arch = ARMV8; }
167 else { m_arch = ARM32; }
169 else if (machine.find(
"iPad") != std::string::npos)
172 if (m_version >= 5) { m_arch = ARMV8; }
173 else { m_arch = ARM32; }
175 else if (machine.find(
"PowerMac") != std::string::npos ||
176 machine.find(
"Power Macintosh") != std::string::npos)
181 else if (machine.find(
"Mac") != std::string::npos ||
182 machine.find(
"Macintosh") != std::string::npos)
184 #if defined(__x86_64) || defined(__amd64)
187 #elif defined(__i386)
190 #elif defined(__i686)
199 else if (machine.find(
"AppleTV") != std::string::npos)
202 if (m_version >= 4) { m_arch = ARMV8; }
203 else { m_arch = ARM32; }
205 else if (machine.find(
"AppleWatch") != std::string::npos)
207 m_device = AppleWatch;
208 if (m_version >= 4) { m_arch = ARMV8; }
209 else { m_arch = ARM32; }
211 else if (machine.find(
"arm64") != std::string::npos)
218 unsigned int Device()
const {
222 unsigned int Version()
const {
226 unsigned int Arch()
const {
230 bool IsARM32()
const {
231 return m_arch == ARM32;
234 bool IsARMv8()
const {
235 return m_arch == ARMV8;
238 bool IsARMv84()
const {
239 return m_arch == ARMV84;
243 unsigned int m_device, m_version, m_arch;
246 void GetAppleMachineInfo(
unsigned int& device,
unsigned int& version,
unsigned int& arch)
248 #if CRYPTOPP_CXX11_STATIC_INIT
249 static const AppleMachineInfo info;
251 using CryptoPP::Singleton;
255 device = info.Device();
256 version = info.Version();
260 inline bool IsAppleMachineARM32()
262 static unsigned int arch;
266 GetAppleMachineInfo(unused, unused, arch);
268 return arch == AppleMachineInfo::ARM32;
271 inline bool IsAppleMachineARMv8()
273 static unsigned int arch;
277 GetAppleMachineInfo(unused, unused, arch);
279 return arch == AppleMachineInfo::ARMV8;
284 ANONYMOUS_NAMESPACE_END
290 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
315 extern bool CPU_ProbeSSE2();
324 #if defined(_MSC_VER) && (_MSC_FULL_VER >= 160040219)
329 #elif defined(_MSC_VER) && defined(_M_X64)
331 return XGETBV64(num);
334 #elif defined(_MSC_VER) && defined(_M_IX86)
351 return (
static_cast<word64>(d) << 32) | a;
354 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
359 "xgetbv" :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
361 return (
static_cast<word64>(d) << 32) | a;
364 #elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC)
371 ".byte 0x0f, 0x01, 0xd0" "\n\t"
372 :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
374 return (
static_cast<word64>(d) << 32) | a;
376 # error "Need an xgetbv function"
385 #if defined(_MSC_VER) && (_MSC_VER >= 1600)
387 __cpuidex((
int *)output, func, subfunc);
391 #elif defined(_MSC_VER) && defined(_M_X64)
393 CPUID64(func, subfunc, output);
397 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__BORLANDC__)
421 __except (EXCEPTION_EXECUTE_HANDLER)
433 volatile bool result =
true;
435 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
436 if (oldHandler == SIG_ERR)
440 volatile sigset_t oldMask;
441 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
443 signal(SIGILL, oldHandler);
448 if (setjmp(s_jmpNoCPUID))
455 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
456 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
458 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
460 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
461 :
"a" (func),
"c" (subfunc)
467 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
470 signal(SIGILL, oldHandler);
475 void DetectX86Features()
479 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
481 #if defined(CRYPTOPP_DISABLE_ASM)
485 if (!CpuId(0, 0, cpuid0))
487 if (!CpuId(1, 0, cpuid1))
491 CRYPTOPP_CONSTANT(EAX_REG = 0);
492 CRYPTOPP_CONSTANT(EBX_REG = 1);
493 CRYPTOPP_CONSTANT(ECX_REG = 2);
494 CRYPTOPP_CONSTANT(EDX_REG = 3);
496 CRYPTOPP_CONSTANT(MMX_FLAG = (1 << 24));
497 CRYPTOPP_CONSTANT(SSE_FLAG = (1 << 25));
498 CRYPTOPP_CONSTANT(SSE2_FLAG = (1 << 26));
500 CRYPTOPP_CONSTANT(SSE3_FLAG = (1 << 0));
501 CRYPTOPP_CONSTANT(SSSE3_FLAG = (1 << 9));
502 CRYPTOPP_CONSTANT(SSE41_FLAG = (1 << 19));
503 CRYPTOPP_CONSTANT(SSE42_FLAG = (1 << 20));
504 CRYPTOPP_CONSTANT(MOVBE_FLAG = (1 << 22));
505 CRYPTOPP_CONSTANT(AESNI_FLAG = (1 << 25));
506 CRYPTOPP_CONSTANT(CLMUL_FLAG = (1 << 1));
508 CRYPTOPP_CONSTANT(XSAVE_FLAG = (1 << 26));
509 CRYPTOPP_CONSTANT(OSXSAVE_FLAG = (1 << 27));
511 CRYPTOPP_CONSTANT(AVX_FLAG = (3 << 27));
512 CRYPTOPP_CONSTANT(YMM_FLAG = (3 << 1));
516 CRYPTOPP_UNUSED(MMX_FLAG); CRYPTOPP_UNUSED(SSE_FLAG);
517 CRYPTOPP_UNUSED(SSE3_FLAG); CRYPTOPP_UNUSED(XSAVE_FLAG);
519 #if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
522 g_hasSSE2 = (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
528 if ((cpuid1[EDX_REG] & SSE2_FLAG) == SSE2_FLAG)
529 g_hasSSE2 = (cpuid1[ECX_REG] & XSAVE_FLAG) != 0 &&
530 (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
535 if (g_hasSSE2 ==
false)
536 g_hasSSE2 = CPU_ProbeSSE2();
538 if (g_hasSSE2 ==
false)
541 g_hasSSSE3 = (cpuid1[ECX_REG] & SSSE3_FLAG) != 0;
542 g_hasSSE41 = (cpuid1[ECX_REG] & SSE41_FLAG) != 0;
543 g_hasSSE42 = (cpuid1[ECX_REG] & SSE42_FLAG) != 0;
544 g_hasMOVBE = (cpuid1[ECX_REG] & MOVBE_FLAG) != 0;
545 g_hasAESNI = (cpuid1[ECX_REG] & AESNI_FLAG) != 0;
546 g_hasCLMUL = (cpuid1[ECX_REG] & CLMUL_FLAG) != 0;
551 if ((cpuid1[ECX_REG] & AVX_FLAG) == AVX_FLAG)
554 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
559 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
560 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
561 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
562 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
563 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
565 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
566 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
567 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
569 if (cpuid0[EAX_REG] >= 7)
571 if (CpuId(7, 0, cpuid2))
573 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
574 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
575 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
576 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
580 else if (IsAMD(cpuid0) || IsHygon(cpuid0))
582 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
583 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
584 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
585 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
586 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
588 CpuId(0x80000005, 0, cpuid2);
589 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
590 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
592 if (cpuid0[EAX_REG] >= 7)
594 if (CpuId(7, 0, cpuid2))
596 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
597 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
598 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
599 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
608 CRYPTOPP_CONSTANT(FAMILY_BASE_FLAG = (0x0f << 8));
609 CRYPTOPP_CONSTANT(FAMILY_EXT_FLAG = (0xff << 20));
611 word32 family = (cpuid1[0] & FAMILY_BASE_FLAG) >> 8;
613 family += (cpuid1[0] & FAMILY_EXT_FLAG) >> 20;
614 if (family == 0x15 || family == 0x16)
621 else if (IsVIA(cpuid0))
624 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2));
625 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6));
626 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8));
627 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10));
628 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12));
630 CpuId(0xC0000000, 0, cpuid2);
631 word32 extendedFeatures = cpuid2[0];
633 if (extendedFeatures >= 0xC0000001)
635 CpuId(0xC0000001, 0, cpuid2);
636 g_hasPadlockRNG = (cpuid2[EDX_REG] & RNG_FLAGS) != 0;
637 g_hasPadlockACE = (cpuid2[EDX_REG] & ACE_FLAGS) != 0;
638 g_hasPadlockACE2 = (cpuid2[EDX_REG] & ACE2_FLAGS) != 0;
639 g_hasPadlockPHE = (cpuid2[EDX_REG] & PHE_FLAGS) != 0;
640 g_hasPadlockPMM = (cpuid2[EDX_REG] & PMM_FLAGS) != 0;
643 if (extendedFeatures >= 0xC0000005)
645 CpuId(0xC0000005, 0, cpuid2);
646 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
652 g_hasAVX2 &= g_hasAVX;
656 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
659 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
660 if (g_cacheLineSize == 0 && cacheLineSize > 0)
661 g_cacheLineSize = cacheLineSize;
664 if (g_cacheLineSize == 0)
667 *
const_cast<volatile bool*
>(&g_x86DetectionDone) =
true;
672 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8)
702 extern bool CPU_ProbeARMv7();
703 extern bool CPU_ProbeNEON();
704 extern bool CPU_ProbeCRC32();
705 extern bool CPU_ProbeAES();
706 extern bool CPU_ProbeSHA1();
707 extern bool CPU_ProbeSHA256();
708 extern bool CPU_ProbeSHA512();
709 extern bool CPU_ProbeSHA3();
710 extern bool CPU_ProbeSM3();
711 extern bool CPU_ProbeSM4();
712 extern bool CPU_ProbePMULL();
717 # define HWCAP_ARMv7 (1 << 29)
720 # define HWCAP_ASIMD (1 << 1)
723 # define HWCAP_NEON (1 << 12)
726 # define HWCAP_CRC32 (1 << 7)
729 # define HWCAP2_CRC32 (1 << 4)
732 # define HWCAP_PMULL (1 << 4)
735 # define HWCAP2_PMULL (1 << 1)
738 # define HWCAP_AES (1 << 3)
741 # define HWCAP2_AES (1 << 0)
744 # define HWCAP_SHA1 (1 << 5)
747 # define HWCAP_SHA2 (1 << 6)
750 # define HWCAP2_SHA1 (1 << 2)
753 # define HWCAP2_SHA2 (1 << 3)
756 # define HWCAP_SHA3 (1 << 17)
759 # define HWCAP_SM3 (1 << 18)
762 # define HWCAP_SM4 (1 << 19)
765 # define HWCAP_SHA512 (1 << 21)
768 inline bool CPU_QueryARMv7()
770 #if defined(__ANDROID__) && defined(__arm__)
771 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
772 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
774 #elif defined(__linux__) && defined(__arm__)
775 if ((getauxval(AT_HWCAP) & HWCAP_ARMv7) != 0 ||
776 (getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
778 #elif defined(__APPLE__) && defined(__arm__)
785 inline bool CPU_QueryNEON()
787 #if defined(__ANDROID__) && defined(__aarch64__)
788 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
789 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
791 #elif defined(__ANDROID__) && defined(__arm__)
792 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
793 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
795 #elif defined(__linux__) && defined(__aarch64__)
796 if ((getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0)
798 #elif defined(__linux__) && defined(__aarch32__)
799 if ((getauxval(AT_HWCAP2) & HWCAP2_ASIMD) != 0)
801 #elif defined(__linux__) && defined(__arm__)
802 if ((getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
804 #elif defined(__APPLE__) && defined(__aarch64__)
811 inline bool CPU_QueryCRC32()
813 #if defined(__ANDROID__) && defined(__aarch64__)
814 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
815 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) != 0))
817 #elif defined(__ANDROID__) && defined(__aarch32__)
818 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
819 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32) != 0))
821 #elif defined(__linux__) && defined(__aarch64__)
822 if ((getauxval(AT_HWCAP) & HWCAP_CRC32) != 0)
824 #elif defined(__linux__) && defined(__aarch32__)
825 if ((getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0)
827 #elif defined(__APPLE__) && defined(__aarch64__)
834 inline bool CPU_QueryPMULL()
836 #if defined(__ANDROID__) && defined(__aarch64__)
837 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
838 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) != 0))
840 #elif defined(__ANDROID__) && defined(__aarch32__)
841 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
842 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL) != 0))
844 #elif defined(__linux__) && defined(__aarch64__)
845 if ((getauxval(AT_HWCAP) & HWCAP_PMULL) != 0)
847 #elif defined(__linux__) && defined(__aarch32__)
848 if ((getauxval(AT_HWCAP2) & HWCAP2_PMULL) != 0)
850 #elif defined(__APPLE__) && defined(__aarch64__)
857 inline bool CPU_QueryAES()
859 #if defined(__ANDROID__) && defined(__aarch64__)
860 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
861 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) != 0))
863 #elif defined(__ANDROID__) && defined(__aarch32__)
864 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
865 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES) != 0))
867 #elif defined(__linux__) && defined(__aarch64__)
868 if ((getauxval(AT_HWCAP) & HWCAP_AES) != 0)
870 #elif defined(__linux__) && defined(__aarch32__)
871 if ((getauxval(AT_HWCAP2) & HWCAP2_AES) != 0)
873 #elif defined(__APPLE__) && defined(__aarch64__)
874 return IsAppleMachineARMv8();
879 inline bool CPU_QuerySHA1()
881 #if defined(__ANDROID__) && defined(__aarch64__)
882 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
883 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) != 0))
885 #elif defined(__ANDROID__) && defined(__aarch32__)
886 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
887 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1) != 0))
889 #elif defined(__linux__) && defined(__aarch64__)
890 if ((getauxval(AT_HWCAP) & HWCAP_SHA1) != 0)
892 #elif defined(__linux__) && defined(__aarch32__)
893 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA1) != 0)
895 #elif defined(__APPLE__) && defined(__aarch64__)
896 return IsAppleMachineARMv8();
901 inline bool CPU_QuerySHA256()
903 #if defined(__ANDROID__) && defined(__aarch64__)
904 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
905 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) != 0))
907 #elif defined(__ANDROID__) && defined(__aarch32__)
908 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
909 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2) != 0))
911 #elif defined(__linux__) && defined(__aarch64__)
912 if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
914 #elif defined(__linux__) && defined(__aarch32__)
915 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA2) != 0)
917 #elif defined(__APPLE__) && defined(__aarch64__)
918 return IsAppleMachineARMv8();
923 inline bool CPU_QuerySHA512()
926 #if defined(__ANDROID__) && defined(__aarch64__) && 0
927 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
928 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA512) != 0))
930 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
931 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
932 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA512) != 0))
934 #elif defined(__linux__) && defined(__aarch64__)
935 if ((getauxval(AT_HWCAP) & HWCAP_SHA512) != 0)
937 #elif defined(__linux__) && defined(__aarch32__)
938 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA512) != 0)
940 #elif defined(__APPLE__) && defined(__aarch64__) && 0
946 inline bool CPU_QuerySHA3()
949 #if defined(__ANDROID__) && defined(__aarch64__) && 0
950 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
951 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA3) != 0))
953 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
954 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
955 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA3) != 0))
957 #elif defined(__linux__) && defined(__aarch64__)
958 if ((getauxval(AT_HWCAP) & HWCAP_SHA3) != 0)
960 #elif defined(__linux__) && defined(__aarch32__)
961 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA3) != 0)
963 #elif defined(__APPLE__) && defined(__aarch64__) && 0
969 inline bool CPU_QuerySM3()
972 #if defined(__ANDROID__) && defined(__aarch64__) && 0
973 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
974 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM3) != 0))
976 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
977 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
978 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM3) != 0))
980 #elif defined(__linux__) && defined(__aarch64__)
981 if ((getauxval(AT_HWCAP) & HWCAP_SM3) != 0)
983 #elif defined(__linux__) && defined(__aarch32__)
984 if ((getauxval(AT_HWCAP2) & HWCAP2_SM3) != 0)
986 #elif defined(__APPLE__) && defined(__aarch64__) && 0
992 inline bool CPU_QuerySM4()
995 #if defined(__ANDROID__) && defined(__aarch64__) && 0
996 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
997 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM4) != 0))
999 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1000 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1001 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM4) != 0))
1003 #elif defined(__linux__) && defined(__aarch64__)
1004 if ((getauxval(AT_HWCAP) & HWCAP_SM4) != 0)
1006 #elif defined(__linux__) && defined(__aarch32__)
1007 if ((getauxval(AT_HWCAP2) & HWCAP2_SM4) != 0)
1009 #elif defined(__APPLE__) && defined(__aarch64__) && 0
1015 void DetectArmFeatures()
1019 g_hasARMv7 = CPU_QueryARMv7() || CPU_ProbeARMv7();
1020 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
1021 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
1022 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1023 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1024 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
1025 g_hasSHA2 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1026 g_hasSHA512 = CPU_QuerySHA512();
1027 g_hasSHA3 = CPU_QuerySHA3();
1028 g_hasSM3 = CPU_QuerySM3();
1029 g_hasSM4 = CPU_QuerySM4();
1031 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
1034 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1035 if (cacheLineSize > 0)
1036 g_cacheLineSize = cacheLineSize;
1039 if (g_cacheLineSize == 0)
1042 *
const_cast<volatile bool*
>(&g_ArmDetectionDone) =
true;
1047 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
1061 extern bool CPU_ProbeAltivec();
1062 extern bool CPU_ProbePower7();
1063 extern bool CPU_ProbePower8();
1064 extern bool CPU_ProbePower9();
1065 extern bool CPU_ProbeAES();
1066 extern bool CPU_ProbePMULL();
1067 extern bool CPU_ProbeSHA256();
1068 extern bool CPU_ProbeSHA512();
1069 extern bool CPU_ProbeDARN();
1075 #ifndef __power_6_andup
1076 # define __power_6_andup() __power_set(0xffffffffU<<14)
1078 #ifndef __power_7_andup
1079 # define __power_7_andup() __power_set(0xffffffffU<<15)
1081 #ifndef __power_8_andup
1082 # define __power_8_andup() __power_set(0xffffffffU<<16)
1084 #ifndef __power_9_andup
1085 # define __power_9_andup() __power_set(0xffffffffU<<17)
1090 inline bool CPU_QueryAltivec()
1092 #if defined(__linux__) && defined(PPC_FEATURE_HAS_ALTIVEC)
1093 if ((getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC) != 0)
1096 if (__power_6_andup() != 0)
1098 #elif defined(__APPLE__) && defined(__POWERPC__)
1099 unsigned int unused, arch;
1100 GetAppleMachineInfo(unused, unused, arch);
1101 return arch == AppleMachineInfo::PowerMac;
1106 inline bool CPU_QueryPower7()
1109 #if defined(__linux__) && defined(PPC_FEATURE_ARCH_2_06)
1110 if ((getauxval(AT_HWCAP) & PPC_FEATURE_ARCH_2_06) != 0)
1113 if (__power_7_andup() != 0)
1119 inline bool CPU_QueryPower8()
1122 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_2_07)
1123 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) != 0)
1126 if (__power_8_andup() != 0)
1132 inline bool CPU_QueryPower9()
1135 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1136 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1139 if (__power_9_andup() != 0)
1145 inline bool CPU_QueryAES()
1149 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1150 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1153 if (__power_8_andup() != 0)
1159 inline bool CPU_QueryPMULL()
1163 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1164 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1167 if (__power_8_andup() != 0)
1173 inline bool CPU_QuerySHA256()
1177 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1178 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1181 if (__power_8_andup() != 0)
1186 inline bool CPU_QuerySHA512()
1190 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1191 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1194 if (__power_8_andup() != 0)
1201 inline bool CPU_QueryDARN()
1204 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1205 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1208 if (__power_9_andup() != 0)
1214 void DetectPowerpcFeatures()
1225 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
1226 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
1227 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
1228 g_hasPower9 = CPU_QueryPower9() || CPU_ProbePower9();
1229 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1230 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1231 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1232 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
1233 g_hasDARN = CPU_QueryDARN() || CPU_ProbeDARN();
1235 #if defined(_AIX) && defined(SC_L1C_DLS)
1237 int cacheLineSize = getsystemcfg(SC_L1C_DLS);
1238 if (cacheLineSize > 0)
1239 g_cacheLineSize = cacheLineSize;
1240 #elif defined(_SC_LEVEL1_DCACHE_LINESIZE)
1243 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1244 if (cacheLineSize > 0)
1245 g_cacheLineSize = cacheLineSize;
1248 if (g_cacheLineSize == 0)
1251 *
const_cast<volatile bool*
>(&g_PowerpcDetectionDone) =
true;
1259 ANONYMOUS_NAMESPACE_BEGIN
1266 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
1267 CryptoPP::DetectX86Features();
1268 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8
1269 CryptoPP::DetectArmFeatures();
1270 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64
1271 CryptoPP::DetectPowerpcFeatures();
1280 #if HAVE_GCC_INIT_PRIORITY
1281 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
1282 #elif HAVE_MSC_INIT_PRIORITY
1283 #pragma warning(disable: 4075)
1284 #pragma init_seg(".CRT$XCU")
1285 const InitCpu s_init;
1286 #pragma warning(default: 4075)
1287 #elif HAVE_XLC_INIT_PRIORITY
1289 #pragma priority(270)
1290 const InitCpu s_init;
1292 const InitCpu s_init;
1295 ANONYMOUS_NAMESPACE_END
1297 #endif // CRYPTOPP_IMPORTS