[oe] [PATCH 2/2] fftw: work around segfault when checking for presence of ARM NEON

Andreas Müller schnitzeltony at googlemail.com
Sun Dec 25 23:07:39 UTC 2016


* Mixxx segfaulted during start. Remote debugging lead to function
  'really_have_neon()'.
* qtractor segfaulted when adding instruments as whysynth or hexter
* seems autodetection fails in some other environments too [1].
* if TUNE_FEATURES contain 'neon' we can assume our machine supports NEON so
  we don't need runtime detection

[1] https://github.com/FFTW/fftw3/issues/30

Signed-off-by: Andreas Müller <schnitzeltony at googlemail.com>
---
 ...todetection-segfaults-assume-neon-present.patch | 80 ++++++++++++++++++++++
 meta-oe/recipes-support/fftw/fftw_3.3.5.bb         |  5 +-
 2 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 meta-oe/recipes-support/fftw/fftw/0001-NEON-autodetection-segfaults-assume-neon-present.patch

diff --git a/meta-oe/recipes-support/fftw/fftw/0001-NEON-autodetection-segfaults-assume-neon-present.patch b/meta-oe/recipes-support/fftw/fftw/0001-NEON-autodetection-segfaults-assume-neon-present.patch
new file mode 100644
index 0000000..6340f42
--- /dev/null
+++ b/meta-oe/recipes-support/fftw/fftw/0001-NEON-autodetection-segfaults-assume-neon-present.patch
@@ -0,0 +1,80 @@
+From 97af5a2efbe30726ce4d7c921efed6afc32a314f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony at googlemail.com>
+Date: Sun, 25 Dec 2016 13:41:19 +0100
+Subject: [PATCH] NEON autodetection segfaults: assume neon present
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+If TUNE_FEATURES contain 'neon' we can assume our machine supports it
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Andreas Müller <schnitzeltony at googlemail.com>
+---
+ simd-support/neon.c | 46 +---------------------------------------------
+ 1 file changed, 1 insertion(+), 45 deletions(-)
+
+diff --git a/simd-support/neon.c b/simd-support/neon.c
+index 86b2cb6..8d6537e 100644
+--- a/simd-support/neon.c
++++ b/simd-support/neon.c
+@@ -23,54 +23,10 @@
+ 
+ #if HAVE_NEON
+ 
+-/* check for an environment where signals are known to work */
+-#if defined(unix) || defined(linux)
+-  # include <signal.h>
+-  # include <setjmp.h>
+-
+-  static jmp_buf jb;
+-
+-  static void sighandler(int x)
+-  {
+-       UNUSED(x);
+-       longjmp(jb, 1);
+-  }
+-
+-  static int really_have_neon(void)
+-  {
+-       void (*oldsig)(int);
+-       oldsig = signal(SIGILL, sighandler);
+-       if (setjmp(jb)) {
+-	    signal(SIGILL, oldsig);
+-	    return 0;
+-       } else {
+-	    /* paranoia: encode the instruction in binary because the
+-	       assembler may not recognize it without -mfpu=neon */
+-	    /*asm volatile ("vand q0, q0, q0");*/
+-	    asm volatile (".long 0xf2000150");
+-	    signal(SIGILL, oldsig);
+-	    return 1;
+-       }
+-  }
+-
+-  int X(have_simd_neon)(void)
+-  {
+-       static int init = 0, res;
+-
+-       if (!init) {
+-	    res = really_have_neon();
+-	    init = 1;
+-       }
+-       return res;
+-  }
+-
+-
+-#else
+-/* don't know how to autodetect NEON; assume it is present */
++/* autodetect NEON broken; assume it is present */
+   int X(have_simd_neon)(void)
+   {
+        return 1;
+   }
+-#endif
+ 
+ #endif
+-- 
+2.5.5
+
diff --git a/meta-oe/recipes-support/fftw/fftw_3.3.5.bb b/meta-oe/recipes-support/fftw/fftw_3.3.5.bb
index 7bce6f4..71adb89 100644
--- a/meta-oe/recipes-support/fftw/fftw_3.3.5.bb
+++ b/meta-oe/recipes-support/fftw/fftw_3.3.5.bb
@@ -3,7 +3,10 @@ SECTION = "libs"
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552"
 
-SRC_URI = "http://www.fftw.org/fftw-${PV}.tar.gz"
+SRC_URI = " \
+    http://www.fftw.org/fftw-${PV}.tar.gz \
+    file://0001-NEON-autodetection-segfaults-assume-neon-present.patch \
+"
 SRC_URI[md5sum] = "6cc08a3b9c7ee06fdd5b9eb02e06f569"
 SRC_URI[sha256sum] = "8ecfe1b04732ec3f5b7d279fdb8efcad536d555f9d1e8fabd027037d45ea8bcf"
 
-- 
2.5.5




More information about the Openembedded-devel mailing list