| From 80d3e73ad0648f558a067a9dbfe3bc80e6b614f8 Mon Sep 17 00:00:00 2001 |
| From: Beniamin Sandu <beniaminsandu@gmail.com> |
| Date: Mon, 30 Oct 2023 19:15:56 +0000 |
| Subject: [PATCH] AES-NI: use target attributes for x86 32-bit intrinsics |
| |
| This way we build with 32-bit gcc/clang out of the box. |
| We also fallback to assembly for 64-bit clang-cl if needed cpu |
| flags are not provided, instead of throwing an error. |
| |
| Upstream-Status: Backport [https://github.com/Mbed-TLS/mbedtls/commit/800f2b7c020678a84abfa9688962b91c36e6693d] |
| |
| Signed-off-by: Beniamin Sandu <beniaminsandu@gmail.com> |
| --- |
| library/aesni.c | 20 ++++++++++++++++++++ |
| library/aesni.h | 8 +++++--- |
| 2 files changed, 25 insertions(+), 3 deletions(-) |
| |
| diff --git a/library/aesni.c b/library/aesni.c |
| index 5f25a8249..481fa3822 100644 |
| --- a/library/aesni.c |
| +++ b/library/aesni.c |
| @@ -41,6 +41,17 @@ |
| #include <immintrin.h> |
| #endif |
| |
| +#if defined(MBEDTLS_ARCH_IS_X86) |
| +#if defined(MBEDTLS_COMPILER_IS_GCC) |
| +#pragma GCC push_options |
| +#pragma GCC target ("pclmul,sse2,aes") |
| +#define MBEDTLS_POP_TARGET_PRAGMA |
| +#elif defined(__clang__) |
| +#pragma clang attribute push (__attribute__((target("pclmul,sse2,aes"))), apply_to=function) |
| +#define MBEDTLS_POP_TARGET_PRAGMA |
| +#endif |
| +#endif |
| + |
| #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) |
| /* |
| * AES-NI support detection routine |
| @@ -396,6 +407,15 @@ static void aesni_setkey_enc_256(unsigned char *rk_bytes, |
| } |
| #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */ |
| |
| +#if defined(MBEDTLS_POP_TARGET_PRAGMA) |
| +#if defined(__clang__) |
| +#pragma clang attribute pop |
| +#elif defined(__GNUC__) |
| +#pragma GCC pop_options |
| +#endif |
| +#undef MBEDTLS_POP_TARGET_PRAGMA |
| +#endif |
| + |
| #else /* MBEDTLS_AESNI_HAVE_CODE == 1 */ |
| |
| #if defined(__has_feature) |
| diff --git a/library/aesni.h b/library/aesni.h |
| index ba1429029..37ae02c82 100644 |
| --- a/library/aesni.h |
| +++ b/library/aesni.h |
| @@ -50,6 +50,10 @@ |
| #if defined(__GNUC__) && defined(__AES__) && defined(__PCLMUL__) |
| #define MBEDTLS_AESNI_HAVE_INTRINSICS |
| #endif |
| +/* For 32-bit, we only support intrinsics */ |
| +#if defined(MBEDTLS_ARCH_IS_X86) && (defined(__GNUC__) || defined(__clang__)) |
| +#define MBEDTLS_AESNI_HAVE_INTRINSICS |
| +#endif |
| |
| /* Choose the implementation of AESNI, if one is available. |
| * |
| @@ -60,13 +64,11 @@ |
| #if defined(MBEDTLS_AESNI_HAVE_INTRINSICS) |
| #define MBEDTLS_AESNI_HAVE_CODE 2 // via intrinsics |
| #elif defined(MBEDTLS_HAVE_ASM) && \ |
| - defined(__GNUC__) && defined(MBEDTLS_ARCH_IS_X64) |
| + (defined(__GNUC__) || defined(__clang__)) && defined(MBEDTLS_ARCH_IS_X64) |
| /* Can we do AESNI with inline assembly? |
| * (Only implemented with gas syntax, only for 64-bit.) |
| */ |
| #define MBEDTLS_AESNI_HAVE_CODE 1 // via assembly |
| -#elif defined(__GNUC__) |
| -# error "Must use `-mpclmul -msse2 -maes` for MBEDTLS_AESNI_C" |
| #else |
| #error "MBEDTLS_AESNI_C defined, but neither intrinsics nor assembly available" |
| #endif |
| -- |
| 2.34.1 |