From 1e2f8acd146a3544670f54255b6d3449d2d8d233 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 10 Jan 2020 17:26:33 +0100 Subject: [PATCH] Fix build on armv7hl with the patch proposed in upstream --- nss-3.49-neon-build-fixes.patch | 159 ++++++++++++++++++++++++++++++++ nss.spec | 5 + 2 files changed, 164 insertions(+) create mode 100644 nss-3.49-neon-build-fixes.patch diff --git a/nss-3.49-neon-build-fixes.patch b/nss-3.49-neon-build-fixes.patch new file mode 100644 index 0000000..7ac5b0f --- /dev/null +++ b/nss-3.49-neon-build-fixes.patch @@ -0,0 +1,159 @@ +# HG changeset patch +# User Mike Hommey +# Date 1578673372 -3600 +# Fri Jan 10 17:22:52 2020 +0100 +# Node ID 9c359d019d333282476ffeec3dab819cfdcf127e +# Parent 4921046404f197526969a6b79f19c136469e69f8 +Bug 1608327 - Fix freebl arm NEON code use on tier3 platforms. + +Summary: +Despite the code having runtime detection of NEON and crypto extensions, +the optimized code using those instructions is disabled at build time on +platforms where the compiler doesn't enable NEON by default of with the +flags it's given for the caller code. + +In the case of gcm, this goes as far as causing a build error. + +What is needed is for the optimized code to be enabled in every case, +letting the caller code choose whether to use that code based on the +existing runtime checks. + +But this can't be simply done either, because those optimized parts of +the code need to be built with NEON enabled, unconditionally, but that +is not compatible with platforms using the softfloat ABI. For those, +we need to use the softfp ABI, which is compatible. However, the softfp +ABI is not compatible with the hardfp ABI, so we also can't +unconditionally use the softfp ABI, so we do so only when the compiler +targets the softfloat ABI, which confusingly enough is advertized via +the `__SOFTFP__` define. + +Reviewers: jcj! + +Bug #: 1608327 + +Differential Revision: https://phabricator.services.mozilla.com/D59451 + +diff --git a/lib/freebl/Makefile b/lib/freebl/Makefile +--- a/lib/freebl/Makefile ++++ b/lib/freebl/Makefile +@@ -781,8 +781,12 @@ ifdef INTEL_GCM_CLANG_CL + endif + + ifeq ($(CPU_ARCH),arm) +-$(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a -mfpu=crypto-neon-fp-armv8 +-$(OBJDIR)/$(PROG_PREFIX)gcm-arm32-neon$(OBJ_SUFFIX): CFLAGS += -mfpu=neon ++# When the compiler uses the softfloat ABI, we want to use the compatible softfp ABI when ++# enabling NEON for these objects. ++# Confusingly, __SOFTFP__ is the name of the define for the softfloat ABI, not for the softfp ABI. ++USES_SOFTFLOAT_ABI := $(shell $(CC) -o - -E -dM - $(CFLAGS) < /dev/null | grep __SOFTFP__ > /dev/null && echo 1) ++$(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a -mfpu=crypto-neon-fp-armv8$(if $(USES_SOFTFLOAT_ABI), -mfloat-abi=softfp) ++$(OBJDIR)/$(PROG_PREFIX)gcm-arm32-neon$(OBJ_SUFFIX): CFLAGS += -mfpu=neon$(if $(USES_SOFTFLOAT_ABI), -mfloat-abi=softfp) + endif + ifeq ($(CPU_ARCH),aarch64) + $(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a+crypto +diff --git a/lib/freebl/aes-armv8.c b/lib/freebl/aes-armv8.c +--- a/lib/freebl/aes-armv8.c ++++ b/lib/freebl/aes-armv8.c +@@ -8,7 +8,7 @@ + #if ((defined(__clang__) || \ + (defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8)))) && \ +- (defined(__ARM_NEON) || defined(__ARM_NEON__))) ++ defined(IS_LITTLE_ENDIAN)) + + #ifndef __ARM_FEATURE_CRYPTO + #error "Compiler option is invalid" +diff --git a/lib/freebl/freebl.gyp b/lib/freebl/freebl.gyp +--- a/lib/freebl/freebl.gyp ++++ b/lib/freebl/freebl.gyp +@@ -126,10 +126,12 @@ + '<(DEPTH)/exports.gyp:nss_exports' + ], + 'cflags': [ +- '-mfpu=neon' ++ '-mfpu=neon', ++ '<@(softfp_cflags)', + ], + 'cflags_mozilla': [ +- '-mfpu=neon' ++ '-mfpu=neon', ++ '<@(softfp_cflags)', + ] + }, + { +@@ -179,11 +181,13 @@ + [ 'target_arch=="arm"', { + 'cflags': [ + '-march=armv8-a', +- '-mfpu=crypto-neon-fp-armv8' ++ '-mfpu=crypto-neon-fp-armv8', ++ '<@(softfp_cflags)', + ], + 'cflags_mozilla': [ + '-march=armv8-a', +- '-mfpu=crypto-neon-fp-armv8' ++ '-mfpu=crypto-neon-fp-armv8', ++ '<@(softfp_cflags)', + ], + }, 'target_arch=="arm64" or target_arch=="aarch64"', { + 'cflags': [ +@@ -533,6 +537,11 @@ + }, { + 'have_int128_support%': 0, + }], ++ [ 'target_arch=="arm"', { ++ # When the compiler uses the softfloat ABI, we want to use the compatible softfp ABI when enabling NEON for these objects. ++ # Confusingly, __SOFTFP__ is the name of the define for the softfloat ABI, not for the softfp ABI. ++ 'softfp_cflags': ' /dev/null && echo -mfloat-abi=softfp || true)', ++ }], + ], + } + } +diff --git a/lib/freebl/gcm-arm32-neon.c b/lib/freebl/gcm-arm32-neon.c +--- a/lib/freebl/gcm-arm32-neon.c ++++ b/lib/freebl/gcm-arm32-neon.c +@@ -11,7 +11,7 @@ + #include "secerr.h" + #include "prtypes.h" + +-#if defined(__ARM_NEON__) || defined(__ARM_NEON) ++#if defined(IS_LITTLE_ENDIAN) + + #include + +@@ -199,4 +199,4 @@ gcm_HashZeroX_hw(gcmHashContext *ghash) + return SECSuccess; + } + +-#endif /* __ARM_NEON__ || __ARM_NEON */ ++#endif /* IS_LITTLE_ENDIAN */ +diff --git a/lib/freebl/gcm.c b/lib/freebl/gcm.c +--- a/lib/freebl/gcm.c ++++ b/lib/freebl/gcm.c +@@ -21,11 +21,8 @@ + #if defined(__aarch64__) && defined(IS_LITTLE_ENDIAN) && \ + (defined(__clang__) || defined(__GNUC__) && __GNUC__ > 6) + #define USE_ARM_GCM +-#elif defined(__arm__) && defined(IS_LITTLE_ENDIAN) && \ +- (defined(__ARM_NEON__) || defined(__ARM_NEON)) +-/* We don't test on big endian platform, so disable this on big endian. +- * Also, we don't check whether compiler support NEON well, so this uses +- * that compiler uses -mfpu=neon only. */ ++#elif defined(__arm__) && defined(IS_LITTLE_ENDIAN) ++/* We don't test on big endian platform, so disable this on big endian. */ + #define USE_ARM_GCM + #endif + +diff --git a/lib/freebl/rijndael.c b/lib/freebl/rijndael.c +--- a/lib/freebl/rijndael.c ++++ b/lib/freebl/rijndael.c +@@ -20,8 +20,7 @@ + #include "gcm.h" + #include "mpi.h" + +-#if (!defined(IS_LITTLE_ENDIAN) && !defined(NSS_X86_OR_X64)) || \ +- (defined(__arm__) && !defined(__ARM_NEON) && !defined(__ARM_NEON__)) ++#if !defined(IS_LITTLE_ENDIAN) && !defined(NSS_X86_OR_X64) + // not test yet on big endian platform of arm + #undef USE_HW_AES + #endif diff --git a/nss.spec b/nss.spec index 8a7a756..cee9b1e 100644 --- a/nss.spec +++ b/nss.spec @@ -107,6 +107,8 @@ Patch2: nss-539183.patch Patch4: iquote.patch # add missing ike mechanism to softoken Patch10: nss-3.47-ike-fix.patch +# Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=1608327 +Patch11: nss-3.49-neon-build-fixes.patch %description Network Security Services (NSS) is a set of libraries designed to @@ -245,6 +247,8 @@ find nss/lib/libpkix -perm /u+x -type f -exec chmod -x {} \; %build +gcc -mfpu=neon -dM -E - < /dev/null + export FREEBL_NO_DEPEND=1 # Must export FREEBL_LOWHASH=1 for nsslowhash.h so that it gets @@ -874,6 +878,7 @@ update-crypto-policies &> /dev/null || : %changelog * Fri Jan 10 2020 Daiki Ueno - 3.49.0-1 - Update to NSS 3.49 +- Fix build on armv7hl with the patch proposed in upstream * Fri Jan 3 2020 Daiki Ueno - 3.48.0-1 - Update to NSS 3.48