From b2301c07ca1b41844e25a2053836f121aaf29864 Mon Sep 17 00:00:00 2001 From: sebastianstolzenberg Date: Sat, 20 Jan 2018 13:34:56 +0100 Subject: [PATCH] Fixes stub build break and maybe also arm (#31) --- CMakeLists.txt | 7 +++-- src/Cpu.cpp | 43 -------------------------- src/Cpu_arm.cpp | 11 ------- src/Cpu_cpuid.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++++ src/Cpu_stub.cpp | 18 +++-------- 5 files changed, 86 insertions(+), 70 deletions(-) create mode 100644 src/Cpu_cpuid.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3def0743..f44649f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ set(SOURCES_COMMON src/log/FileLog.cpp src/log/Log.cpp src/Platform.cpp + src/Cpu.cpp ) if (WIN32) @@ -110,7 +111,7 @@ if (WITH_LIBCPUID) include_directories(src/3rdparty/libcpuid) set(CPUID_LIB cpuid) - set(SOURCES_CPUID src/Cpu.cpp) + set(SOURCES_CPUID src/Cpu_cpuid.cpp) else() add_definitions(/DXMRIG_NO_LIBCPUID) @@ -190,7 +191,7 @@ endif (WITH_CC_SERVER OR WITH_CC_CLIENT) add_executable(xmrigMiner ${SOURCES} ${SOURCES_CRYPTO} ${HTTPD_SOURCES} ${SOURCES_CC_CLIENT} res/app.rc) -target_link_libraries(xmrigMiner xmrig_common xmrig_cpuid xmrig_os_dependencies +target_link_libraries(xmrigMiner xmrig_common xmrig_os_dependencies xmrig_cpuid ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB}) if (WITH_CC_CLIENT) @@ -202,7 +203,7 @@ add_executable(xmrigDaemon src/cc/XMRigd.cpp res/app.rc) if (WITH_CC_SERVER AND MHD_FOUND) add_executable(xmrigCCServer ${SOURCES_CC_SERVER} res/app.rc) target_link_libraries(xmrigCCServer - xmrig_common xmrig_cpuid xmrig_os_dependencies xmrig_cc_common + xmrig_common xmrig_os_dependencies xmrig_cpuid xmrig_cc_common ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB}) set_target_properties(xmrigCCServer PROPERTIES COMPILE_FLAGS "-DXMRIG_CC_SERVER ${SHARED_FLAGS}") endif() diff --git a/src/Cpu.cpp b/src/Cpu.cpp index 5f440bef..10ba818a 100644 --- a/src/Cpu.cpp +++ b/src/Cpu.cpp @@ -28,7 +28,6 @@ #include #include -#include #include #include "Cpu.h" @@ -132,48 +131,6 @@ size_t CpuImpl::availableCache() return cache; } -void CpuImpl::initCommon() -{ - struct cpu_raw_data_t raw = { 0 }; - struct cpu_id_t data = { 0 }; - - cpuid_get_raw_data(&raw); - cpu_identify(&raw, &data); - - strncpy(m_brand, data.brand_str, sizeof(m_brand) - 1); - - m_totalThreads = data.total_logical_cpus; - m_sockets = m_totalThreads / data.num_logical_cpus; - - if (m_sockets == 0) { - m_sockets = 1; - } - - m_totalCores = data.num_cores * m_sockets; - m_l3_cache = data.l3_cache > 0 ? data.l3_cache * m_sockets : 0; - - // Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97 - if (data.vendor == VENDOR_AMD && data.ext_family >= 0x15 && data.ext_family < 0x17) { - m_l2_cache = data.l2_cache * (m_totalCores / 2) * m_sockets; - m_l2_exclusive = true; - } - else { - m_l2_cache = data.l2_cache > 0 ? data.l2_cache * m_totalCores * m_sockets : 0; - } - -# if defined(__x86_64__) || defined(_M_AMD64) - m_flags |= Cpu::X86_64; -# endif - - if (data.flags[CPU_FEATURE_AES]) { - m_flags |= Cpu::AES; - } - - if (data.flags[CPU_FEATURE_BMI2]) { - m_flags |= Cpu::BMI2; - } -} - void Cpu::init() { CpuImpl::instance().init(); diff --git a/src/Cpu_arm.cpp b/src/Cpu_arm.cpp index 8b91f331..f0ccea78 100644 --- a/src/Cpu_arm.cpp +++ b/src/Cpu_arm.cpp @@ -27,17 +27,6 @@ #include "Cpu.h" -void CpuImpl::init() -{ - m_brand = {0}; - m_flags = 0; - m_l2_cache = 0; - m_l3_cache = 0; - m_sockets = 1; - m_totalCores = 0; - m_totalThreads = 0; -} - void CpuImpl::initCommon() { memcpy(m_brand, "Unknown", 7); diff --git a/src/Cpu_cpuid.cpp b/src/Cpu_cpuid.cpp new file mode 100644 index 00000000..96619e30 --- /dev/null +++ b/src/Cpu_cpuid.cpp @@ -0,0 +1,77 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2016-2017 XMRig + * Copyright 2018 Sebastian Stolzenberg + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include +#include +#include +#include + +#include +#include + +#include "Cpu.h" +#include "CpuImpl.h" + +void CpuImpl::initCommon() +{ + struct cpu_raw_data_t raw = { 0 }; + struct cpu_id_t data = { 0 }; + + cpuid_get_raw_data(&raw); + cpu_identify(&raw, &data); + + strncpy(m_brand, data.brand_str, sizeof(m_brand) - 1); + + m_totalThreads = data.total_logical_cpus; + m_sockets = m_totalThreads / data.num_logical_cpus; + + if (m_sockets == 0) { + m_sockets = 1; + } + + m_totalCores = data.num_cores * m_sockets; + m_l3_cache = data.l3_cache > 0 ? data.l3_cache * m_sockets : 0; + + // Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97 + if (data.vendor == VENDOR_AMD && data.ext_family >= 0x15 && data.ext_family < 0x17) { + m_l2_cache = data.l2_cache * (m_totalCores / 2) * m_sockets; + m_l2_exclusive = true; + } + else { + m_l2_cache = data.l2_cache > 0 ? data.l2_cache * m_totalCores * m_sockets : 0; + } + +# if defined(__x86_64__) || defined(_M_AMD64) + m_flags |= Cpu::X86_64; +# endif + + if (data.flags[CPU_FEATURE_AES]) { + m_flags |= Cpu::AES; + } + + if (data.flags[CPU_FEATURE_BMI2]) { + m_flags |= Cpu::BMI2; + } +} diff --git a/src/Cpu_stub.cpp b/src/Cpu_stub.cpp index ad3aa1ef..a9ebfcfa 100644 --- a/src/Cpu_stub.cpp +++ b/src/Cpu_stub.cpp @@ -35,6 +35,7 @@ #include "Cpu.h" +#include "CpuImpl.h" #define VENDOR_ID (0) @@ -99,28 +100,19 @@ static inline bool has_bmi2() { } -char Cpu::m_brand[64] = { 0 }; -int Cpu::m_flags = 0; -int Cpu::m_l2_cache = 0; -int Cpu::m_l3_cache = 0; -int Cpu::m_sockets = 1; -int Cpu::m_totalCores = 0; -int Cpu::m_totalThreads = 0; - - -void Cpu::initCommon() +void CpuImpl::initCommon() { cpu_brand_string(m_brand); # if defined(__x86_64__) || defined(_M_AMD64) - m_flags |= X86_64; + m_flags |= Cpu::X86_64; # endif if (has_aes_ni()) { - m_flags |= AES; + m_flags |= Cpu::AES; } if (has_bmi2()) { - m_flags |= BMI2; + m_flags |= Cpu::BMI2; } }