[Buildroot] [PATCH] package/libnss: fix arm32 neon build failure

Giulio Benetti giulio.benetti at benettiengineering.com
Fri Jan 10 11:15:26 UTC 2020


libnss assumes that every arm 32 supports neon, but this is not true, so
add pending patch [1] to check if arm 32 supports neon and fix build
failure.

[1]: https://bugzilla.mozilla.org/show_bug.cgi?id=1608327

Fixes:
http://autobuild.buildroot.net/results/d3d/d3d5da5d0f3c495376cd0f3d63b846ff16d429d9/

Signed-off-by: Giulio Benetti <giulio.benetti at benettiengineering.com>
---
 ...freebl-arm-NEON-code-use-on-tier3-pl.patch | 169 ++++++++++++++++++
 1 file changed, 169 insertions(+)
 create mode 100644 package/libnss/0003-Bug-1608327-Fix-freebl-arm-NEON-code-use-on-tier3-pl.patch

diff --git a/package/libnss/0003-Bug-1608327-Fix-freebl-arm-NEON-code-use-on-tier3-pl.patch b/package/libnss/0003-Bug-1608327-Fix-freebl-arm-NEON-code-use-on-tier3-pl.patch
new file mode 100644
index 0000000000..06bd6a167c
--- /dev/null
+++ b/package/libnss/0003-Bug-1608327-Fix-freebl-arm-NEON-code-use-on-tier3-pl.patch
@@ -0,0 +1,169 @@
+From 0efcc6d793ede00d0e62250e1252c9c1040a6dda Mon Sep 17 00:00:00 2001
+From: Giulio Benetti <giulio.benetti at benettiengineering.com>
+Date: Fri, 10 Jan 2020 12:00:48 +0100
+Subject: [PATCH] Bug 1608327 - Fix freebl arm NEON code use on tier3
+ platforms.
+
+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.
+
+Signed-off-by: Giulio Benetti <giulio.benetti at benettiengineering.com>
+---
+ nss/lib/freebl/Makefile         |  8 ++++++--
+ nss/lib/freebl/aes-armv8.c      |  2 +-
+ nss/lib/freebl/freebl.gyp       | 17 +++++++++++++----
+ nss/lib/freebl/gcm-arm32-neon.c |  4 ++--
+ nss/lib/freebl/gcm.c            |  7 ++-----
+ nss/lib/freebl/rijndael.c       |  3 +--
+ 6 files changed, 25 insertions(+), 16 deletions(-)
+
+diff --git a/nss/lib/freebl/Makefile b/nss/lib/freebl/Makefile
+index 0e230d8c5..1a930dca6 100644
+--- a/nss/lib/freebl/Makefile
++++ b/nss/lib/freebl/Makefile
+@@ -781,8 +781,12 @@ $(OBJDIR)/$(PROG_PREFIX)intel-gcm-wrap$(OBJ_SUFFIX): CFLAGS += -mssse3
+ 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/nss/lib/freebl/aes-armv8.c b/nss/lib/freebl/aes-armv8.c
+index 8213272f5..7be39ede8 100644
+--- a/nss/lib/freebl/aes-armv8.c
++++ b/nss/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/nss/lib/freebl/freebl.gyp b/nss/lib/freebl/freebl.gyp
+index 5d247742d..2b8182ef8 100644
+--- a/nss/lib/freebl/freebl.gyp
++++ b/nss/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': '<!(${CC:-cc} -o - -E -dM - ${CFLAGS} < /dev/null | grep __SOFTFP__ > /dev/null && echo -mfloat-abi=softfp || true)',
++      }],
+     ],
+   }
+ }
+diff --git a/nss/lib/freebl/gcm-arm32-neon.c b/nss/lib/freebl/gcm-arm32-neon.c
+index 97eb82ec6..be0424770 100644
+--- a/nss/lib/freebl/gcm-arm32-neon.c
++++ b/nss/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 <arm_neon.h>
+ 
+@@ -199,4 +199,4 @@ gcm_HashZeroX_hw(gcmHashContext *ghash)
+     return SECSuccess;
+ }
+ 
+-#endif /* __ARM_NEON__ || __ARM_NEON */
++#endif /* IS_LITTLE_ENDIAN */
+diff --git a/nss/lib/freebl/gcm.c b/nss/lib/freebl/gcm.c
+index 080e641ea..2a42f74c0 100644
+--- a/nss/lib/freebl/gcm.c
++++ b/nss/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/nss/lib/freebl/rijndael.c b/nss/lib/freebl/rijndael.c
+index 40364fce0..2e8bab87f 100644
+--- a/nss/lib/freebl/rijndael.c
++++ b/nss/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
+-- 
+2.20.1
+
-- 
2.20.1



More information about the buildroot mailing list