From 8b1f568cb1a805b27f708df1432167b23ee21db8 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Tue, 12 Sep 2023 14:33:29 +0200 Subject: [PATCH] aarch64: try harder when checking for the crypto extensions --- configure.ac | 46 +++++++++++++++++-- .../aegis128l/aegis128l_armcrypto.c | 5 +- .../crypto_aead/aegis256/aegis256_armcrypto.c | 5 +- .../armcrypto/aead_aes256gcm_armcrypto.c | 9 ++++ src/libsodium/sodium/runtime.c | 2 +- 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index e11a27ae..7d9ecdd9 100644 --- a/configure.ac +++ b/configure.ac @@ -397,7 +397,28 @@ AS_IF([test "x$EMSCRIPTEN" = "x"], [ AS_IF([test "x$target_cpu_aarch64" = "xyes"], [ have_armcrypto=no AC_MSG_CHECKING(for ARM crypto instructions set) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ vaeseq_u8(vmovq_n_u8(0), vmovq_n_u8(__ARM_FEATURE_CRYPTO)) ]])], + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #ifdef __clang__ + # pragma clang attribute push(__attribute__((target("neon,crypto,aes"))), apply_to = function) + #elif defined(__GNUC__) + # pragma GCC target("+simd+crypto") + #endif + #ifndef __ARM_FEATURE_CRYPTO + # define __ARM_FEATURE_CRYPTO 1 + #endif + #ifndef __ARM_FEATURE_AES + # define __ARM_FEATURE_AES 1 + #endif + + #include + ]], [[ + vaeseq_u8(vmovq_n_u8(0), vmovq_n_u8(0)); + + #ifdef __clang__ + # pragma clang attribute pop + #endif + (void) 0 + ]])], [ AC_MSG_RESULT(yes) have_armcrypto=yes @@ -408,7 +429,26 @@ AS_IF([test "x$EMSCRIPTEN" = "x"], [ AX_CHECK_COMPILE_FLAG([-march=armv8-a+crypto+aes], [ CFLAGS="$CFLAGS -march=armv8-a+crypto+aes" AC_MSG_CHECKING(for ARM crypto instructions set with -march=armv8-a+crypto+aes) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ vaeseq_u8(vmovq_n_u8(0), vmovq_n_u8(__ARM_FEATURE_CRYPTO)) ]])], + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #ifdef __clang__ + # pragma clang attribute push(__attribute__((target("neon,crypto,aes"))), apply_to = function) + #elif defined(__GNUC__) + # pragma GCC target("+simd+crypto") + #endif + #ifndef __ARM_FEATURE_CRYPTO + # define __ARM_FEATURE_CRYPTO 1 + #endif + #ifndef __ARM_FEATURE_AES + # define __ARM_FEATURE_AES 1 + #endif + ]], [[ + vaeseq_u8(vmovq_n_u8(0), vmovq_n_u8(0)); + + #ifdef __clang__ + # pragma clang attribute pop + #endif + (void) 0 + ]])], [ AC_MSG_RESULT(yes - with addition of -march=armv8-a+crypto+aes) have_armcrypto=yes @@ -904,7 +944,7 @@ if (&getentropy != NULL) { AS_IF([test "x$WASI" = "x"],[ AC_CHECK_FUNCS([getpid]) - AC_CHECK_FUNCS([getauxva elf_aux_info]) + AC_CHECK_FUNCS([getauxval elf_aux_info]) ]) AC_CHECK_FUNCS([posix_memalign nanosleep clock_gettime]) diff --git a/src/libsodium/crypto_aead/aegis128l/aegis128l_armcrypto.c b/src/libsodium/crypto_aead/aegis128l/aegis128l_armcrypto.c index 8f2adf8c..825de8a1 100644 --- a/src/libsodium/crypto_aead/aegis128l/aegis128l_armcrypto.c +++ b/src/libsodium/crypto_aead/aegis128l/aegis128l_armcrypto.c @@ -20,9 +20,12 @@ #ifdef __clang__ #pragma clang attribute push(__attribute__((target("neon,crypto,aes"))), apply_to = function) #elif defined(__GNUC__) -#pragma GCC target("neon,crypto,aes") +#pragma GCC target("+simd+crypto") #endif +#ifndef __ARM_FEATURE_CRYPTO +#define __ARM_FEATURE_CRYPTO 1 +#endif #ifndef __ARM_FEATURE_AES #define __ARM_FEATURE_AES 1 #endif diff --git a/src/libsodium/crypto_aead/aegis256/aegis256_armcrypto.c b/src/libsodium/crypto_aead/aegis256/aegis256_armcrypto.c index 62974ae2..e1ebd577 100644 --- a/src/libsodium/crypto_aead/aegis256/aegis256_armcrypto.c +++ b/src/libsodium/crypto_aead/aegis256/aegis256_armcrypto.c @@ -20,9 +20,12 @@ #ifdef __clang__ #pragma clang attribute push(__attribute__((target("neon,crypto,aes"))), apply_to = function) #elif defined(__GNUC__) -#pragma GCC target("neon,crypto,aes") +#pragma GCC target("+simd+crypto") #endif +#ifndef __ARM_FEATURE_CRYPTO +#define __ARM_FEATURE_CRYPTO 1 +#endif #ifndef __ARM_FEATURE_AES #define __ARM_FEATURE_AES 1 #endif diff --git a/src/libsodium/crypto_aead/aes256gcm/armcrypto/aead_aes256gcm_armcrypto.c b/src/libsodium/crypto_aead/aes256gcm/armcrypto/aead_aes256gcm_armcrypto.c index 80a21b5f..5058bac9 100644 --- a/src/libsodium/crypto_aead/aes256gcm/armcrypto/aead_aes256gcm_armcrypto.c +++ b/src/libsodium/crypto_aead/aes256gcm/armcrypto/aead_aes256gcm_armcrypto.c @@ -19,6 +19,15 @@ #define __vectorcall #endif +#ifdef __clang__ +#pragma clang attribute push(__attribute__((target("neon,crypto,aes"))), apply_to = function) +#elif defined(__GNUC__) +#pragma GCC target("+simd+crypto") +#endif + +#ifndef __ARM_FEATURE_CRYPTO +#define __ARM_FEATURE_CRYPTO 1 +#endif #ifndef __ARM_FEATURE_AES #define __ARM_FEATURE_AES 1 #endif diff --git a/src/libsodium/sodium/runtime.c b/src/libsodium/sodium/runtime.c index 7f0997d4..48339955 100644 --- a/src/libsodium/sodium/runtime.c +++ b/src/libsodium/sodium/runtime.c @@ -97,7 +97,7 @@ _sodium_runtime_arm_cpu_features(CPUFeatures * const cpu_features) return 0; } -#if __ARM_FEATURE_CRYPTO +#if defined(__ARM_FEATURE_CRYPTO) && defined(__ARM_FEATURE_AES) cpu_features->has_armcrypto = 1; #elif defined(_M_ARM64) cpu_features->has_armcrypto = 1; /* assuming all CPUs supported by ARM Windows have the crypto extensions */