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>
51 # include <sys/sysctl.h>
58 #if defined(__ANDROID__)
59 # include "cpu-features.h"
62 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
69 #if defined(_MSC_VER) && defined(_M_X64)
70 extern "C" unsigned long long __fastcall XGETBV64(
unsigned int);
71 extern "C" unsigned long long __fastcall CPUID64(
unsigned int,
unsigned int,
unsigned int*);
74 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
76 typedef void (*SigHandler)(int);
81 static jmp_buf s_jmpNoCPUID;
82 static void SigIllHandler(
int)
84 longjmp(s_jmpNoCPUID, 1);
89 ANONYMOUS_NAMESPACE_BEGIN
91 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
95 inline bool IsIntel(
const word32 output[4])
98 return (output[1] == 0x756e6547) &&
99 (output[2] == 0x6c65746e) &&
100 (output[3] == 0x49656e69);
103 inline bool IsAMD(
const word32 output[4])
106 return ((output[1] == 0x68747541) &&
107 (output[2] == 0x444D4163) &&
108 (output[3] == 0x69746E65)) ||
110 ((output[1] == 0x69444d41) &&
111 (output[2] == 0x74656273) &&
112 (output[3] == 0x21726574));
115 inline bool IsHygon(
const word32 output[4])
118 return (output[1] == 0x6f677948) &&
119 (output[2] == 0x656e6975) &&
120 (output[3] == 0x6e65476e);
123 inline bool IsVIA(
const word32 output[4])
126 return ((output[1] == 0x746e6543) &&
127 (output[2] == 0x736c7561) &&
128 (output[3] == 0x48727561)) ||
130 ((output[1] == 0x32414956) &&
131 (output[2] == 0x32414956) &&
132 (output[3] == 0x32414956));
137 #if defined(__APPLE__)
140 class AppleMachineInfo
143 enum { PowerMac=1, Mac, iPhone, iPod, iPad, AppleTV, AppleWatch };
144 enum { PowerPC=1, I386, I686, X86_64, ARM32, ARMV8, ARMV82, ARMV83 };
146 AppleMachineInfo() : m_device(0), m_version(0), m_arch(0)
148 struct utsname systemInfo;
149 systemInfo.machine[0] =
'\0';
152 std::string machine(systemInfo.machine);
154 std::string::size_type pos = machine.find_first_of(
"0123456789");
155 if (pos != std::string::npos)
156 m_version = std::atoi(machine.substr(pos).c_str());
158 if (machine.find(
"iPhone") != std::string::npos)
161 if (m_version >= 6) { m_arch = ARMV8; }
162 else { m_arch = ARM32; }
164 else if (machine.find(
"iPod") != std::string::npos)
167 if (m_version >= 6) { m_arch = ARMV8; }
168 else { m_arch = ARM32; }
170 else if (machine.find(
"iPad") != std::string::npos)
173 if (m_version >= 5) { m_arch = ARMV8; }
174 else { m_arch = ARM32; }
176 else if (machine.find(
"PowerMac") != std::string::npos ||
177 machine.find(
"Power Macintosh") != std::string::npos)
182 else if (machine.find(
"Mac") != std::string::npos ||
183 machine.find(
"Macintosh") != std::string::npos)
185 #if defined(__x86_64) || defined(__amd64)
188 #elif defined(__i386)
191 #elif defined(__i686)
200 else if (machine.find(
"AppleTV") != std::string::npos)
203 if (m_version >= 4) { m_arch = ARMV8; }
204 else { m_arch = ARM32; }
206 else if (machine.find(
"AppleWatch") != std::string::npos)
208 m_device = AppleWatch;
209 if (m_version >= 4) { m_arch = ARMV8; }
210 else { m_arch = ARM32; }
212 else if (machine.find(
"arm64") != std::string::npos)
218 if (sysctlbyname(
"machdep.cpu.brand_string", NULL, &size, NULL, 0) == 0 && size > 0)
221 if (sysctlbyname(
"machdep.cpu.brand_string", &brand[0], &size, NULL, 0) == 0 && size > 0)
223 if (brand[size-1] ==
'\0')
229 if (brand ==
"Apple M1")
247 unsigned int Device()
const {
255 unsigned int Arch()
const {
259 bool IsARM32()
const {
260 return m_arch == ARM32;
263 bool IsARMv8()
const {
264 return m_arch >= ARMV8;
267 bool IsARMv82()
const {
268 return m_arch >= ARMV82;
271 bool IsARMv83()
const {
272 return m_arch >= ARMV83;
276 unsigned int m_device, m_version, m_arch;
279 void GetAppleMachineInfo(
unsigned int& device,
unsigned int& version,
unsigned int& arch)
281 #if CRYPTOPP_CXX11_STATIC_INIT
282 static const AppleMachineInfo info;
284 using CryptoPP::Singleton;
288 device = info.Device();
289 version = info.Version();
293 inline bool IsAppleMachineARM32()
295 static unsigned int arch;
299 GetAppleMachineInfo(unused, unused, arch);
301 return arch == AppleMachineInfo::ARM32;
304 inline bool IsAppleMachineARMv8()
306 static unsigned int arch;
310 GetAppleMachineInfo(unused, unused, arch);
312 return arch >= AppleMachineInfo::ARMV8;
315 inline bool IsAppleMachineARMv82()
317 static unsigned int arch;
321 GetAppleMachineInfo(unused, unused, arch);
323 return arch >= AppleMachineInfo::ARMV82;
326 inline bool IsAppleMachineARMv83()
328 static unsigned int arch;
332 GetAppleMachineInfo(unused, unused, arch);
334 return arch >= AppleMachineInfo::ARMV83;
339 ANONYMOUS_NAMESPACE_END
345 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
370 extern bool CPU_ProbeSSE2();
379 #if defined(_MSC_VER) && (_MSC_FULL_VER >= 160040219)
384 #elif defined(_MSC_VER) && defined(_M_X64)
386 return XGETBV64(num);
389 #elif defined(_MSC_VER) && defined(_M_IX86)
406 return (
static_cast<word64>(d) << 32) | a;
409 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
414 "xgetbv" :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
416 return (
static_cast<word64>(d) << 32) | a;
419 #elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC)
426 ".byte 0x0f, 0x01, 0xd0" "\n\t"
427 :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
429 return (
static_cast<word64>(d) << 32) | a;
431 # error "Need an xgetbv function"
440 #if defined(_MSC_VER) && (_MSC_VER >= 1600)
442 __cpuidex((
int *)output, func, subfunc);
446 #elif defined(_MSC_VER) && defined(_M_X64)
448 CPUID64(func, subfunc, output);
452 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__BORLANDC__)
476 __except (EXCEPTION_EXECUTE_HANDLER)
488 volatile bool result =
true;
490 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
491 if (oldHandler == SIG_ERR)
495 volatile sigset_t oldMask;
496 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
498 signal(SIGILL, oldHandler);
503 if (setjmp(s_jmpNoCPUID))
510 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
511 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
513 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
515 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
516 :
"a" (func),
"c" (subfunc)
522 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
525 signal(SIGILL, oldHandler);
530 void DetectX86Features()
534 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
536 #if defined(CRYPTOPP_DISABLE_ASM)
540 if (!CpuId(0, 0, cpuid0))
542 if (!CpuId(1, 0, cpuid1))
546 CRYPTOPP_CONSTANT(EAX_REG = 0);
547 CRYPTOPP_CONSTANT(EBX_REG = 1);
548 CRYPTOPP_CONSTANT(ECX_REG = 2);
549 CRYPTOPP_CONSTANT(EDX_REG = 3);
551 CRYPTOPP_CONSTANT(MMX_FLAG = (1 << 24));
552 CRYPTOPP_CONSTANT(SSE_FLAG = (1 << 25));
553 CRYPTOPP_CONSTANT(SSE2_FLAG = (1 << 26));
555 CRYPTOPP_CONSTANT(SSE3_FLAG = (1 << 0));
556 CRYPTOPP_CONSTANT(SSSE3_FLAG = (1 << 9));
557 CRYPTOPP_CONSTANT(SSE41_FLAG = (1 << 19));
558 CRYPTOPP_CONSTANT(SSE42_FLAG = (1 << 20));
559 CRYPTOPP_CONSTANT(MOVBE_FLAG = (1 << 22));
560 CRYPTOPP_CONSTANT(AESNI_FLAG = (1 << 25));
561 CRYPTOPP_CONSTANT(CLMUL_FLAG = (1 << 1));
563 CRYPTOPP_CONSTANT(XSAVE_FLAG = (1 << 26));
564 CRYPTOPP_CONSTANT(OSXSAVE_FLAG = (1 << 27));
566 CRYPTOPP_CONSTANT(AVX_FLAG = (3 << 27));
567 CRYPTOPP_CONSTANT(YMM_FLAG = (3 << 1));
571 CRYPTOPP_UNUSED(MMX_FLAG); CRYPTOPP_UNUSED(SSE_FLAG);
572 CRYPTOPP_UNUSED(SSE3_FLAG); CRYPTOPP_UNUSED(XSAVE_FLAG);
574 #if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
577 g_hasSSE2 = (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
583 if ((cpuid1[EDX_REG] & SSE2_FLAG) == SSE2_FLAG)
584 g_hasSSE2 = (cpuid1[ECX_REG] & XSAVE_FLAG) != 0 &&
585 (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
590 if (g_hasSSE2 ==
false)
591 g_hasSSE2 = CPU_ProbeSSE2();
593 if (g_hasSSE2 ==
false)
596 g_hasSSSE3 = (cpuid1[ECX_REG] & SSSE3_FLAG) != 0;
597 g_hasSSE41 = (cpuid1[ECX_REG] & SSE41_FLAG) != 0;
598 g_hasSSE42 = (cpuid1[ECX_REG] & SSE42_FLAG) != 0;
599 g_hasMOVBE = (cpuid1[ECX_REG] & MOVBE_FLAG) != 0;
600 g_hasAESNI = (cpuid1[ECX_REG] & AESNI_FLAG) != 0;
601 g_hasCLMUL = (cpuid1[ECX_REG] & CLMUL_FLAG) != 0;
606 if ((cpuid1[ECX_REG] & AVX_FLAG) == AVX_FLAG)
609 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
614 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
615 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
616 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
617 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
618 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
620 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
621 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
622 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
624 if (cpuid0[EAX_REG] >= 7)
626 if (CpuId(7, 0, cpuid2))
628 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
629 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
630 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
631 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
635 else if (IsAMD(cpuid0) || IsHygon(cpuid0))
637 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
638 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
639 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
640 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
641 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
643 CpuId(0x80000005, 0, cpuid2);
644 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
645 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
647 if (cpuid0[EAX_REG] >= 7)
649 if (CpuId(7, 0, cpuid2))
651 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
652 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
653 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
654 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
663 CRYPTOPP_CONSTANT(FAMILY_BASE_FLAG = (0x0f << 8));
664 CRYPTOPP_CONSTANT(FAMILY_EXT_FLAG = (0xff << 20));
666 word32 family = (cpuid1[0] & FAMILY_BASE_FLAG) >> 8;
668 family += (cpuid1[0] & FAMILY_EXT_FLAG) >> 20;
669 if (family == 0x15 || family == 0x16)
676 else if (IsVIA(cpuid0))
679 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2));
680 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6));
681 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8));
682 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10));
683 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12));
685 CpuId(0xC0000000, 0, cpuid2);
686 word32 extendedFeatures = cpuid2[0];
688 if (extendedFeatures >= 0xC0000001)
690 CpuId(0xC0000001, 0, cpuid2);
691 g_hasPadlockRNG = (cpuid2[EDX_REG] & RNG_FLAGS) != 0;
692 g_hasPadlockACE = (cpuid2[EDX_REG] & ACE_FLAGS) != 0;
693 g_hasPadlockACE2 = (cpuid2[EDX_REG] & ACE2_FLAGS) != 0;
694 g_hasPadlockPHE = (cpuid2[EDX_REG] & PHE_FLAGS) != 0;
695 g_hasPadlockPMM = (cpuid2[EDX_REG] & PMM_FLAGS) != 0;
698 if (extendedFeatures >= 0xC0000005)
700 CpuId(0xC0000005, 0, cpuid2);
701 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
707 g_hasAVX2 &= g_hasAVX;
711 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
714 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
715 if (g_cacheLineSize == 0 && cacheLineSize > 0)
716 g_cacheLineSize = cacheLineSize;
719 if (g_cacheLineSize == 0)
722 *
const_cast<volatile bool*
>(&g_x86DetectionDone) =
true;
727 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8)
757 extern bool CPU_ProbeARMv7();
758 extern bool CPU_ProbeNEON();
759 extern bool CPU_ProbeCRC32();
760 extern bool CPU_ProbeAES();
761 extern bool CPU_ProbeSHA1();
762 extern bool CPU_ProbeSHA256();
763 extern bool CPU_ProbeSHA512();
764 extern bool CPU_ProbeSHA3();
765 extern bool CPU_ProbeSM3();
766 extern bool CPU_ProbeSM4();
767 extern bool CPU_ProbePMULL();
772 # define HWCAP_ARMv7 (1 << 29)
775 # define HWCAP_ASIMD (1 << 1)
778 # define HWCAP_NEON (1 << 12)
781 # define HWCAP_CRC32 (1 << 7)
784 # define HWCAP2_CRC32 (1 << 4)
787 # define HWCAP_PMULL (1 << 4)
790 # define HWCAP2_PMULL (1 << 1)
793 # define HWCAP_AES (1 << 3)
796 # define HWCAP2_AES (1 << 0)
799 # define HWCAP_SHA1 (1 << 5)
802 # define HWCAP_SHA2 (1 << 6)
805 # define HWCAP2_SHA1 (1 << 2)
808 # define HWCAP2_SHA2 (1 << 3)
811 # define HWCAP_SHA3 (1 << 17)
814 # define HWCAP_SM3 (1 << 18)
817 # define HWCAP_SM4 (1 << 19)
820 # define HWCAP_SHA512 (1 << 21)
823 inline bool CPU_QueryARMv7()
825 #if defined(__ANDROID__) && defined(__arm__)
826 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
827 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
829 #elif defined(__linux__) && defined(__arm__)
830 if ((getauxval(AT_HWCAP) & HWCAP_ARMv7) != 0 ||
831 (getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
833 #elif defined(__APPLE__) && defined(__arm__)
840 inline bool CPU_QueryNEON()
842 #if defined(__ANDROID__) && defined(__aarch64__)
843 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
844 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
846 #elif defined(__ANDROID__) && defined(__arm__)
847 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
848 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
850 #elif defined(__linux__) && defined(__aarch64__)
851 if ((getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0)
853 #elif defined(__linux__) && defined(__aarch32__)
854 if ((getauxval(AT_HWCAP2) & HWCAP2_ASIMD) != 0)
856 #elif defined(__linux__) && defined(__arm__)
857 if ((getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
859 #elif defined(__APPLE__) && defined(__aarch64__)
866 inline bool CPU_QueryCRC32()
868 #if defined(__ANDROID__) && defined(__aarch64__)
869 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
870 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) != 0))
872 #elif defined(__ANDROID__) && defined(__aarch32__)
873 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
874 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32) != 0))
876 #elif defined(__linux__) && defined(__aarch64__)
877 if ((getauxval(AT_HWCAP) & HWCAP_CRC32) != 0)
879 #elif defined(__linux__) && defined(__aarch32__)
880 if ((getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0)
882 #elif defined(__APPLE__) && defined(__aarch64__)
884 if (IsAppleMachineARMv82())
890 inline bool CPU_QueryPMULL()
892 #if defined(__ANDROID__) && defined(__aarch64__)
893 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
894 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) != 0))
896 #elif defined(__ANDROID__) && defined(__aarch32__)
897 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
898 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL) != 0))
900 #elif defined(__linux__) && defined(__aarch64__)
901 if ((getauxval(AT_HWCAP) & HWCAP_PMULL) != 0)
903 #elif defined(__linux__) && defined(__aarch32__)
904 if ((getauxval(AT_HWCAP2) & HWCAP2_PMULL) != 0)
906 #elif defined(__APPLE__) && defined(__aarch64__)
908 if (IsAppleMachineARMv82())
914 inline bool CPU_QueryAES()
916 #if defined(__ANDROID__) && defined(__aarch64__)
917 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
918 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) != 0))
920 #elif defined(__ANDROID__) && defined(__aarch32__)
921 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
922 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES) != 0))
924 #elif defined(__linux__) && defined(__aarch64__)
925 if ((getauxval(AT_HWCAP) & HWCAP_AES) != 0)
927 #elif defined(__linux__) && defined(__aarch32__)
928 if ((getauxval(AT_HWCAP2) & HWCAP2_AES) != 0)
930 #elif defined(__APPLE__) && defined(__aarch64__)
931 return IsAppleMachineARMv8();
936 inline bool CPU_QuerySHA1()
938 #if defined(__ANDROID__) && defined(__aarch64__)
939 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
940 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) != 0))
942 #elif defined(__ANDROID__) && defined(__aarch32__)
943 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
944 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1) != 0))
946 #elif defined(__linux__) && defined(__aarch64__)
947 if ((getauxval(AT_HWCAP) & HWCAP_SHA1) != 0)
949 #elif defined(__linux__) && defined(__aarch32__)
950 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA1) != 0)
952 #elif defined(__APPLE__) && defined(__aarch64__)
953 return IsAppleMachineARMv8();
958 inline bool CPU_QuerySHA256()
960 #if defined(__ANDROID__) && defined(__aarch64__)
961 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
962 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) != 0))
964 #elif defined(__ANDROID__) && defined(__aarch32__)
965 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
966 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2) != 0))
968 #elif defined(__linux__) && defined(__aarch64__)
969 if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
971 #elif defined(__linux__) && defined(__aarch32__)
972 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA2) != 0)
974 #elif defined(__APPLE__) && defined(__aarch64__)
975 return IsAppleMachineARMv8();
981 inline bool CPU_QuerySHA3()
987 if (!g_hasSHA1 || !g_hasSHA2) {
return false; }
989 #if defined(__ANDROID__) && defined(__aarch64__) && 0
990 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
991 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA3) != 0))
993 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
994 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
995 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA3) != 0))
997 #elif defined(__linux__) && defined(__aarch64__)
998 if ((getauxval(AT_HWCAP) & HWCAP_SHA3) != 0)
1000 #elif defined(__linux__) && defined(__aarch32__)
1001 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA3) != 0)
1003 #elif defined(__APPLE__) && defined(__aarch64__)
1005 if (IsAppleMachineARMv82())
1012 inline bool CPU_QuerySHA512()
1018 if (!g_hasSHA1 || !g_hasSHA2) {
return false; }
1020 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1021 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1022 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA512) != 0))
1024 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1025 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1026 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA512) != 0))
1028 #elif defined(__linux__) && defined(__aarch64__)
1029 if ((getauxval(AT_HWCAP) & HWCAP_SHA512) != 0)
1031 #elif defined(__linux__) && defined(__aarch32__)
1032 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA512) != 0)
1034 #elif defined(__APPLE__) && defined(__aarch64__)
1036 if (IsAppleMachineARMv82())
1043 inline bool CPU_QuerySM3()
1045 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1046 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1047 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM3) != 0))
1049 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1050 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1051 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM3) != 0))
1053 #elif defined(__linux__) && defined(__aarch64__)
1054 if ((getauxval(AT_HWCAP) & HWCAP_SM3) != 0)
1056 #elif defined(__linux__) && defined(__aarch32__)
1057 if ((getauxval(AT_HWCAP2) & HWCAP2_SM3) != 0)
1059 #elif defined(__APPLE__) && defined(__aarch64__) && 0
1066 inline bool CPU_QuerySM4()
1068 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1069 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1070 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM4) != 0))
1072 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1073 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1074 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM4) != 0))
1076 #elif defined(__linux__) && defined(__aarch64__)
1077 if ((getauxval(AT_HWCAP) & HWCAP_SM4) != 0)
1079 #elif defined(__linux__) && defined(__aarch32__)
1080 if ((getauxval(AT_HWCAP2) & HWCAP2_SM4) != 0)
1082 #elif defined(__APPLE__) && defined(__aarch64__) && 0
1088 void DetectArmFeatures()
1092 g_hasARMv7 = CPU_QueryARMv7() || CPU_ProbeARMv7();
1093 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
1094 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
1095 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1096 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1097 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
1098 g_hasSHA2 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1099 g_hasSHA512 = CPU_QuerySHA512();
1100 g_hasSHA3 = CPU_QuerySHA3();
1101 g_hasSM3 = CPU_QuerySM3();
1102 g_hasSM4 = CPU_QuerySM4();
1104 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
1107 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1108 if (cacheLineSize > 0)
1109 g_cacheLineSize = cacheLineSize;
1112 if (g_cacheLineSize == 0)
1115 *
const_cast<volatile bool*
>(&g_ArmDetectionDone) =
true;
1120 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
1134 extern bool CPU_ProbeAltivec();
1135 extern bool CPU_ProbePower7();
1136 extern bool CPU_ProbePower8();
1137 extern bool CPU_ProbePower9();
1138 extern bool CPU_ProbeAES();
1139 extern bool CPU_ProbePMULL();
1140 extern bool CPU_ProbeSHA256();
1141 extern bool CPU_ProbeSHA512();
1142 extern bool CPU_ProbeDARN();
1148 #ifndef __power_6_andup
1149 # define __power_6_andup() __power_set(0xffffffffU<<14)
1151 #ifndef __power_7_andup
1152 # define __power_7_andup() __power_set(0xffffffffU<<15)
1154 #ifndef __power_8_andup
1155 # define __power_8_andup() __power_set(0xffffffffU<<16)
1157 #ifndef __power_9_andup
1158 # define __power_9_andup() __power_set(0xffffffffU<<17)
1163 inline bool CPU_QueryAltivec()
1165 #if defined(__linux__) && defined(PPC_FEATURE_HAS_ALTIVEC)
1166 if ((getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC) != 0)
1169 if (__power_6_andup() != 0)
1171 #elif defined(__APPLE__) && defined(__POWERPC__)
1172 unsigned int unused, arch;
1173 GetAppleMachineInfo(unused, unused, arch);
1174 return arch == AppleMachineInfo::PowerMac;
1179 inline bool CPU_QueryPower7()
1182 #if defined(__linux__) && defined(PPC_FEATURE_ARCH_2_06)
1183 if ((getauxval(AT_HWCAP) & PPC_FEATURE_ARCH_2_06) != 0)
1186 if (__power_7_andup() != 0)
1192 inline bool CPU_QueryPower8()
1195 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_2_07)
1196 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) != 0)
1199 if (__power_8_andup() != 0)
1205 inline bool CPU_QueryPower9()
1208 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1209 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1212 if (__power_9_andup() != 0)
1218 inline bool CPU_QueryAES()
1222 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1223 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1226 if (__power_8_andup() != 0)
1232 inline bool CPU_QueryPMULL()
1236 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1237 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1240 if (__power_8_andup() != 0)
1246 inline bool CPU_QuerySHA256()
1250 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1251 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1254 if (__power_8_andup() != 0)
1259 inline bool CPU_QuerySHA512()
1263 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1264 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1267 if (__power_8_andup() != 0)
1274 inline bool CPU_QueryDARN()
1277 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1278 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1281 if (__power_9_andup() != 0)
1287 void DetectPowerpcFeatures()
1298 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
1299 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
1300 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
1301 g_hasPower9 = CPU_QueryPower9() || CPU_ProbePower9();
1302 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1303 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1304 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1305 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
1306 g_hasDARN = CPU_QueryDARN() || CPU_ProbeDARN();
1308 #if defined(_AIX) && defined(SC_L1C_DLS)
1310 int cacheLineSize = getsystemcfg(SC_L1C_DLS);
1311 if (cacheLineSize > 0)
1312 g_cacheLineSize = cacheLineSize;
1313 #elif defined(_SC_LEVEL1_DCACHE_LINESIZE)
1316 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1317 if (cacheLineSize > 0)
1318 g_cacheLineSize = cacheLineSize;
1321 if (g_cacheLineSize == 0)
1324 *
const_cast<volatile bool*
>(&g_PowerpcDetectionDone) =
true;
1332 ANONYMOUS_NAMESPACE_BEGIN
1339 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
1340 CryptoPP::DetectX86Features();
1341 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8
1342 CryptoPP::DetectArmFeatures();
1343 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64
1344 CryptoPP::DetectPowerpcFeatures();
1353 #if HAVE_GCC_INIT_PRIORITY
1354 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
1355 #elif HAVE_MSC_INIT_PRIORITY
1356 #pragma warning(disable: 4075)
1357 #pragma init_seg(".CRT$XCU")
1358 const InitCpu s_init;
1359 #pragma warning(default: 4075)
1360 #elif HAVE_XLC_INIT_PRIORITY
1362 #pragma priority(270)
1363 const InitCpu s_init;
1365 const InitCpu s_init;
1368 ANONYMOUS_NAMESPACE_END
Restricts the instantiation of a class to one static object without locks.
const T & Ref(...) const
Return a reference to the inner Singleton object.
Library configuration file.
#define CRYPTOPP_L1_CACHE_LINE_SIZE
L1 data cache line size.
#define CRYPTOPP_SECTION_INIT
Initialized data section.
unsigned int word32
32-bit unsigned datatype
unsigned long long word64
64-bit unsigned datatype
Functions for CPU features and intrinsics.
Utility functions for the Crypto++ library.
Crypto++ library namespace.
const char * Version()
int
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.