From 2a37d6aa7b060da7c8f7a0f10cd3afae3ab72d82 Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Fri, 3 Aug 2018 12:32:16 +0200 Subject: [PATCH 1/2] Mayaqua: add "cpu_features" submodule --- .gitmodules | 3 +++ src/Mayaqua/cpu_features | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 src/Mayaqua/cpu_features diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..f5a46fc3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/Mayaqua/cpu_features"] + path = src/Mayaqua/cpu_features + url = https://github.com/google/cpu_features.git diff --git a/src/Mayaqua/cpu_features b/src/Mayaqua/cpu_features new file mode 160000 index 00000000..26133d3b --- /dev/null +++ b/src/Mayaqua/cpu_features @@ -0,0 +1 @@ +Subproject commit 26133d3b620c2c27f31d571efd27371100f891e9 From d3af4d6f269561d187d1ba304b65d385da87e1df Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Fri, 3 Aug 2018 14:17:20 +0200 Subject: [PATCH 2/2] Mayaqua: use "cpu_features" to check whether AES-NI is supported --- src/Mayaqua/CMakeLists.txt | 6 +++++- src/Mayaqua/Encrypt.c | 42 ++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Mayaqua/CMakeLists.txt b/src/Mayaqua/CMakeLists.txt index c4f08cfd..1117f637 100644 --- a/src/Mayaqua/CMakeLists.txt +++ b/src/Mayaqua/CMakeLists.txt @@ -19,7 +19,11 @@ find_package(ZLIB REQUIRED) # In some cases libiconv is not included in libc find_library(LIB_ICONV iconv) -target_link_libraries(mayaqua OpenSSL::SSL OpenSSL::Crypto Threads::Threads ZLIB::ZLIB) +add_subdirectory(cpu_features) + +target_include_directories(mayaqua PRIVATE cpu_features/include) + +target_link_libraries(mayaqua cpu_features OpenSSL::SSL OpenSSL::Crypto Threads::Threads ZLIB::ZLIB) if(LIB_ICONV) target_link_libraries(mayaqua ${LIB_ICONV}) diff --git a/src/Mayaqua/Encrypt.c b/src/Mayaqua/Encrypt.c index ab42677a..8a90e592 100644 --- a/src/Mayaqua/Encrypt.c +++ b/src/Mayaqua/Encrypt.c @@ -146,10 +146,21 @@ #include #ifdef _MSC_VER -#include // For __cpuid() -#else -#include // For __get_cpuid() -#endif + #include // For __cpuid() +#else // _MSC_VER + #include "cpu_features_macros.h" + #if defined(CPU_FEATURES_ARCH_X86) + #include "cpuinfo_x86.h" + #elif defined(CPU_FEATURES_ARCH_ARM) + #include "cpuinfo_arm.h" + #elif defined(CPU_FEATURES_ARCH_AARCH64) + #include "cpuinfo_aarch64.h" + #elif defined(CPU_FEATURES_ARCH_MIPS) + #include "cpuinfo_mips.h" + #elif defined(CPU_FEATURES_ARCH_PPC) + #include "cpuinfo_ppc.h" + #endif +#endif // _MSC_VER LOCK *openssl_lock = NULL; @@ -4222,11 +4233,24 @@ bool IsAesNiSupported() int regs[4]; // EAX, EBX, ECX, EDX __cpuid(regs, 1); supported = (regs[2] >> 25) & 1; -#else - uint32_t eax, ebx, ecx, edx; - __get_cpuid(1, &eax, &ebx, &ecx, &edx); - supported = (ecx & bit_AES) > 0; -#endif +#else // _MSC_VER + #if defined(CPU_FEATURES_ARCH_X86) + const X86Features features = GetX86Info().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_ARM) + const ArmFeatures features = GetArmInfo().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_AARCH64) + const Aarch64Features features = GetAarch64Info().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_MIPS) + const MipsFeatures features = GetMipsInfo().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_PPC) + const PPCFeatures features = GetPPCInfo().features; + supported = features.aes; + #endif +#endif // _MSC_VER return supported; }