diff --git a/crypto/cpu-arm-asm.S b/crypto/cpu-arm-asm.S index 7941f5f0..faf3ad89 100644 --- a/crypto/cpu-arm-asm.S +++ b/crypto/cpu-arm-asm.S @@ -12,7 +12,7 @@ # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__arm__) .syntax unified .cpu cortex-a8 @@ -29,4 +29,4 @@ CRYPTO_arm_neon_probe: bx lr .section .note.GNU-stack,"",%progbits -#endif /* !OPENSSL_NO_ASM */ +#endif /* !OPENSSL_NO_ASM && __arm__ */ diff --git a/crypto/cpu-arm.c b/crypto/cpu-arm.c index 5ecdb1a3..8ca60fbf 100644 --- a/crypto/cpu-arm.c +++ b/crypto/cpu-arm.c @@ -62,6 +62,8 @@ void CRYPTO_set_NEON_functional(char neon_functional) { } } +#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) + static sigjmp_buf sigill_jmp; static void sigill_handler(int signal) { @@ -76,7 +78,6 @@ void CRYPTO_arm_neon_probe(); static int probe_for_NEON() { int supported = 0; -#if !defined(OPENSSL_NO_ASM) sigset_t sigmask; sigfillset(&sigmask); sigdelset(&sigmask, SIGILL); @@ -109,16 +110,26 @@ static int probe_for_NEON() { sigaction(SIGILL, &sigill_original_action, NULL); sigprocmask(SIG_SETMASK, &original_sigmask, NULL); -#endif return supported; } +#else + +static int probe_for_NEON() { + return 0; +} + +#endif /* !OPENSSL_NO_ASM && OPENSSL_ARM */ + void OPENSSL_cpuid_setup(void) { if (getauxval == NULL) { - // |CRYPTO_is_NEON_capable| can be true even if |CRYPTO_set_NEON_capable| - // has never been called if the code was compiled with NEON support enabled - // (e.g. -mfpu=neon). + // On ARM, but not AArch64, try a NEON instruction and see whether it works + // in order to probe for NEON support. + // + // Note that |CRYPTO_is_NEON_capable| can be true even if + // |CRYPTO_set_NEON_capable| has never been called if the code was compiled + // with NEON support enabled (e.g. -mfpu=neon). if (!g_set_neon_called && !CRYPTO_is_NEON_capable() && probe_for_NEON()) { OPENSSL_armcap_P |= ARMV7_NEON; }