From 8bef964f68ba32d401a76625bcd6f4af78d8daa0 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 17 Dec 2019 02:27:07 +0700 Subject: [PATCH] Added support for write custom MSR. --- CMakeLists.txt | 1 + cmake/randomx.cmake | 19 +++- src/backend/cpu/interfaces/ICpuInfo.h | 11 +- src/backend/cpu/platform/AdvancedCpuInfo.cpp | 8 +- src/backend/cpu/platform/AdvancedCpuInfo.h | 2 + src/backend/cpu/platform/BasicCpuInfo.cpp | 9 +- src/backend/cpu/platform/BasicCpuInfo.h | 2 + src/crypto/rx/Rx.cpp | 18 +++- src/crypto/rx/Rx.h | 3 +- src/crypto/rx/RxConfig.cpp | 108 ++++++++++++++++--- src/crypto/rx/RxConfig.h | 24 ++++- src/crypto/rx/Rx_linux.cpp | 84 ++++++++++----- src/crypto/rx/Rx_windows.cpp | 89 +++++++-------- src/crypto/rx/msr/MsrItem.cpp | 65 +++++++++++ src/crypto/rx/msr/MsrItem.h | 71 ++++++++++++ 15 files changed, 408 insertions(+), 106 deletions(-) create mode 100644 src/crypto/rx/msr/MsrItem.cpp create mode 100644 src/crypto/rx/msr/MsrItem.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b990d67dd..8d7084e72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON) option(WITH_DEBUG_LOG "Enable debug log output" OFF) option(WITH_TLS "Enable OpenSSL support" ON) option(WITH_ASM "Enable ASM PoW implementations" ON) +option(WITH_MSR "Enable MSR support" ON) option(WITH_EMBEDDED_CONFIG "Enable internal embedded JSON config" OFF) option(WITH_OPENCL "Enable OpenCL backend" ON) option(WITH_CUDA "Enable CUDA backend" ON) diff --git a/cmake/randomx.cmake b/cmake/randomx.cmake index 18939970a..4f3bacb7a 100644 --- a/cmake/randomx.cmake +++ b/cmake/randomx.cmake @@ -79,10 +79,21 @@ if (WITH_RANDOMX) ) endif() - if (WIN32) - list(APPEND SOURCES_CRYPTO src/crypto/rx/Rx_windows.cpp) - elseif (XMRIG_OS_LINUX AND NOT XMRIG_ARM) - list(APPEND SOURCES_CRYPTO src/crypto/rx/Rx_linux.cpp) + if (WITH_MSR AND NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND (XMRIG_OS_WIN OR XMRIG_OS_LINUX)) + add_definitions(/DXMRIG_FEATURE_MSR) + message("-- WITH_MSR=ON") + + if (XMRIG_OS_WIN) + list(APPEND SOURCES_CRYPTO src/crypto/rx/Rx_windows.cpp) + elseif (XMRIG_OS_LINUX) + list(APPEND SOURCES_CRYPTO src/crypto/rx/Rx_linux.cpp) + endif() + + list(APPEND HEADERS_CRYPTO src/crypto/rx/msr/MsrItem.h) + list(APPEND SOURCES_CRYPTO src/crypto/rx/msr/MsrItem.cpp) + else() + remove_definitions(/DXMRIG_FEATURE_MSR) + message("-- WITH_MSR=OFF") endif() else() remove_definitions(/DXMRIG_ALGO_RANDOMX) diff --git a/src/backend/cpu/interfaces/ICpuInfo.h b/src/backend/cpu/interfaces/ICpuInfo.h index 674668b59..f7e9fcfaa 100644 --- a/src/backend/cpu/interfaces/ICpuInfo.h +++ b/src/backend/cpu/interfaces/ICpuInfo.h @@ -37,12 +37,20 @@ namespace xmrig { class ICpuInfo { public: - enum Vendor { + enum Vendor : uint32_t { VENDOR_UNKNOWN, VENDOR_INTEL, VENDOR_AMD }; + enum MsrMod : uint32_t { + MSR_MOD_NONE, + MSR_MOD_RYZEN, + MSR_MOD_INTEL, + MSR_MOD_CUSTOM, + MSR_MOD_MAX + }; + virtual ~ICpuInfo() = default; # if defined(__x86_64__) || defined(_M_AMD64) || defined (__arm64__) || defined (__aarch64__) @@ -58,6 +66,7 @@ public: virtual const char *backend() const = 0; virtual const char *brand() const = 0; virtual CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const = 0; + virtual MsrMod msrMod() const = 0; virtual size_t cores() const = 0; virtual size_t L2() const = 0; virtual size_t L3() const = 0; diff --git a/src/backend/cpu/platform/AdvancedCpuInfo.cpp b/src/backend/cpu/platform/AdvancedCpuInfo.cpp index 4a3c6f62e..20496ff13 100644 --- a/src/backend/cpu/platform/AdvancedCpuInfo.cpp +++ b/src/backend/cpu/platform/AdvancedCpuInfo.cpp @@ -139,7 +139,13 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() : m_aes = true; if (m_vendor == VENDOR_AMD) { - m_assembly = (data.ext_family >= 23) ? Assembly::RYZEN : Assembly::BULLDOZER; + if (data.ext_family >= 23) { + m_assembly = Assembly::RYZEN; + m_msrMod = MSR_MOD_RYZEN; + } + else { + m_assembly = Assembly::BULLDOZER; + } } else if (m_vendor == VENDOR_INTEL) { m_assembly = Assembly::INTEL; diff --git a/src/backend/cpu/platform/AdvancedCpuInfo.h b/src/backend/cpu/platform/AdvancedCpuInfo.h index f6691b8f7..beafa57ca 100644 --- a/src/backend/cpu/platform/AdvancedCpuInfo.h +++ b/src/backend/cpu/platform/AdvancedCpuInfo.h @@ -46,6 +46,7 @@ protected: inline bool hasOneGbPages() const override { return m_pdpe1gb; } inline const char *backend() const override { return m_backend; } inline const char *brand() const override { return m_brand; } + inline MsrMod msrMod() const override { return m_msrMod; } inline size_t cores() const override { return m_cores; } inline size_t L2() const override { return m_L2; } inline size_t L3() const override { return m_L3; } @@ -62,6 +63,7 @@ private: char m_backend[32]{}; char m_brand[64 + 5]{}; const bool m_pdpe1gb = false; + MsrMod m_msrMod = MSR_MOD_NONE; size_t m_cores = 0; size_t m_L2 = 0; size_t m_L3 = 0; diff --git a/src/backend/cpu/platform/BasicCpuInfo.cpp b/src/backend/cpu/platform/BasicCpuInfo.cpp index b586fad03..1dfede21c 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.cpp +++ b/src/backend/cpu/platform/BasicCpuInfo.cpp @@ -175,11 +175,18 @@ xmrig::BasicCpuInfo::BasicCpuInfo() : cpuid(PROCESSOR_INFO, data); const int32_t family = get_masked(data[EAX_Reg], 12, 8) + get_masked(data[EAX_Reg], 28, 20); - m_assembly = family >= 23 ? Assembly::RYZEN : Assembly::BULLDOZER; + if (family >= 23) { + m_assembly = Assembly::RYZEN; + m_msrMod = MSR_MOD_RYZEN; + } + else { + m_assembly = Assembly::BULLDOZER; + } } else if (memcmp(vendor, "GenuineIntel", 12) == 0) { m_vendor = VENDOR_INTEL; m_assembly = Assembly::INTEL; + m_msrMod = MSR_MOD_INTEL; } } # endif diff --git a/src/backend/cpu/platform/BasicCpuInfo.h b/src/backend/cpu/platform/BasicCpuInfo.h index 019c1dc04..b1139920d 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.h +++ b/src/backend/cpu/platform/BasicCpuInfo.h @@ -46,6 +46,7 @@ protected: inline bool hasAVX2() const override { return m_avx2; } inline bool hasOneGbPages() const override { return m_pdpe1gb; } inline const char *brand() const override { return m_brand; } + inline MsrMod msrMod() const override { return m_msrMod; } inline size_t cores() const override { return 0; } inline size_t L2() const override { return 0; } inline size_t L3() const override { return 0; } @@ -63,6 +64,7 @@ private: bool m_aes = false; const bool m_avx2 = false; const bool m_pdpe1gb = false; + MsrMod m_msrMod = MSR_MOD_NONE; Vendor m_vendor = VENDOR_UNKNOWN; }; diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index 8ee611f90..7ff7e1c45 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -73,7 +73,7 @@ bool xmrig::Rx::init(const Job &job, const RxConfig &config, const CpuConfig &cp } if (!osInitialized) { - osInit(config); + msrInit(config); osInitialized = true; } @@ -103,6 +103,10 @@ xmrig::RxDataset *xmrig::Rx::dataset(const Job &job, uint32_t nodeId) void xmrig::Rx::destroy() { + if (osInitialized) { + msrDestroy(); + } + delete d_ptr; d_ptr = nullptr; @@ -115,8 +119,16 @@ void xmrig::Rx::init(IRxListener *listener) } -#if (!defined(XMRIG_OS_LINUX) && !defined(_WIN32)) || defined(XMRIG_ARM) -void xmrig::Rx::osInit(const RxConfig &) +#ifndef XMRIG_FEATURE_MSR +void xmrig::Rx::msrInit(const RxConfig &) +{ +} + + +void xmrig::Rx::msrDestroy() { } #endif + + + diff --git a/src/crypto/rx/Rx.h b/src/crypto/rx/Rx.h index 1a289b052..200523e96 100644 --- a/src/crypto/rx/Rx.h +++ b/src/crypto/rx/Rx.h @@ -58,7 +58,8 @@ public: static void init(IRxListener *listener); private: - static void osInit(const RxConfig &config); + static void msrInit(const RxConfig &config); + static void msrDestroy(); }; diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index e11aaba6a..bdd3db2da 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -57,6 +57,23 @@ static const char *kNUMA = "numa"; static const std::array modeNames = { "auto", "fast", "light" }; + +#ifdef XMRIG_FEATURE_MSR +constexpr size_t kMsrArraySize = 4; + +static const std::array msrPresets = { + MsrItems(), + MsrItems{{ 0xC0011020, 0x0 }, { 0xC0011021, 0x40 }, { 0xC0011022, 0x510000 }, { 0xC001102b, 0x1808cc16 }}, + MsrItems{{ 0x1a4, 0x6 }}, + MsrItems() +}; + +static const std::array modNames = { "none", "ryzen", "intel", "custom" }; + +static_assert (kMsrArraySize == ICpuInfo::MSR_MOD_MAX, "kMsrArraySize and MSR_MOD_MAX mismatch"); +#endif + + } @@ -65,7 +82,10 @@ bool xmrig::RxConfig::read(const rapidjson::Value &value) if (value.IsObject()) { m_threads = Json::getInt(value, kInit, m_threads); m_mode = readMode(Json::getValue(value, kMode)); - m_wrmsr = readMSR(Json::getValue(value, kWrmsr)); + +# ifdef XMRIG_FEATURE_MSR + readMSR(Json::getValue(value, kWrmsr)); +# endif # ifdef XMRIG_OS_LINUX m_oneGbPages = Json::getBool(value, kOneGbPages, m_oneGbPages); @@ -110,12 +130,23 @@ rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const obj.AddMember(StringRef(kMode), StringRef(modeName()), allocator); obj.AddMember(StringRef(kOneGbPages), m_oneGbPages, allocator); - if (m_wrmsr < 0 || m_wrmsr == 6) { - obj.AddMember(StringRef(kWrmsr), m_wrmsr == 6, allocator); +# ifdef XMRIG_FEATURE_MSR + if (!m_msrPreset.empty()) { + Value wrmsr(kArrayType); + wrmsr.Reserve(m_msrPreset.size(), allocator); + + for (const auto &i : m_msrPreset) { + wrmsr.PushBack(i.toJSON(doc), allocator); + } + + obj.AddMember(StringRef(kWrmsr), wrmsr, allocator); } else { obj.AddMember(StringRef(kWrmsr), m_wrmsr, allocator); } +# else + obj.AddMember(StringRef(kWrmsr), false, allocator); +# endif # ifdef XMRIG_FEATURE_HWLOC if (!m_nodeset.empty()) { @@ -168,20 +199,71 @@ uint32_t xmrig::RxConfig::threads(uint32_t limit) const } -int xmrig::RxConfig::readMSR(const rapidjson::Value &value) const +#ifdef XMRIG_FEATURE_MSR +const char *xmrig::RxConfig::msrPresetName() const { - if (value.IsInt()) { - return std::min(value.GetInt(), 15); - } - - if (value.IsBool() && !value.GetBool()) { - return -1; - } - - return m_wrmsr; + return modNames[msrMod()]; } +const xmrig::MsrItems &xmrig::RxConfig::msrPreset() const +{ + const auto mod = msrMod(); + + if (mod == ICpuInfo::MSR_MOD_CUSTOM) { + return m_msrPreset; + } + + return msrPresets[mod]; +} + + +uint32_t xmrig::RxConfig::msrMod() const +{ + if (!wrmsr()) { + return ICpuInfo::MSR_MOD_NONE; + } + + if (!m_msrPreset.empty()) { + return ICpuInfo::MSR_MOD_CUSTOM; + } + + return Cpu::info()->msrMod(); +} + + +void xmrig::RxConfig::readMSR(const rapidjson::Value &value) +{ + if (value.IsBool()) { + m_wrmsr = value.GetBool(); + + return; + } + + if (value.IsInt()) { + const int i = std::min(value.GetInt(), 15); + if (i >= 0) { + m_msrPreset.emplace_back(0x1a4, i); + } + else { + m_wrmsr = false; + } + } + + if (value.IsArray()) { + for (const auto &i : value.GetArray()) { + MsrItem item(i); + if (item.isValid()) { + m_msrPreset.emplace_back(item); + } + } + + m_wrmsr = !m_msrPreset.empty(); + } +} +#endif + + xmrig::RxConfig::Mode xmrig::RxConfig::readMode(const rapidjson::Value &value) const { if (value.IsUint()) { diff --git a/src/crypto/rx/RxConfig.h b/src/crypto/rx/RxConfig.h index bf5992a32..f29a593de 100644 --- a/src/crypto/rx/RxConfig.h +++ b/src/crypto/rx/RxConfig.h @@ -29,6 +29,11 @@ #include "rapidjson/fwd.h" +#ifdef XMRIG_FEATURE_MSR +# include "crypto/rx/msr/MsrItem.h" +#endif + + #include @@ -58,17 +63,30 @@ public: uint32_t threads(uint32_t limit = 100) const; inline bool isOneGbPages() const { return m_oneGbPages; } - inline int wrmsr() const { return m_wrmsr; } + inline bool wrmsr() const { return m_wrmsr; } inline Mode mode() const { return m_mode; } +# ifdef XMRIG_FEATURE_MSR + const char *msrPresetName() const; + const MsrItems &msrPreset() const; +# endif + private: - int readMSR(const rapidjson::Value &value) const; +# ifdef XMRIG_FEATURE_MSR + uint32_t msrMod() const; + void readMSR(const rapidjson::Value &value); + + bool m_wrmsr = true; + MsrItems m_msrPreset; +# else + bool m_wrmsr = false; +# endif + Mode readMode(const rapidjson::Value &value) const; bool m_numa = true; bool m_oneGbPages = false; int m_threads = -1; - int m_wrmsr = 6; Mode m_mode = AutoMode; # ifdef XMRIG_FEATURE_HWLOC diff --git a/src/crypto/rx/Rx_linux.cpp b/src/crypto/rx/Rx_linux.cpp index 98d343f48..ad33b1717 100644 --- a/src/crypto/rx/Rx_linux.cpp +++ b/src/crypto/rx/Rx_linux.cpp @@ -120,42 +120,74 @@ static bool wrmsr_modprobe() } +static bool wrmsr(const MsrItems &preset) +{ + if (!wrmsr_modprobe()) { + return false; + } + + for (const auto &i : preset) { + if (!wrmsr_on_all_cpus(i.reg(), i.value())) { + return false; + } + } + + return true; +} + + } // namespace xmrig -void xmrig::Rx::osInit(const RxConfig &config) +void xmrig::Rx::msrInit(const RxConfig &config) { - if (config.wrmsr() < 0) { - return; - } - - MsrMod mod = MSR_MOD_NONE; - if (Cpu::info()->assembly() == Assembly::RYZEN) { - mod = MSR_MOD_RYZEN; - } - else if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) { - mod = MSR_MOD_INTEL; - } - - if (mod == MSR_MOD_NONE) { + const auto &preset = config.msrPreset(); + if (preset.empty()) { return; } const uint64_t ts = Chrono::steadyMSecs(); - if (!wrmsr_modprobe()) { - return; + if (wrmsr(preset)) { + LOG_NOTICE(CLEAR "%s" GREEN_BOLD_S "register values for \"%s\" preset has been set successfully" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, config.msrPresetName(), Chrono::steadyMSecs() - ts); } - if (mod == MSR_MOD_RYZEN) { - wrmsr_on_all_cpus(0xC0011020, 0); - wrmsr_on_all_cpus(0xC0011021, 0x40); - wrmsr_on_all_cpus(0xC0011022, 0x510000); - wrmsr_on_all_cpus(0xC001102b, 0x1808cc16); - } - else if (mod == MSR_MOD_INTEL) { - wrmsr_on_all_cpus(0x1a4, config.wrmsr()); - } +// if (config.wrmsr() < 0) { +// return; +// } - LOG_NOTICE(CLEAR "%s" GREEN_BOLD_S "register values for %s has been set successfully" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, modNames[mod], Chrono::steadyMSecs() - ts); +// MsrMod mod = MSR_MOD_NONE; +// if (Cpu::info()->assembly() == Assembly::RYZEN) { +// mod = MSR_MOD_RYZEN; +// } +// else if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) { +// mod = MSR_MOD_INTEL; +// } + +// if (mod == MSR_MOD_NONE) { +// return; +// } + +// const uint64_t ts = Chrono::steadyMSecs(); + +// if (!wrmsr_modprobe()) { +// return; +// } + +// if (mod == MSR_MOD_RYZEN) { +// wrmsr_on_all_cpus(0xC0011020, 0); +// wrmsr_on_all_cpus(0xC0011021, 0x40); +// wrmsr_on_all_cpus(0xC0011022, 0x510000); +// wrmsr_on_all_cpus(0xC001102b, 0x1808cc16); +// } +// else if (mod == MSR_MOD_INTEL) { +// wrmsr_on_all_cpus(0x1a4, config.wrmsr()); +// } + +// LOG_NOTICE(CLEAR "%s" GREEN_BOLD_S "register values for %s has been set successfully" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, modNames[mod], Chrono::steadyMSecs() - ts); +} + + +void xmrig::Rx::msrDestroy() +{ } diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index 0c46eb0dd..b7ab52192 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -48,17 +48,8 @@ namespace xmrig { -enum MsrMod : uint32_t { - MSR_MOD_NONE, - MSR_MOD_RYZEN, - MSR_MOD_INTEL, - MSR_MOD_MAX -}; - - -static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " msr ") " "; -static const std::array modNames = { nullptr, "Ryzen", "Intel" }; -static bool reuseDriver = false; +static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " msr ") " "; +static bool reuseDriver = false; static SC_HANDLE hManager; @@ -189,7 +180,7 @@ static HANDLE wrmsr_install_driver() #define IOCTL_WRITE_MSR CTL_CODE(40000, 0x822, METHOD_BUFFERED, FILE_ANY_ACCESS) -static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { +static bool wrmsr(HANDLE driver, uint32_t reg, uint64_t value) { struct { uint32_t reg = 0; uint32_t value[2]{}; @@ -198,12 +189,12 @@ static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { static_assert(sizeof(input) == 12, "Invalid struct size for WinRing0 driver"); input.reg = reg; - *((uint64_t*)input.value) = value; + *(reinterpret_cast(input.value)) = value; DWORD output; DWORD k; - if (!DeviceIoControl(hDriver, IOCTL_WRITE_MSR, &input, sizeof(input), &output, sizeof(output), &k, nullptr)) { + if (!DeviceIoControl(driver, IOCTL_WRITE_MSR, &input, sizeof(input), &output, sizeof(output), &k, nullptr)) { LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, tag, reg, value); return false; @@ -213,55 +204,29 @@ static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { } -} // namespace xmrig - - -void xmrig::Rx::osInit(const RxConfig &config) +static bool wrmsr(const MsrItems &preset) { - if ((config.wrmsr() < 0) || !ICpuInfo::isX64()) { - return; - } + bool success = true; - MsrMod mod = MSR_MOD_NONE; - if (Cpu::info()->assembly() == Assembly::RYZEN) { - mod = MSR_MOD_RYZEN; - } - else if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) { - mod = MSR_MOD_INTEL; - } - - if (mod == MSR_MOD_NONE) { - return; - } - - const uint64_t ts = Chrono::steadyMSecs(); - bool success = true; - - HANDLE hDriver = wrmsr_install_driver(); - if (!hDriver) { + HANDLE driver = wrmsr_install_driver(); + if (!driver) { wrmsr_uninstall_driver(); if (hManager) { CloseServiceHandle(hManager); } - return; + return false; } - std::thread wrmsr_thread([hDriver, mod, &config, &success]() { + std::thread wrmsr_thread([driver, &preset, &success]() { for (uint32_t i = 0, n = Cpu::info()->threads(); i < n; ++i) { if (!Platform::setThreadAffinity(i)) { continue; } - if (mod == MSR_MOD_RYZEN) { - success = wrmsr(hDriver, 0xC0011020, 0) && - wrmsr(hDriver, 0xC0011021, 0x40) && - wrmsr(hDriver, 0xC0011022, 0x510000) && - wrmsr(hDriver, 0xC001102b, 0x1808cc16); - } - else if (mod == MSR_MOD_INTEL) { - success = wrmsr(hDriver, 0x1a4, config.wrmsr()); + for (const auto &i : preset) { + success = wrmsr(driver, i.reg(), i.value()); } if (!success) { @@ -272,15 +237,33 @@ void xmrig::Rx::osInit(const RxConfig &config) wrmsr_thread.join(); - CloseHandle(hDriver); + CloseHandle(driver); wrmsr_uninstall_driver(); CloseServiceHandle(hManager); - if (success) { - LOG_NOTICE(CLEAR "%s" GREEN_BOLD_S "register values for %s has been set successfully" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, modNames[mod], Chrono::steadyMSecs() - ts); + return success; +} + + +} // namespace xmrig + + +void xmrig::Rx::msrInit(const RxConfig &config) +{ + const auto &preset = config.msrPreset(); + if (preset.empty()) { + return; } - else { - LOG_ERR(CLEAR "%s" RED_BOLD_S "failed to write MSR registers" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts); + + const uint64_t ts = Chrono::steadyMSecs(); + + if (wrmsr(preset)) { + LOG_NOTICE(CLEAR "%s" GREEN_BOLD_S "register values for \"%s\" preset has been set successfully" BLACK_BOLD(" (%" PRIu64 " ms)"), tag, config.msrPresetName(), Chrono::steadyMSecs() - ts); } } + + +void xmrig::Rx::msrDestroy() +{ +} diff --git a/src/crypto/rx/msr/MsrItem.cpp b/src/crypto/rx/msr/MsrItem.cpp new file mode 100644 index 000000000..b97498e9d --- /dev/null +++ b/src/crypto/rx/msr/MsrItem.cpp @@ -0,0 +1,65 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2019 XMR-Stak , + * Copyright 2018 Lee Clagett + * Copyright 2018-2019 tevador + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * 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 "crypto/rx/msr/MsrItem.h" +#include "rapidjson/document.h" + + +#include + + +xmrig::MsrItem::MsrItem(const rapidjson::Value &value) +{ + if (!value.IsString()) { + return; + } + + auto kv = String(value.GetString()).split(':'); + if (kv.size() < 2) { + return; + } + + m_reg = strtoul(kv[0], nullptr, 0); + m_value = strtoul(kv[1], nullptr, 0); +} + + +rapidjson::Value xmrig::MsrItem::toJSON(rapidjson::Document &doc) const +{ + return toString().toJSON(doc); +} + + +xmrig::String xmrig::MsrItem::toString() const +{ + constexpr size_t size = 32; + + auto buf = new char[size](); + snprintf(buf, size, "0x%" PRIx32 ":0x%" PRIx64, m_reg, m_value); + + return buf; +} diff --git a/src/crypto/rx/msr/MsrItem.h b/src/crypto/rx/msr/MsrItem.h new file mode 100644 index 000000000..ff04bdba6 --- /dev/null +++ b/src/crypto/rx/msr/MsrItem.h @@ -0,0 +1,71 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2019 XMR-Stak , + * Copyright 2018 Lee Clagett + * Copyright 2018-2019 tevador + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * 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 . + */ + +#ifndef XMRIG_MSRITEM_H +#define XMRIG_MSRITEM_H + + +#include "base/tools/String.h" + + +#include + + +namespace xmrig +{ + + +class RxDataset; + + +class MsrItem +{ +public: + inline MsrItem() = default; + inline MsrItem(uint32_t reg, uint64_t value) : m_reg(reg), m_value(value) {} + + MsrItem(const rapidjson::Value &value); + + inline bool isValid() const { return m_reg > 0; } + inline uint32_t reg() const { return m_reg; } + inline uint64_t value() const { return m_value; } + + rapidjson::Value toJSON(rapidjson::Document &doc) const; + String toString() const; + +private: + uint32_t m_reg = 0; + uint64_t m_value = 0; +}; + + +using MsrItems = std::vector; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_MSRITEM_H */