From 48a72fa81f80c8a3c7c6de8339b5feb361dece1c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 20 Jan 2022 18:57:27 +0100 Subject: Add sha256_arm_shani to build system Also rename AArch64 intrinsics to ARMv8 intrinsics as these are not necessarily limited to 64-bit --- src/crypto/sha256.cpp | 46 +++++++++++++++++++++++++++++++++++++++++ src/crypto/sha256_arm_shani.cpp | 22 ++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/crypto/sha256_arm_shani.cpp (limited to 'src/crypto') diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp index 48ee121e2d..7ba86c7ffa 100644 --- a/src/crypto/sha256.cpp +++ b/src/crypto/sha256.cpp @@ -10,6 +10,16 @@ #include +#if defined(__linux__) && defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL) +#include +#include +#endif + +#if defined(MAC_OSX) && defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL) +#include +#include +#endif + #if defined(__x86_64__) || defined(__amd64__) || defined(__i386__) #if defined(USE_ASM) namespace sha256_sse4 @@ -39,6 +49,11 @@ namespace sha256_x86_shani void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks); } +namespace sha256_arm_shani +{ +void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks); +} + // Internal implementation code. namespace { @@ -623,6 +638,37 @@ std::string SHA256AutoDetect() #endif #endif +#if defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL) + bool have_arm_shani = false; + +#if defined(__linux__) +#if defined(__arm__) // 32-bit + if (getauxval(AT_HWCAP2) & HWCAP2_SHA2) { + have_arm_shani = true; + } +#endif +#if defined(__aarch64__) // 64-bit + if (getauxval(AT_HWCAP) & HWCAP_SHA2) { + have_arm_shani = true; + } +#endif +#endif + +#if defined(MAC_OSX) + int val = 0; + size_t len = sizeof(val); + if (sysctlbyname("hw.optional.arm.FEAT_SHA256", &val, &len, nullptr, 0) == 0) { + have_arm_shani = val != 0; + } +#endif + + if (have_arm_shani) { + Transform = sha256_arm_shani::Transform; + TransformD64 = TransformD64Wrapper; + ret = "arm_shani(1way)"; + } +#endif + assert(SelfTest()); return ret; } diff --git a/src/crypto/sha256_arm_shani.cpp b/src/crypto/sha256_arm_shani.cpp new file mode 100644 index 0000000000..92b1d0e299 --- /dev/null +++ b/src/crypto/sha256_arm_shani.cpp @@ -0,0 +1,22 @@ +// Copyright (c) 2022 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// +// Based on https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-arm.c, +// Written and placed in public domain by Jeffrey Walton. +// Based on code from ARM, and by Johannes Schneiders, Skip Hovsmith and +// Barry O'Rourke for the mbedTLS project. + +#ifdef ENABLE_ARM_SHANI + +#include +#include + +namespace sha256_arm_shani { +void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks) +{ + +} +} + +#endif -- cgit v1.2.3