Merge pull request #8406 from beni-sandu/aesni
AES-NI: use target attributes for x86 32-bit intrinsics
This commit is contained in:
commit
b06d701f56
3 changed files with 58 additions and 8 deletions
|
@ -43,6 +43,17 @@
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
#endif
|
#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)
|
#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
|
||||||
/*
|
/*
|
||||||
* AES-NI support detection routine
|
* AES-NI support detection routine
|
||||||
|
@ -398,6 +409,15 @@ static void aesni_setkey_enc_256(unsigned char *rk_bytes,
|
||||||
}
|
}
|
||||||
#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
|
#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 */
|
#else /* MBEDTLS_AESNI_HAVE_CODE == 1 */
|
||||||
|
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
|
|
|
@ -50,6 +50,10 @@
|
||||||
#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__)
|
#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__)
|
||||||
#define MBEDTLS_AESNI_HAVE_INTRINSICS
|
#define MBEDTLS_AESNI_HAVE_INTRINSICS
|
||||||
#endif
|
#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.
|
/* Choose the implementation of AESNI, if one is available.
|
||||||
*
|
*
|
||||||
|
@ -60,13 +64,11 @@
|
||||||
#if defined(MBEDTLS_AESNI_HAVE_INTRINSICS)
|
#if defined(MBEDTLS_AESNI_HAVE_INTRINSICS)
|
||||||
#define MBEDTLS_AESNI_HAVE_CODE 2 // via intrinsics
|
#define MBEDTLS_AESNI_HAVE_CODE 2 // via intrinsics
|
||||||
#elif defined(MBEDTLS_HAVE_ASM) && \
|
#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?
|
/* Can we do AESNI with inline assembly?
|
||||||
* (Only implemented with gas syntax, only for 64-bit.)
|
* (Only implemented with gas syntax, only for 64-bit.)
|
||||||
*/
|
*/
|
||||||
#define MBEDTLS_AESNI_HAVE_CODE 1 // via assembly
|
#define MBEDTLS_AESNI_HAVE_CODE 1 // via assembly
|
||||||
#elif defined(__GNUC__) || defined(__clang__)
|
|
||||||
# error "Must use `-mpclmul -msse2 -maes` for MBEDTLS_AESNI_C"
|
|
||||||
#else
|
#else
|
||||||
#error "MBEDTLS_AESNI_C defined, but neither intrinsics nor assembly available"
|
#error "MBEDTLS_AESNI_C defined, but neither intrinsics nor assembly available"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4469,8 +4469,6 @@ component_test_aesni () { # ~ 60s
|
||||||
not grep -q "AES note: built-in implementation." ./programs/test/selftest
|
not grep -q "AES note: built-in implementation." ./programs/test/selftest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
support_test_aesni_m32() {
|
support_test_aesni_m32() {
|
||||||
support_test_m32_o0 && (lscpu | grep -qw aes)
|
support_test_m32_o0 && (lscpu | grep -qw aes)
|
||||||
}
|
}
|
||||||
|
@ -4486,10 +4484,10 @@ component_test_aesni_m32 () { # ~ 60s
|
||||||
scripts/config.py unset MBEDTLS_AES_USE_HARDWARE_ONLY
|
scripts/config.py unset MBEDTLS_AES_USE_HARDWARE_ONLY
|
||||||
scripts/config.py set MBEDTLS_HAVE_ASM
|
scripts/config.py set MBEDTLS_HAVE_ASM
|
||||||
|
|
||||||
# test the intrinsics implementation
|
# test the intrinsics implementation with gcc
|
||||||
msg "AES tests, test intrinsics"
|
msg "AES tests, test intrinsics (gcc)"
|
||||||
make clean
|
make clean
|
||||||
make CC=gcc CFLAGS='-m32 -Werror -Wall -Wextra -mpclmul -msse2 -maes' LDFLAGS='-m32'
|
make CC=gcc CFLAGS='-m32 -Werror -Wall -Wextra' LDFLAGS='-m32'
|
||||||
# check that we built intrinsics - this should be used by default when supported by the compiler
|
# check that we built intrinsics - this should be used by default when supported by the compiler
|
||||||
./programs/test/selftest aes | grep "AESNI code" | grep -q "intrinsics"
|
./programs/test/selftest aes | grep "AESNI code" | grep -q "intrinsics"
|
||||||
grep -q "AES note: using AESNI" ./programs/test/selftest
|
grep -q "AES note: using AESNI" ./programs/test/selftest
|
||||||
|
@ -4511,6 +4509,36 @@ component_test_aesni_m32 () { # ~ 60s
|
||||||
not grep -q mbedtls_aesni_has_support ./programs/test/selftest
|
not grep -q mbedtls_aesni_has_support ./programs/test/selftest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
support_test_aesni_m32_clang() {
|
||||||
|
support_test_aesni_m32 && if command -v clang > /dev/null ; then
|
||||||
|
# clang >= 4 is required to build with target attributes
|
||||||
|
clang_ver="$(clang --version|grep version|sed -E 's#.*version ([0-9]+).*#\1#')"
|
||||||
|
[[ "${clang_ver}" -ge 4 ]]
|
||||||
|
else
|
||||||
|
# clang not available
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
component_test_aesni_m32_clang() {
|
||||||
|
|
||||||
|
scripts/config.py set MBEDTLS_AESNI_C
|
||||||
|
scripts/config.py set MBEDTLS_PADLOCK_C
|
||||||
|
scripts/config.py unset MBEDTLS_AES_USE_HARDWARE_ONLY
|
||||||
|
scripts/config.py set MBEDTLS_HAVE_ASM
|
||||||
|
|
||||||
|
# test the intrinsics implementation with clang
|
||||||
|
msg "AES tests, test intrinsics (clang)"
|
||||||
|
make clean
|
||||||
|
make CC=clang CFLAGS='-m32 -Werror -Wall -Wextra' LDFLAGS='-m32'
|
||||||
|
# check that we built intrinsics - this should be used by default when supported by the compiler
|
||||||
|
./programs/test/selftest aes | grep "AESNI code" | grep -q "intrinsics"
|
||||||
|
grep -q "AES note: using AESNI" ./programs/test/selftest
|
||||||
|
grep -q "AES note: built-in implementation." ./programs/test/selftest
|
||||||
|
grep -q "AES note: using VIA Padlock" ./programs/test/selftest
|
||||||
|
grep -q mbedtls_aesni_has_support ./programs/test/selftest
|
||||||
|
}
|
||||||
|
|
||||||
# For timebeing, no aarch64 gcc available in CI and no arm64 CI node.
|
# For timebeing, no aarch64 gcc available in CI and no arm64 CI node.
|
||||||
component_build_aes_aesce_armcc () {
|
component_build_aes_aesce_armcc () {
|
||||||
msg "Build: AESCE test on arm64 platform without plain C."
|
msg "Build: AESCE test on arm64 platform without plain C."
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue