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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 N-nI1tt 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).