From 1fdd08d6908ae6ac69c50df635d793f4de4e347b Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Mon, 31 Jul 2017 02:09:15 -0400 Subject: [PATCH] Fix ARM build under Windows Phone --- GNUmakefile | 18 +++++++++--------- config.h | 8 ++++---- crc-simd.cpp | 6 ++++-- cryptest.nmake | 2 ++ cryptlib.vcxproj | 2 +- gcm-simd.cpp | 8 +++++--- neon.cpp | 7 +++++-- sha-simd.cpp | 10 +++++++--- 8 files changed, 37 insertions(+), 24 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 2e2d456e..8e6fa818 100755 --- a/GNUmakefile +++ b/GNUmakefile @@ -199,15 +199,15 @@ endif # -DCRYPTOPP_DISABLE_SSSE3 endif # -DCRYPTOPP_DISABLE_ASM endif # CXXFLAGS -SSSE3_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -mssse3 -dM -E - | grep -i -c -q __SSSE3__ && echo "-mssse3") +SSSE3_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -mssse3 -dM -E - | grep -i -c -q __SSSE3__ && echo "-mssse3") ARIA_FLAG = $(SSSE3_FLAG) ifeq ($(findstring -DCRYPTOPP_DISABLE_SSE4,$(CXXFLAGS)),) -SSE42_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -msse4.2 -dM -E - | grep -i -c -q __SSE4_2__ && echo "-msse4.2") +SSE42_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -msse4.2 -dM -E - | grep -i -c -q __SSE4_2__ && echo "-msse4.2") ifeq ($(findstring -DCRYPTOPP_DISABLE_AESNI,$(CXXFLAGS)),) -GCM_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -mssse3 -mpclmul -dM -E - | grep -i -c -q __PCLMUL__ && echo "-mssse3 -mpclmul") -AES_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -maes -dM -E - | grep -i -c -q __AES__ && echo "-maes") +GCM_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -mssse3 -mpclmul -dM -E - | grep -i -c -q __PCLMUL__ && echo "-mssse3 -mpclmul") +AES_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -maes -dM -E - | grep -i -c -q __AES__ && echo "-maes") ifeq ($(findstring -DCRYPTOPP_DISABLE_SHA,$(CXXFLAGS)),) -SHA_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -msse4.2 -msha -dM -E - | grep -i -c -q __SHA__ && echo "-msse4.2 -msha") +SHA_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -msse4.2 -msha -dM -E - | grep -i -c -q __SHA__ && echo "-msse4.2 -msha") BLAKE2_FLAG = $(SSE42_FLAG) CRC_FLAG = $(SSE42_FLAG) endif @@ -304,16 +304,16 @@ endif endif ifeq ($(IS_NEON),1) - NEON_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon -dM -E - | grep -i -c -q __ARM_NEON && echo "-march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon") + NEON_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon -dM -E - | grep -i -c -q __ARM_NEON && echo "-march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon") GCM_FLAG = $(NEON_FLAG) ARIA_FLAG = $(NEON_FLAG) BLAKE2_FLAG = $(NEON_FLAG) endif ifeq ($(IS_ARMV8),1) - ARMV8A_NEON_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -march=armv8-a -dM -E - | grep -i -c -q __ARM_NEON && echo "-march=armv8-a") - ARMV8A_CRC_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -march=armv8-a+crc -dM -E - | grep -i -c -q __ARM_FEATURE_CRC32 && echo "-march=armv8-a+crc") - ARMV8A_CRYPTO_FLAG = $(shell echo | $(CXX) $(CXXFLAGS) -march=armv8-a+crypto -dM -E - | grep -i -c -q __ARM_FEATURE_CRYPTO && echo "-march=armv8-a+crypto") + ARMV8A_NEON_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -march=armv8-a -dM -E - | grep -i -c -q __ARM_NEON && echo "-march=armv8-a") + ARMV8A_CRC_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -march=armv8-a+crc -dM -E - | grep -i -c -q __ARM_FEATURE_CRC32 && echo "-march=armv8-a+crc") + ARMV8A_CRYPTO_FLAG = $(shell echo "" | $(CXX) $(CXXFLAGS) -march=armv8-a+crypto -dM -E - | grep -i -c -q __ARM_FEATURE_CRYPTO && echo "-march=armv8-a+crypto") CRC_FLAG = $(ARMV8A_CRC_FLAG) AES_FLAG = $(ARMV8A_CRYPTO_FLAG) GCM_FLAG = $(ARMV8A_CRYPTO_FLAG) diff --git a/config.h b/config.h index 59130864..d456af48 100644 --- a/config.h +++ b/config.h @@ -536,7 +536,7 @@ NAMESPACE_END // Requires ARMv7 and ACLE 1.0. Testing shows ARMv7 is really ARMv7a under most toolchains. #if !defined(CRYPTOPP_ARM_NEON_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) -# if defined(__ARM_NEON__) || defined(__ARM_FEATURE_NEON) || (CRYPTOPP_MSC_VER >= 1900) || \ +# if defined(__ARM_NEON__) || defined(__ARM_FEATURE_NEON) || (CRYPTOPP_MSC_VERSION >= 1700) || \ (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30500) # define CRYPTOPP_ARM_NEON_AVAILABLE 1 # endif @@ -547,7 +547,7 @@ NAMESPACE_END // Microsoft plans to support ARM-64, but its not clear how to detect it. // TODO: Add MSC_VER and ARM-64 platform define when available #if !defined(CRYPTOPP_ARM_CRC32_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) -# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VER >= 2000) || \ +# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VERSION >= 2000) || \ (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30500) # define CRYPTOPP_ARM_CRC32_AVAILABLE 1 # endif @@ -558,7 +558,7 @@ NAMESPACE_END // Microsoft plans to support ARM-64, but its not clear how to detect it. // TODO: Add MSC_VER and ARM-64 platform define when available #if !defined(CRYPTOPP_ARM_PMULL_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) && !defined(__apple_build_version__) -# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VER >= 2000) || \ +# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VERSION >= 2000) || \ (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30500) # define CRYPTOPP_ARM_PMULL_AVAILABLE 1 # endif @@ -569,7 +569,7 @@ NAMESPACE_END // Microsoft plans to support ARM-64, but its not clear how to detect it. // TODO: Add MSC_VER and ARM-64 platform define when available #if !defined(CRYPTOPP_ARMV8A_CRYPTO_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) -# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VER >= 2000) || \ +# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_MSC_VERSION >= 2000) || \ (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30500) # define CRYPTOPP_ARM_AES_AVAILABLE 1 # define CRYPTOPP_ARM_PMULL_AVAILABLE 1 diff --git a/crc-simd.cpp b/crc-simd.cpp index 3ee20532..78d5de7f 100644 --- a/crc-simd.cpp +++ b/crc-simd.cpp @@ -40,9 +40,9 @@ extern "C" { }; #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY -#if (CRYPTOPP_ARM_CRC32_AVAILABLE) bool CPU_TryCRC32_ARMV8() { +#if (CRYPTOPP_ARM_CRC32_AVAILABLE) # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) volatile bool result = true; __try @@ -95,8 +95,10 @@ bool CPU_TryCRC32_ARMV8() signal(SIGILL, oldHandler); return result; # endif +#else + return false; } -#endif // CRYPTOPP_ARM_CRC32_AVAILABLE +#endif // CRYPTOPP_ARMV8A_SHA_AVAILABLE #if (CRYPTOPP_ARM_CRC32_AVAILABLE) void CRC32_Update_ARMV8(const byte *s, size_t n, word32& c) diff --git a/cryptest.nmake b/cryptest.nmake index 60ad5c72..47871d41 100644 --- a/cryptest.nmake +++ b/cryptest.nmake @@ -128,6 +128,8 @@ LDLIBS = $(LDLIBS) ws2_32.lib kernel32.lib !IF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64" # CXXFLAGS = $(CXXFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP +LIB_SRCS = $(LIB_SRCS) neon.cpp +LIB_OBJS = $(LIB_OBJS) neon.obj # CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP # LDLIBS = $(LDLIBS) ws2_32.lib !ENDIF diff --git a/cryptlib.vcxproj b/cryptlib.vcxproj index 5568eb77..936eb5e9 100644 --- a/cryptlib.vcxproj +++ b/cryptlib.vcxproj @@ -158,8 +158,8 @@ - + diff --git a/gcm-simd.cpp b/gcm-simd.cpp index 6197de6f..6566af68 100644 --- a/gcm-simd.cpp +++ b/gcm-simd.cpp @@ -156,9 +156,9 @@ extern "C" { }; #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY -#if (CRYPTOPP_ARM_PMULL_AVAILABLE) bool CPU_TryPMULL_ARMV8() { +#if (CRYPTOPP_ARM_PMULL_AVAILABLE) # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) volatile bool result = true; __try @@ -216,10 +216,12 @@ bool CPU_TryPMULL_ARMV8() sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR); signal(SIGILL, oldHandler); - return result; + return result; # endif +#else + return false; } -#endif // CRYPTOPP_ARM_PMULL_AVAILABLE +#endif // CRYPTOPP_ARMV8A_SHA_AVAILABLE #if CRYPTOPP_ARM_NEON_AVAILABLE void GCM_Xor16_NEON(byte *a, const byte *b, const byte *c) diff --git a/neon.cpp b/neon.cpp index 732a775f..3e6adedf 100644 --- a/neon.cpp +++ b/neon.cpp @@ -8,9 +8,12 @@ #include "pch.h" #include "config.h" -#include "misc.h" -#if (CRYPTOPP_ARM_NEON_AVAILABLE) && defined(__GNUC__) +#ifndef EXCEPTION_EXECUTE_HANDLER +# define EXCEPTION_EXECUTE_HANDLER 1 +#endif + +#if (CRYPTOPP_ARM_NEON_AVAILABLE) # include "arm_neon.h" #endif diff --git a/sha-simd.cpp b/sha-simd.cpp index d335b705..01d60006 100644 --- a/sha-simd.cpp +++ b/sha-simd.cpp @@ -44,9 +44,9 @@ extern "C" { extern const word32 SHA256_K[64]; -#if (CRYPTOPP_ARMV8A_SHA_AVAILABLE) bool CPU_TrySHA1_ARMV8() { +#if (CRYPTOPP_ARMV8A_SHA_AVAILABLE) # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) volatile bool result = true; __try @@ -66,7 +66,7 @@ bool CPU_TrySHA1_ARMV8() return false; } return result; -#else +# else // longjmp and clobber warnings. Volatile is required. // http://github.com/weidai11/cryptopp/issues/24 and http://stackoverflow.com/q/7721854 volatile bool result = true; @@ -98,12 +98,14 @@ bool CPU_TrySHA1_ARMV8() signal(SIGILL, oldHandler); return result; # endif +#else + return false; } #endif // CRYPTOPP_ARMV8A_SHA_AVAILABLE -#if (CRYPTOPP_ARMV8A_SHA_AVAILABLE) bool CPU_TrySHA2_ARMV8() { +#if (CRYPTOPP_ARMV8A_SHA_AVAILABLE) # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) volatile bool result = true; __try @@ -153,6 +155,8 @@ bool CPU_TrySHA2_ARMV8() signal(SIGILL, oldHandler); return result; # endif +#else + return false; } #endif // CRYPTOPP_ARMV8A_SHA_AVAILABLE