Merge #10820: Use cpuid intrinsics instead of asm code

674848fe1 Clarify entropy source (Pieter Wuille)
a9e82f651 Use cpuid intrinsics instead of asm code (Pieter Wuille)

Pull request description:

  Less platform-specific code is better.

Tree-SHA512: 14f1b9accd9882859acdf516d2ada7ccb0ad92a3b3edf95b9cb8a8e514d4b1748d4555bcfb560779792c4f664f920d681ae42e9cebd0e6410f13f94c3a8729a0
This commit is contained in:
Pieter Wuille 2017-07-16 11:49:45 -07:00
commit ef37f2033c
No known key found for this signature in database
GPG Key ID: A636E97631F767E0

View File

@ -36,6 +36,10 @@
#include <mutex> #include <mutex>
#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>
@ -72,18 +76,9 @@ static bool rdrand_supported = false;
static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000; static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
static void RDRandInit() static void RDRandInit()
{ {
uint32_t eax, ecx, edx; uint32_t eax, ebx, ecx, edx;
#if defined(__i386__) && ( defined(__PIC__) || defined(__PIE__)) if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) && (ecx & CPUID_F1_ECX_RDRAND)) {
// Avoid clobbering ebx, as that is used for PIC on x86. LogPrintf("Using RdRand as an additional entropy source\n");
uint32_t tmp;
__asm__ ("mov %%ebx, %1; cpuid; mov %1, %%ebx": "=a"(eax), "=g"(tmp), "=c"(ecx), "=d"(edx) : "a"(1));
#else
uint32_t ebx;
__asm__ ("cpuid": "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(1));
#endif
//! When calling cpuid function #1, ecx register will have this set if RDRAND is available.
if (ecx & CPUID_F1_ECX_RDRAND) {
LogPrintf("Using RdRand as entropy source\n");
rdrand_supported = true; rdrand_supported = true;
} }
hwrand_initialized.store(true); hwrand_initialized.store(true);