[MOVEONLY] Move cpuid code from random & sha256 to compat/cpuid
This commit is contained in:
1 parent
cea3902015
commit
723c796667
4 files changed
+32
-30
No files matched your search
@@ -119,6 +119,7 @@ BITCOIN_CORE_H = \
|
|||||||
compat.h \
|
compat.h \
|
||||||
compat/assumptions.h \
|
compat/assumptions.h \
|
||||||
compat/byteswap.h \
|
compat/byteswap.h \
|
||||||
|
compat/cpuid.h \
|
||||||
compat/endian.h \
|
compat/endian.h \
|
||||||
compat/sanity.h \
|
compat/sanity.h \
|
||||||
compressor.h \
|
compressor.h \
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (c) 2017-2019 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_COMPAT_CPUID_H
|
||||||
|
#define BITCOIN_COMPAT_CPUID_H
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
||||||
|
#define HAVE_GETCPUID
|
||||||
|
|
||||||
|
#include <cpuid.h>
|
||||||
|
|
||||||
|
// We can't use cpuid.h's __get_cpuid as it does not support subleafs.
|
||||||
|
void static inline GetCPUID(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d)
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__cpuid_count(leaf, subleaf, a, b, c, d);
|
||||||
|
#else
|
||||||
|
__asm__ ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "0"(leaf), "2"(subleaf));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
||||||
|
#endif // BITCOIN_COMPAT_CPUID_H
|
||||||
+5
-15
@@ -8,9 +8,10 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <compat/cpuid.h>
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
||||||
#if defined(USE_ASM)
|
#if defined(USE_ASM)
|
||||||
#include <cpuid.h>
|
|
||||||
namespace sha256_sse4
|
namespace sha256_sse4
|
||||||
{
|
{
|
||||||
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
|
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
|
||||||
@@ -546,18 +547,7 @@ bool SelfTest() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
|
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
|
||||||
// We can't use cpuid.h's __get_cpuid as it does not support subleafs.
|
|
||||||
void inline cpuid(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d)
|
|
||||||
{
|
|
||||||
#ifdef __GNUC__
|
|
||||||
__cpuid_count(leaf, subleaf, a, b, c, d);
|
|
||||||
#else
|
|
||||||
__asm__ ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "0"(leaf), "2"(subleaf));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Check whether the OS has enabled AVX registers. */
|
/** Check whether the OS has enabled AVX registers. */
|
||||||
bool AVXEnabled()
|
bool AVXEnabled()
|
||||||
{
|
{
|
||||||
@@ -572,7 +562,7 @@ bool AVXEnabled()
|
|||||||
std::string SHA256AutoDetect()
|
std::string SHA256AutoDetect()
|
||||||
{
|
{
|
||||||
std::string ret = "standard";
|
std::string ret = "standard";
|
||||||
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
|
#if defined(USE_ASM) && defined(HAVE_GETCPUID)
|
||||||
bool have_sse4 = false;
|
bool have_sse4 = false;
|
||||||
bool have_xsave = false;
|
bool have_xsave = false;
|
||||||
bool have_avx = false;
|
bool have_avx = false;
|
||||||
@@ -589,7 +579,7 @@ std::string SHA256AutoDetect()
|
|||||||
(void)enabled_avx;
|
(void)enabled_avx;
|
||||||
|
|
||||||
uint32_t eax, ebx, ecx, edx;
|
uint32_t eax, ebx, ecx, edx;
|
||||||
cpuid(1, 0, eax, ebx, ecx, edx);
|
GetCPUID(1, 0, eax, ebx, ecx, edx);
|
||||||
have_sse4 = (ecx >> 19) & 1;
|
have_sse4 = (ecx >> 19) & 1;
|
||||||
have_xsave = (ecx >> 27) & 1;
|
have_xsave = (ecx >> 27) & 1;
|
||||||
have_avx = (ecx >> 28) & 1;
|
have_avx = (ecx >> 28) & 1;
|
||||||
@@ -597,7 +587,7 @@ std::string SHA256AutoDetect()
|
|||||||
enabled_avx = AVXEnabled();
|
enabled_avx = AVXEnabled();
|
||||||
}
|
}
|
||||||
if (have_sse4) {
|
if (have_sse4) {
|
||||||
cpuid(7, 0, eax, ebx, ecx, edx);
|
GetCPUID(7, 0, eax, ebx, ecx, edx);
|
||||||
have_avx2 = (ebx >> 5) & 1;
|
have_avx2 = (ebx >> 5) & 1;
|
||||||
have_shani = (ebx >> 29) & 1;
|
have_shani = (ebx >> 29) & 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-15
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
|
|
||||||
|
#include <compat/cpuid.h>
|
||||||
#include <crypto/sha512.h>
|
#include <crypto/sha512.h>
|
||||||
#include <support/cleanse.h>
|
#include <support/cleanse.h>
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@@ -42,11 +43,6 @@
|
|||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
|
||||||
#include <cpuid.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/rand.h>
|
#include <openssl/rand.h>
|
||||||
#include <openssl/conf.h>
|
#include <openssl/conf.h>
|
||||||
@@ -77,7 +73,7 @@ static inline int64_t GetPerformanceCounter() noexcept
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
#ifdef HAVE_GETCPUID
|
||||||
static bool g_rdrand_supported = false;
|
static bool g_rdrand_supported = false;
|
||||||
static bool g_rdseed_supported = false;
|
static bool g_rdseed_supported = false;
|
||||||
static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
|
static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
|
||||||
@@ -88,15 +84,6 @@ static_assert(CPUID_F1_ECX_RDRAND == bit_RDRND, "Unexpected value for bit_RDRND"
|
|||||||
#ifdef bit_RDSEED
|
#ifdef bit_RDSEED
|
||||||
static_assert(CPUID_F7_EBX_RDSEED == bit_RDSEED, "Unexpected value for bit_RDSEED");
|
static_assert(CPUID_F7_EBX_RDSEED == bit_RDSEED, "Unexpected value for bit_RDSEED");
|
||||||
#endif
|
#endif
|
||||||
static void inline GetCPUID(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d)
|
|
||||||
{
|
|
||||||
// We can't use __get_cpuid as it doesn't support subleafs.
|
|
||||||
#ifdef __GNUC__
|
|
||||||
__cpuid_count(leaf, subleaf, a, b, c, d);
|
|
||||||
#else
|
|
||||||
__asm__ ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "0"(leaf), "2"(subleaf));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitHardwareRand()
|
static void InitHardwareRand()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user