diff options
author | Adam Langley <agl@chromium.org> | 2014-07-31 23:16:48 +0400 |
---|---|---|
committer | Adam Langley <agl@google.com> | 2014-08-01 02:42:15 +0400 |
commit | 31ebde9e5e7573f70e132e63abf65036688b46ec (patch) | |
tree | 60ebe30b2bb4489272f8ae7e5205743af831ea69 /crypto/cpu-arm.c | |
parent | eb7d2ed1fe8a33b3e3871502ba7e12efaf94360c (diff) |
Add a control to disable the Poly1305 NEON code.
Some phones have a buggy NEON unit and the Poly1305 NEON code fails on
them, even though other NEON code appears to work fine.
This change:
1) Fixes a bug where NEON was assumed even when the code wasn't compiled
in NEON mode.
2) Adds a second NEON control bit that can be disabled in order to run
NEON code, but not the Poly1305 NEON code.
https://code.google.com/p/chromium/issues/detail?id=341598
Change-Id: Icb121bf8dba47c7a46c7667f676ff7a4bc973625
Reviewed-on: https://boringssl-review.googlesource.com/1351
Reviewed-by: Adam Langley <agl@google.com>
Diffstat (limited to 'crypto/cpu-arm.c')
-rw-r--r-- | crypto/cpu-arm.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/crypto/cpu-arm.c b/crypto/cpu-arm.c index 8b97fc1f..814df266 100644 --- a/crypto/cpu-arm.c +++ b/crypto/cpu-arm.c @@ -64,9 +64,9 @@ #include "arm_arch.h" #if defined(__ARM_NEON__) -uint32_t OPENSSL_armcap_P = ARMV7_NEON; +uint32_t OPENSSL_armcap_P = ARMV7_NEON | ARMV7_NEON_FUNCTIONAL; #else -uint32_t OPENSSL_armcap_P = ARMV7_NEON; +uint32_t OPENSSL_armcap_P = ARMV7_NEON_FUNCTIONAL; #endif char CRYPTO_is_NEON_capable() { @@ -81,4 +81,17 @@ void CRYPTO_set_NEON_capable(char neon_capable) { } } +char CRYPTO_is_NEON_functional() { + static const uint32_t kWantFlags = ARMV7_NEON | ARMV7_NEON_FUNCTIONAL; + return (OPENSSL_armcap_P & kWantFlags) == kWantFlags; +} + +void CRYPTO_set_NEON_functional(char neon_functional) { + if (neon_functional) { + OPENSSL_armcap_P |= ARMV7_NEON_FUNCTIONAL; + } else { + OPENSSL_armcap_P &= ~ARMV7_NEON_FUNCTIONAL; + } +} + #endif /* defined(OPENSSL_ARM) */ |