From 2e6523aa10f0029cf9c66c8e12cf72c5f7f03e8b Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 14 Dec 2019 16:04:37 +0100 Subject: [PATCH 1/9] MSR mod for Windows --- cmake/randomx.cmake | 4 +- src/crypto/rx/Rx.cpp | 2 +- src/crypto/rx/Rx_windows.cpp | 216 +++++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 src/crypto/rx/Rx_windows.cpp diff --git a/cmake/randomx.cmake b/cmake/randomx.cmake index 74f4048e..18939970 100644 --- a/cmake/randomx.cmake +++ b/cmake/randomx.cmake @@ -79,7 +79,9 @@ if (WITH_RANDOMX) ) endif() - if (XMRIG_OS_LINUX AND NOT XMRIG_ARM) + 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) endif() else() diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index f6685fbf..8ee611f9 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -115,7 +115,7 @@ void xmrig::Rx::init(IRxListener *listener) } -#if !defined(XMRIG_OS_LINUX) || defined(XMRIG_ARM) +#if (!defined(XMRIG_OS_LINUX) && !defined(_WIN32)) || defined(XMRIG_ARM) void xmrig::Rx::osInit(const RxConfig &) { } diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp new file mode 100644 index 00000000..0d89db32 --- /dev/null +++ b/src/crypto/rx/Rx_windows.cpp @@ -0,0 +1,216 @@ +/* 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 2000 Transmeta Corporation + * Copyright 2004-2008 H. Peter Anvin + * 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/Rx.h" +#include "backend/common/Tags.h" +#include "backend/cpu/Cpu.h" +#include "base/io/log/Log.h" +#include "base/kernel/Platform.h" +#include "crypto/rx/RxConfig.h" + +#include +#include +#include + +#define SERVICE_NAME L"WinRing0_1_2_0" + +static SC_HANDLE hManager; +static SC_HANDLE hService; + +static bool uninstall_driver() +{ + bool result = true; + DWORD err; + SERVICE_STATUS serviceStatus; + if (!ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus)) { + err = GetLastError(); + LOG_ERR("Failed to stop WinRing0 driver, error %u", err); + result = false; + } + if (!DeleteService(hService)) { + err = GetLastError(); + LOG_ERR("Failed to remove WinRing0 driver, error %u", err); + result = false; + } + return result; +} + +static HANDLE install_driver() +{ + DWORD err = 0; + + hManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); + if (!hManager) { + err = GetLastError(); + LOG_ERR("Failed to open service control manager, error %u", err); + return 0; + } + + std::vector dir; + dir.resize(MAX_PATH); + do { + dir.resize(dir.size() * 2); + DWORD len = GetModuleFileNameW(NULL, dir.data(), dir.size()); + err = GetLastError(); + } while (err == ERROR_INSUFFICIENT_BUFFER); + + if (err != ERROR_SUCCESS) { + LOG_ERR("Failed to get path to driver, error %u", err); + return 0; + } + + for (auto it = dir.end(); it != dir.begin(); --it) { + if ((*it == L'\\') || (*it == L'/')) { + ++it; + *it = L'\0'; + break; + } + } + + std::wstring driverPath = dir.data(); + driverPath += L"WinRing0x64.sys"; + + hService = OpenServiceW(hManager, SERVICE_NAME, SERVICE_ALL_ACCESS); + if (hService) { + if (!uninstall_driver()) { + return 0; + } + CloseServiceHandle(hService); + hService = 0; + } + else { + err = GetLastError(); + if (err != ERROR_SERVICE_DOES_NOT_EXIST) { + LOG_ERR("Failed to open WinRing0 driver, error %u", err); + return 0; + } + } + + hService = CreateServiceW(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverPath.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr); + if (!hService) { + LOG_ERR("Failed to install WinRing0 driver, error %u", err); + } + + if (!StartService(hService, 0, nullptr)) { + err = GetLastError(); + if (err != ERROR_SERVICE_ALREADY_RUNNING) { + LOG_ERR("Failed to start WinRing0 driver, error %u", err); + return 0; + } + } + + HANDLE hDriver = CreateFileW(L"\\\\.\\" SERVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + if (!hDriver) { + err = GetLastError(); + LOG_ERR("Failed to connect to WinRing0 driver, error %u", err); + return 0; + } + + return hDriver; +} + + +#define IOCTL_WRITE_MSR CTL_CODE(40000, 0x822, METHOD_BUFFERED, FILE_ANY_ACCESS) + +static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { + struct { + uint32_t reg; + uint32_t value[2]; + } input; + static_assert(sizeof(input) == 12, "Invalid struct size for WinRing0 driver"); + + input.reg = reg; + *((uint64_t*)input.value) = value; + + DWORD output; + DWORD k; + if (!DeviceIoControl(hDriver, IOCTL_WRITE_MSR, &input, sizeof(input), &output, sizeof(output), &k, nullptr)) { + const DWORD err = GetLastError(); + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, xmrig::rx_tag(), reg, value); + return false; + } + + return true; +} + + +void xmrig::Rx::osInit(const RxConfig &config) +{ + if ((config.wrmsr() < 0) || !ICpuInfo::isX64()) { + return; + } + + const char* msr_mod_variant = (Cpu::info()->assembly() == Assembly::RYZEN) ? "Ryzen" : + ((Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) ? "Intel" : nullptr); + + if (!msr_mod_variant) { + return; + } + + LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: loading WinRing0 driver", xmrig::rx_tag()); + + HANDLE hDriver = install_driver(); + if (!hDriver) { + if (hService) { + uninstall_driver(); + CloseServiceHandle(hService); + } + if (hManager) { + CloseServiceHandle(hManager); + } + return; + } + + LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: setting MSR register values for %s", xmrig::rx_tag(), msr_mod_variant); + + std::thread wrmsr_thread([hDriver, &config]() { + for (uint32_t i = 0, n = std::thread::hardware_concurrency(); i < n; ++i) { + Platform::setThreadAffinity(i); + if (Cpu::info()->assembly() == Assembly::RYZEN) { + wrmsr(hDriver, 0xC0011020, 0); + wrmsr(hDriver, 0xC0011021, 0x40); + wrmsr(hDriver, 0xC0011022, 0x510000); + wrmsr(hDriver, 0xC001102b, 0x1808cc16); + } + else if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) { + wrmsr(hDriver, 0x1a4, config.wrmsr()); + } + } + }); + wrmsr_thread.join(); + + CloseHandle(hDriver); + + uninstall_driver(); + + CloseServiceHandle(hService); + CloseServiceHandle(hManager); + + LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: all done, WinRing0 driver unloaded", xmrig::rx_tag()); +} From 5a2c3d8396db015c2a3dd785a5b69561d6902b5c Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 14 Dec 2019 22:30:41 +0700 Subject: [PATCH 2/9] v5.3.0-dev --- src/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/version.h b/src/version.h index a17ed41e..74d47b4f 100644 --- a/src/version.h +++ b/src/version.h @@ -28,15 +28,15 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig miner" -#define APP_VERSION "5.2.1" +#define APP_VERSION "5.3.0-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" #define APP_KIND "miner" #define APP_VER_MAJOR 5 -#define APP_VER_MINOR 2 -#define APP_VER_PATCH 1 +#define APP_VER_MINOR 3 +#define APP_VER_PATCH 0 #ifdef _MSC_VER # if (_MSC_VER >= 1920) From 222fcfae87debe38f4a05998c7bded0b61f2c0c2 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 14 Dec 2019 16:30:46 +0100 Subject: [PATCH 3/9] Fixed thread count for MSR mod --- src/crypto/rx/Rx_windows.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index 0d89db32..a98a4334 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -190,7 +190,7 @@ void xmrig::Rx::osInit(const RxConfig &config) LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: setting MSR register values for %s", xmrig::rx_tag(), msr_mod_variant); std::thread wrmsr_thread([hDriver, &config]() { - for (uint32_t i = 0, n = std::thread::hardware_concurrency(); i < n; ++i) { + for (uint32_t i = 0, n = Cpu::info()->threads(); i < n; ++i) { Platform::setThreadAffinity(i); if (Cpu::info()->assembly() == Assembly::RYZEN) { wrmsr(hDriver, 0xC0011020, 0); From 5d0fd2dc8e1603137d98e349846a016768af6e3f Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Dec 2019 01:32:41 +0700 Subject: [PATCH 4/9] Unified Linux/Windows MSR log messages. --- src/base/io/log/Log.h | 2 + src/crypto/rx/Rx_linux.cpp | 48 +++++++++-- src/crypto/rx/Rx_windows.cpp | 154 +++++++++++++++++++++++------------ 3 files changed, 141 insertions(+), 63 deletions(-) diff --git a/src/base/io/log/Log.h b/src/base/io/log/Log.h index cfd3c3a3..c7e0c3f4 100644 --- a/src/base/io/log/Log.h +++ b/src/base/io/log/Log.h @@ -83,6 +83,7 @@ private: #define WHITE_BOLD_S CSI "1;37m" // actually white #define GREEN_BG_BOLD_S CSI "42;1m" +#define YELLOW_BG_BOLD_S CSI "43;1m" #define BLUE_BG_S CSI "44m" #define BLUE_BG_BOLD_S CSI "44;1m" #define MAGENTA_BG_S CSI "45m" @@ -109,6 +110,7 @@ private: #define WHITE_BOLD(x) WHITE_BOLD_S x CLEAR #define GREEN_BG_BOLD(x) GREEN_BG_BOLD_S x CLEAR +#define YELLOW_BG_BOLD(x) YELLOW_BG_BOLD_S x CLEAR #define BLUE_BG(x) BLUE_BG_S x CLEAR #define BLUE_BG_BOLD(x) BLUE_BG_BOLD_S x CLEAR #define MAGENTA_BG(x) MAGENTA_BG_S x CLEAR diff --git a/src/crypto/rx/Rx_linux.cpp b/src/crypto/rx/Rx_linux.cpp index 782467a7..98d343f4 100644 --- a/src/crypto/rx/Rx_linux.cpp +++ b/src/crypto/rx/Rx_linux.cpp @@ -28,12 +28,13 @@ #include "crypto/rx/Rx.h" -#include "backend/common/Tags.h" #include "backend/cpu/Cpu.h" #include "base/io/log/Log.h" +#include "base/tools/Chrono.h" #include "crypto/rx/RxConfig.h" +#include #include #include #include @@ -47,6 +48,18 @@ 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 inline int dir_filter(const struct dirent *dirp) { return isdigit(dirp->d_name[0]) ? 1 : 0; @@ -88,7 +101,7 @@ static bool wrmsr_on_all_cpus(uint32_t reg, uint64_t value) free(namelist); if (errors) { - LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, rx_tag(), reg, value); + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, tag, reg, value); } return errors == 0; @@ -98,7 +111,7 @@ static bool wrmsr_on_all_cpus(uint32_t reg, uint64_t value) static bool wrmsr_modprobe() { if (system("/sbin/modprobe msr > /dev/null 2>&1") != 0) { - LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "msr kernel module is not available", rx_tag()); + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "msr kernel module is not available", tag); return false; } @@ -116,16 +129,33 @@ void xmrig::Rx::osInit(const RxConfig &config) return; } - if (Cpu::info()->assembly() == Assembly::RYZEN && wrmsr_modprobe()) { - wrmsr_on_all_cpus(0xC0011022, 0x510000); - wrmsr_on_all_cpus(0xC001102b, 0x1808cc16); - wrmsr_on_all_cpus(0xC0011020, 0); - wrmsr_on_all_cpus(0xC0011021, 0x40); + 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; } - if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL && wrmsr_modprobe()) { + 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); } diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index a98a4334..f592cd03 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -7,9 +7,10 @@ * Copyright 2017-2019 XMR-Stak , * Copyright 2018 Lee Clagett * Copyright 2018-2019 tevador - * Copyright 2018-2019 SChernykh * Copyright 2000 Transmeta Corporation * Copyright 2004-2008 H. Peter Anvin + * Copyright 2007-2009 hiyohiyo , + * Copyright 2018-2019 SChernykh * Copyright 2016-2019 XMRig , * * This program is free software: you can redistribute it and/or modify @@ -28,61 +29,96 @@ #include "crypto/rx/Rx.h" -#include "backend/common/Tags.h" #include "backend/cpu/Cpu.h" #include "base/io/log/Log.h" #include "base/kernel/Platform.h" +#include "base/tools/Chrono.h" #include "crypto/rx/RxConfig.h" + #include +#include #include #include + #define SERVICE_NAME L"WinRing0_1_2_0" + +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 SC_HANDLE hManager; static SC_HANDLE hService; -static bool uninstall_driver() + +static bool wrmsr_uninstall_driver() { + if (!hService) { + return true; + } + bool result = true; - DWORD err; SERVICE_STATUS serviceStatus; + if (!ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus)) { - err = GetLastError(); - LOG_ERR("Failed to stop WinRing0 driver, error %u", err); + LOG_ERR(CLEAR "%s" RED_S "failed to stop WinRing0 driver, error %u", tag, GetLastError()); result = false; } + if (!DeleteService(hService)) { - err = GetLastError(); - LOG_ERR("Failed to remove WinRing0 driver, error %u", err); + LOG_ERR(CLEAR "%s" RED_S "failed to remove WinRing0 driver, error %u", tag, GetLastError()); result = false; } + + CloseServiceHandle(hService); + hService = nullptr; + return result; } -static HANDLE install_driver() + +static HANDLE wrmsr_install_driver() { DWORD err = 0; hManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); if (!hManager) { err = GetLastError(); - LOG_ERR("Failed to open service control manager, error %u", err); - return 0; + + if (err == ERROR_ACCESS_DENIED) { + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "to write MSR registers Administrator privileges required.", tag); + } + else { + LOG_ERR(CLEAR "%s" RED_S "failed to open service control manager, error %u", tag, err); + } + + return nullptr; } std::vector dir; dir.resize(MAX_PATH); do { dir.resize(dir.size() * 2); - DWORD len = GetModuleFileNameW(NULL, dir.data(), dir.size()); + GetModuleFileNameW(nullptr, dir.data(), dir.size()); err = GetLastError(); } while (err == ERROR_INSUFFICIENT_BUFFER); if (err != ERROR_SUCCESS) { - LOG_ERR("Failed to get path to driver, error %u", err); - return 0; + LOG_ERR(CLEAR "%s" RED_S "failed to get path to driver, error %u", err); + return nullptr; } for (auto it = dir.end(); it != dir.begin(); --it) { @@ -97,39 +133,41 @@ static HANDLE install_driver() driverPath += L"WinRing0x64.sys"; hService = OpenServiceW(hManager, SERVICE_NAME, SERVICE_ALL_ACCESS); - if (hService) { - if (!uninstall_driver()) { - return 0; - } - CloseServiceHandle(hService); - hService = 0; + if (hService && !wrmsr_uninstall_driver()) { + return nullptr; } - else { - err = GetLastError(); - if (err != ERROR_SERVICE_DOES_NOT_EXIST) { - LOG_ERR("Failed to open WinRing0 driver, error %u", err); - return 0; - } + + err = GetLastError(); + if (err != ERROR_SERVICE_DOES_NOT_EXIST) { + LOG_ERR(CLEAR "%s" RED_S "failed to open WinRing0 driver, error %u", tag, err); + + return nullptr; } hService = CreateServiceW(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverPath.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr); if (!hService) { - LOG_ERR("Failed to install WinRing0 driver, error %u", err); + LOG_ERR(CLEAR "%s" RED_S "failed to install WinRing0 driver, error %u", tag, GetLastError()); + + return nullptr; } if (!StartService(hService, 0, nullptr)) { err = GetLastError(); if (err != ERROR_SERVICE_ALREADY_RUNNING) { - LOG_ERR("Failed to start WinRing0 driver, error %u", err); - return 0; + LOG_ERR(CLEAR "%s" RED_S "failed to start WinRing0 driver, error %u", tag, err); + + CloseServiceHandle(hService); + hService = nullptr; + + return nullptr; } } HANDLE hDriver = CreateFileW(L"\\\\.\\" SERVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (!hDriver) { - err = GetLastError(); - LOG_ERR("Failed to connect to WinRing0 driver, error %u", err); - return 0; + LOG_ERR(CLEAR "%s" RED_S "failed to connect to WinRing0 driver, error %u", tag, GetLastError()); + + return nullptr; } return hDriver; @@ -138,11 +176,13 @@ static HANDLE 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) { struct { - uint32_t reg; - uint32_t value[2]; + uint32_t reg = 0; + uint32_t value[2]{}; } input; + static_assert(sizeof(input) == 12, "Invalid struct size for WinRing0 driver"); input.reg = reg; @@ -150,9 +190,10 @@ static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { DWORD output; DWORD k; + if (!DeviceIoControl(hDriver, IOCTL_WRITE_MSR, &input, sizeof(input), &output, sizeof(output), &k, nullptr)) { - const DWORD err = GetLastError(); - LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, xmrig::rx_tag(), reg, value); + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S "cannot set MSR 0x%08" PRIx32 " to 0x%08" PRIx64, tag, reg, value); + return false; } @@ -160,57 +201,62 @@ static bool wrmsr(HANDLE hDriver, uint32_t reg, uint64_t value) { } +} // namespace xmrig + + void xmrig::Rx::osInit(const RxConfig &config) { if ((config.wrmsr() < 0) || !ICpuInfo::isX64()) { return; } - const char* msr_mod_variant = (Cpu::info()->assembly() == Assembly::RYZEN) ? "Ryzen" : - ((Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) ? "Intel" : nullptr); + 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 (!msr_mod_variant) { + if (mod == MSR_MOD_NONE) { return; } - LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: loading WinRing0 driver", xmrig::rx_tag()); + const uint64_t ts = Chrono::steadyMSecs(); - HANDLE hDriver = install_driver(); + HANDLE hDriver = wrmsr_install_driver(); if (!hDriver) { - if (hService) { - uninstall_driver(); - CloseServiceHandle(hService); - } + wrmsr_uninstall_driver(); + if (hManager) { CloseServiceHandle(hManager); } + return; } - LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: setting MSR register values for %s", xmrig::rx_tag(), msr_mod_variant); - - std::thread wrmsr_thread([hDriver, &config]() { + std::thread wrmsr_thread([hDriver, mod, &config]() { for (uint32_t i = 0, n = Cpu::info()->threads(); i < n; ++i) { Platform::setThreadAffinity(i); - if (Cpu::info()->assembly() == Assembly::RYZEN) { + + if (mod == MSR_MOD_RYZEN) { wrmsr(hDriver, 0xC0011020, 0); wrmsr(hDriver, 0xC0011021, 0x40); wrmsr(hDriver, 0xC0011022, 0x510000); wrmsr(hDriver, 0xC001102b, 0x1808cc16); } - else if (Cpu::info()->vendor() == ICpuInfo::VENDOR_INTEL) { + else if (mod == MSR_MOD_INTEL) { wrmsr(hDriver, 0x1a4, config.wrmsr()); } } }); + wrmsr_thread.join(); CloseHandle(hDriver); - uninstall_driver(); - - CloseServiceHandle(hService); + wrmsr_uninstall_driver(); CloseServiceHandle(hManager); - LOG_INFO(CLEAR "%s" GREEN_BOLD_S "MSR mod: all done, WinRing0 driver unloaded", xmrig::rx_tag()); + 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); } From a6f381403cc8ffda6836bdd31ddd6e7677c2b6d1 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Dec 2019 01:48:48 +0700 Subject: [PATCH 5/9] Added WinRing0 driver binary. --- CMakeLists.txt | 5 +++++ bin/WinRing0/LICENSE | 21 +++++++++++++++++++++ bin/WinRing0/WinRing0x64.sys | Bin 0 -> 14544 bytes 3 files changed, 26 insertions(+) create mode 100644 bin/WinRing0/LICENSE create mode 100644 bin/WinRing0/WinRing0x64.sys diff --git a/CMakeLists.txt b/CMakeLists.txt index b65d5337..b990d67d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,3 +209,8 @@ endif() add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES}) target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY}) + +if (WIN32) + add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/bin/WinRing0/WinRing0x64.sys" $) +endif() diff --git a/bin/WinRing0/LICENSE b/bin/WinRing0/LICENSE new file mode 100644 index 00000000..f34a6e96 --- /dev/null +++ b/bin/WinRing0/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2007-2009 OpenLibSys.org. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/bin/WinRing0/WinRing0x64.sys b/bin/WinRing0/WinRing0x64.sys new file mode 100644 index 0000000000000000000000000000000000000000..197c255adea745c8a78f529c8a38a3ceaf68711d GIT binary patch literal 14544 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 literal 0 HcmV?d00001 From fb5b87352429a120fb99d81c296d530cc039e680 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Dec 2019 01:52:20 +0700 Subject: [PATCH 6/9] Added missing tag. --- src/crypto/rx/Rx_windows.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index f592cd03..62ce3700 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -117,7 +117,7 @@ static HANDLE wrmsr_install_driver() } while (err == ERROR_INSUFFICIENT_BUFFER); if (err != ERROR_SUCCESS) { - LOG_ERR(CLEAR "%s" RED_S "failed to get path to driver, error %u", err); + LOG_ERR(CLEAR "%s" RED_S "failed to get path to driver, error %u", tag, err); return nullptr; } From b346507975d519be31b4a92a80958a1673a98f8b Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Dec 2019 03:13:52 +0700 Subject: [PATCH 7/9] Added enable_1gb_pages.sh --- scripts/enable_1gb_pages.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 scripts/enable_1gb_pages.sh diff --git a/scripts/enable_1gb_pages.sh b/scripts/enable_1gb_pages.sh new file mode 100755 index 00000000..16d889f1 --- /dev/null +++ b/scripts/enable_1gb_pages.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +# https://xmrig.com/docs/miner/hugepages#onegb-huge-pages + +sysctl -w vm.nr_hugepages=$(nproc) + +for i in $(find /sys/devices/system/node/node* -maxdepth 0 -type d); +do + echo 3 > "$i/hugepages/hugepages-1048576kB/nr_hugepages"; +done + +echo "1GB pages successfully enabled" \ No newline at end of file From 6adba6dad4a6f83556c7fcfc1059e1d7fb44d12a Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Dec 2019 12:02:45 +0700 Subject: [PATCH 8/9] Removed unnecessary check. --- src/crypto/rx/Rx_windows.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index 62ce3700..a12030e4 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -137,13 +137,6 @@ static HANDLE wrmsr_install_driver() return nullptr; } - err = GetLastError(); - if (err != ERROR_SERVICE_DOES_NOT_EXIST) { - LOG_ERR(CLEAR "%s" RED_S "failed to open WinRing0 driver, error %u", tag, err); - - return nullptr; - } - hService = CreateServiceW(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverPath.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr); if (!hService) { LOG_ERR(CLEAR "%s" RED_S "failed to install WinRing0 driver, error %u", tag, GetLastError()); From 014c80f15dcfc2a5773dc36d9489999241119ad6 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 15 Dec 2019 15:02:49 +0700 Subject: [PATCH 9/9] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3777102..5d4ed0e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v5.3.0 +- [#1414](https://github.com/xmrig/xmrig/pull/1414) Added native MSR support for Windows, by using signed **WinRing0 driver** (© 2007-2009 OpenLibSys.org). +- Added new [MSR documentation](https://xmrig.com/docs/miner/randomx-optimization-guide/msr). + # v5.2.1 - [#1408](https://github.com/xmrig/xmrig/pull/1408) Added RandomX boost script for Linux (if you don't like run miner with root privileges). - Added support for [AMD Ryzen MSR registers](https://www.reddit.com/r/MoneroMining/comments/e962fu/9526_hs_on_ryzen_7_3700x_xmrig_520_1gb_pages_msr/) (Linux only).