Support detecting AVX512BW, AVX512VL, VAES, and VPCLMULQDQ
Add helper functions that check the AVX512BW, AVX512VL, VAES, and
VPCLMULQDQ feature bits in the CPU capability words. Also, make sure
that OPENSSL_cpuid_setup() clears VAES and VPCLMULQDQ when they are
unsupported due to the operating system not supporting ymm registers.
Change-Id: I2d672556acc269ef09ab6f5e080d37cb9831e7ce
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/68908
Commit-Queue: Bob Beck <bbe@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Auto-Submit: Eric Biggers <ebiggers@google.com>
diff --git a/crypto/cpu_intel.c b/crypto/cpu_intel.c
index 3453fa3..10e7871 100644
--- a/crypto/cpu_intel.c
+++ b/crypto/cpu_intel.c
@@ -228,6 +228,8 @@
ecx &= ~(1u << 12); // FMA
ecx &= ~(1u << 11); // AMD XOP
extended_features[0] &= ~(1u << 5); // AVX2
+ extended_features[1] &= ~(1u << 9); // VAES
+ extended_features[1] &= ~(1u << 10); // VPCLMULQDQ
}
// See Intel manual, volume 1, sections 15.2 ("Detection of AVX-512 Foundation
// Instructions") through 15.4 ("Detection of Intel AVX-512 Instruction Groups
diff --git a/crypto/internal.h b/crypto/internal.h
index 209c85a..4ec12f5 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -1564,6 +1564,38 @@
return !hardware_supports_xsave && CRYPTO_is_MOVBE_capable();
}
+OPENSSL_INLINE int CRYPTO_is_AVX512BW_capable(void) {
+#if defined(__AVX512BW__)
+ return 1;
+#else
+ return (OPENSSL_get_ia32cap(2) & (1u << 30)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_AVX512VL_capable(void) {
+#if defined(__AVX512VL__)
+ return 1;
+#else
+ return (OPENSSL_get_ia32cap(2) & (1u << 31)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_VAES_capable(void) {
+#if defined(__VAES__)
+ return 1;
+#else
+ return (OPENSSL_get_ia32cap(3) & (1u << 9)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_VPCLMULQDQ_capable(void) {
+#if defined(__VPCLMULQDQ__)
+ return 1;
+#else
+ return (OPENSSL_get_ia32cap(3) & (1u << 10)) != 0;
+#endif
+}
+
#endif // OPENSSL_X86 || OPENSSL_X86_64
#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)