Allow ARM capabilities to be set at compile time.
Some ARM environments don't support |getauxval| or signals and need to
configure the capabilities of the chip at compile time. This change adds
defines that allow them to do so.
Change-Id: I4e6987f69dd13444029bc7ac7ed4dbf8fb1faa76
Reviewed-on: https://boringssl-review.googlesource.com/6280
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/cpu-arm.c b/crypto/cpu-arm.c
index 6e037ab..14ad2ee 100644
--- a/crypto/cpu-arm.c
+++ b/crypto/cpu-arm.c
@@ -14,15 +14,14 @@
#include <openssl/cpu.h>
-#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
+#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
+ !defined(OPENSSL_STATIC_ARMCAP)
#include <inttypes.h>
#include <string.h>
-#if !defined(OPENSSL_TRUSTY)
#include <setjmp.h>
#include <signal.h>
-#endif
#include <openssl/arm_arch.h>
@@ -33,6 +32,8 @@
unsigned long getauxval(unsigned long type) __attribute__((weak));
+extern uint32_t OPENSSL_armcap_P;
+
char CRYPTO_is_NEON_capable(void) {
return (OPENSSL_armcap_P & ARMV7_NEON) != 0;
}
@@ -62,7 +63,15 @@
}
}
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && !defined(OPENSSL_TRUSTY)
+int CRYPTO_is_ARMv8_AES_capable(void) {
+ return (OPENSSL_armcap_P & ARMV8_AES) != 0;
+}
+
+int CRYPTO_is_ARMv8_PMULL_capable(void) {
+ return (OPENSSL_armcap_P & ARMV8_PMULL) != 0;
+}
+
+#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM)
static sigjmp_buf sigill_jmp;
@@ -120,7 +129,7 @@
return 0;
}
-#endif /* !OPENSSL_NO_ASM && OPENSSL_ARM && !OPENSSL_TRUSTY */
+#endif /* !OPENSSL_NO_ASM && OPENSSL_ARM */
void OPENSSL_cpuid_setup(void) {
if (getauxval == NULL) {
@@ -186,4 +195,5 @@
}
}
-#endif /* defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) */
+#endif /* (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) &&
+ !defined(OPENSSL_STATIC_ARMCAP) */