From 039c42b1fed56c0ecbbbe3afe181e908d3747be3 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 30 Dec 2019 16:05:51 +0700 Subject: [PATCH 01/11] v5.5.1-dev --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index 9662f368..47658102 100644 --- a/src/version.h +++ b/src/version.h @@ -28,7 +28,7 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig miner" -#define APP_VERSION "5.5.0" +#define APP_VERSION "5.5.1-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" @@ -36,7 +36,7 @@ #define APP_VER_MAJOR 5 #define APP_VER_MINOR 5 -#define APP_VER_PATCH 0 +#define APP_VER_PATCH 1 #ifdef _MSC_VER # if (_MSC_VER >= 1920) From 4e5aef0a8a7d5ffe877e7026d74892d94b78cb27 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 30 Dec 2019 20:53:21 +0200 Subject: [PATCH 02/11] Auto-config for mobile Ryzen APUs --- src/backend/opencl/generators/ocl_generic_rx_generator.cpp | 7 +++++++ src/backend/opencl/runners/OclRxBaseRunner.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/opencl/generators/ocl_generic_rx_generator.cpp b/src/backend/opencl/generators/ocl_generic_rx_generator.cpp index dbe8d5f1..593d52db 100644 --- a/src/backend/opencl/generators/ocl_generic_rx_generator.cpp +++ b/src/backend/opencl/generators/ocl_generic_rx_generator.cpp @@ -29,6 +29,7 @@ #include "crypto/common/Algorithm.h" #include "crypto/randomx/randomx.h" #include "crypto/rx/RxAlgo.h" +#include "base/io/log/Log.h" namespace xmrig { @@ -40,6 +41,12 @@ bool ocl_generic_rx_generator(const OclDevice &device, const Algorithm &algorith return false; } + // Mobile Ryzen APUs + if (device.type() == OclDevice::Raven) { + threads.add(OclThread(device.index(), (device.computeUnits() > 4) ? 256 : 128, 8, 1, true, true, 6)); + return true; + } + const size_t mem = device.globalMemSize(); auto config = RxAlgo::base(algorithm); bool gcnAsm = false; diff --git a/src/backend/opencl/runners/OclRxBaseRunner.cpp b/src/backend/opencl/runners/OclRxBaseRunner.cpp index 36a31e1b..eb0ddd51 100644 --- a/src/backend/opencl/runners/OclRxBaseRunner.cpp +++ b/src/backend/opencl/runners/OclRxBaseRunner.cpp @@ -52,7 +52,7 @@ xmrig::OclRxBaseRunner::OclRxBaseRunner(size_t index, const OclLaunchData &data) m_worksize = 8; } - if (data.device.type() == OclDevice::Vega_10 || data.device.type() == OclDevice::Vega_20) { + if (data.device.type() == OclDevice::Vega_10 || data.device.type() == OclDevice::Vega_20 || data.device.type() == OclDevice::Raven) { m_gcn_version = 14; } From 29dd2c2138f3f94b31cde9d0f1ab16263084a172 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 30 Dec 2019 20:55:03 +0200 Subject: [PATCH 03/11] Cleanup --- src/backend/opencl/generators/ocl_generic_rx_generator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/opencl/generators/ocl_generic_rx_generator.cpp b/src/backend/opencl/generators/ocl_generic_rx_generator.cpp index 593d52db..788cabea 100644 --- a/src/backend/opencl/generators/ocl_generic_rx_generator.cpp +++ b/src/backend/opencl/generators/ocl_generic_rx_generator.cpp @@ -29,7 +29,6 @@ #include "crypto/common/Algorithm.h" #include "crypto/randomx/randomx.h" #include "crypto/rx/RxAlgo.h" -#include "base/io/log/Log.h" namespace xmrig { From c9f90e6770da3a67d1f2392cced6463bcd3bc50d Mon Sep 17 00:00:00 2001 From: SChernykh Date: Tue, 31 Dec 2019 11:55:07 +0200 Subject: [PATCH 04/11] Refactor Ryzen fix to fix compilation issues --- src/crypto/randomx/jit_compiler_x86.cpp | 6 +++++- src/crypto/randomx/jit_compiler_x86.hpp | 3 +++ src/crypto/rx/Rx.h | 7 +------ src/crypto/rx/Rx_linux.cpp | 14 +++++++++++--- src/crypto/rx/Rx_win.cpp | 14 +++++++++++--- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/crypto/randomx/jit_compiler_x86.cpp b/src/crypto/randomx/jit_compiler_x86.cpp index f32465bb..e521cf90 100644 --- a/src/crypto/randomx/jit_compiler_x86.cpp +++ b/src/crypto/randomx/jit_compiler_x86.cpp @@ -300,6 +300,10 @@ namespace randomx { code = allocatedCode + (codeOffset.fetch_add(59 * 64) % CodeSize); memcpy(code, codePrologue, prologueSize); memcpy(code + epilogueOffset, codeEpilogue, epilogueSize); +# ifdef XMRIG_FIX_RYZEN + mainLoopBounds.first = code + prologueSize; + mainLoopBounds.second = code + epilogueOffset; +# endif } JitCompilerX86::~JitCompilerX86() { @@ -386,7 +390,7 @@ namespace randomx { } # ifdef XMRIG_FIX_RYZEN - xmrig::Rx::setMainLoopBounds(code + prologueSize, code + epilogueOffset); + xmrig::Rx::setMainLoopBounds(mainLoopBounds); # endif codePos = prologueSize; diff --git a/src/crypto/randomx/jit_compiler_x86.hpp b/src/crypto/randomx/jit_compiler_x86.hpp index eabd6e07..02b1a80f 100644 --- a/src/crypto/randomx/jit_compiler_x86.hpp +++ b/src/crypto/randomx/jit_compiler_x86.hpp @@ -69,6 +69,9 @@ namespace randomx { int registerUsage[RegistersCount]; uint8_t* allocatedCode; uint8_t* code; +# ifdef XMRIG_FIX_RYZEN + std::pair mainLoopBounds; +# endif int32_t codePos; uint32_t vm_flags; diff --git a/src/crypto/rx/Rx.h b/src/crypto/rx/Rx.h index 1a26698d..75ba85e1 100644 --- a/src/crypto/rx/Rx.h +++ b/src/crypto/rx/Rx.h @@ -58,18 +58,13 @@ public: static void init(IRxListener *listener); # ifdef XMRIG_FIX_RYZEN - static inline const std::pair &mainLoopBounds() { return m_mainLoopBounds; } - static inline void setMainLoopBounds(const void* loopBegin, const void* loopEnd) { m_mainLoopBounds.first = loopBegin; m_mainLoopBounds.second = loopEnd; } + static void setMainLoopBounds(const std::pair& bounds); # endif private: static void msrInit(const RxConfig &config); static void msrDestroy(); static void setupMainLoopExceptionFrame(); - -# ifdef XMRIG_FIX_RYZEN - static thread_local std::pair m_mainLoopBounds; -# endif }; diff --git a/src/crypto/rx/Rx_linux.cpp b/src/crypto/rx/Rx_linux.cpp index c482ace5..c98510bd 100644 --- a/src/crypto/rx/Rx_linux.cpp +++ b/src/crypto/rx/Rx_linux.cpp @@ -180,6 +180,9 @@ static bool wrmsr(const MsrItems &preset, bool save) } +#ifdef XMRIG_FIX_RYZEN +static thread_local std::pair mainLoopBounds = { nullptr, nullptr }; + static void MainLoopHandler(int sig, siginfo_t *info, void *ucontext) { ucontext_t *ucp = (ucontext_t*) ucontext; @@ -187,7 +190,7 @@ static void MainLoopHandler(int sig, siginfo_t *info, void *ucontext) LOG_VERBOSE(YELLOW_BOLD("%s at %p"), (sig == SIGSEGV) ? "SIGSEGV" : "SIGILL", ucp->uc_mcontext.gregs[REG_RIP]); void* p = reinterpret_cast(ucp->uc_mcontext.gregs[REG_RIP]); - const std::pair& loopBounds = Rx::mainLoopBounds(); + const std::pair& loopBounds = mainLoopBounds; if ((loopBounds.first <= p) && (p < loopBounds.second)) { ucp->uc_mcontext.gregs[REG_RIP] = reinterpret_cast(loopBounds.second); @@ -197,8 +200,11 @@ static void MainLoopHandler(int sig, siginfo_t *info, void *ucontext) } } - -thread_local std::pair Rx::m_mainLoopBounds = { nullptr, nullptr }; +void Rx::setMainLoopBounds(const std::pair& bounds) +{ + mainLoopBounds = bounds; +} +#endif } // namespace xmrig @@ -235,9 +241,11 @@ void xmrig::Rx::msrDestroy() void xmrig::Rx::setupMainLoopExceptionFrame() { +# ifdef XMRIG_FIX_RYZEN struct sigaction act = {}; act.sa_sigaction = MainLoopHandler; act.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &act, nullptr); sigaction(SIGILL, &act, nullptr); +# endif } diff --git a/src/crypto/rx/Rx_win.cpp b/src/crypto/rx/Rx_win.cpp index d685592d..acfb7f01 100644 --- a/src/crypto/rx/Rx_win.cpp +++ b/src/crypto/rx/Rx_win.cpp @@ -303,6 +303,9 @@ static bool wrmsr(const MsrItems &preset, bool save) } +#ifdef XMRIG_FIX_RYZEN +static thread_local std::pair mainLoopBounds = { nullptr, nullptr }; + static LONG WINAPI MainLoopHandler(_EXCEPTION_POINTERS *ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == 0xC0000005) { @@ -320,7 +323,7 @@ static LONG WINAPI MainLoopHandler(_EXCEPTION_POINTERS *ExceptionInfo) } void* p = reinterpret_cast(ExceptionInfo->ContextRecord->Rip); - const std::pair& loopBounds = Rx::mainLoopBounds(); + const std::pair& loopBounds = mainLoopBounds; if ((loopBounds.first <= p) && (p < loopBounds.second)) { ExceptionInfo->ContextRecord->Rip = reinterpret_cast(loopBounds.second); @@ -330,8 +333,11 @@ static LONG WINAPI MainLoopHandler(_EXCEPTION_POINTERS *ExceptionInfo) return EXCEPTION_CONTINUE_SEARCH; } - -thread_local std::pair Rx::m_mainLoopBounds = { nullptr, nullptr }; +void Rx::setMainLoopBounds(const std::pair& bounds) +{ + mainLoopBounds = bounds; +} +#endif } // namespace xmrig @@ -368,5 +374,7 @@ void xmrig::Rx::msrDestroy() void xmrig::Rx::setupMainLoopExceptionFrame() { +# ifdef XMRIG_FIX_RYZEN AddVectoredExceptionHandler(1, MainLoopHandler); +# endif } From 083c61754b3df50b212f74982bfecbb728d4e885 Mon Sep 17 00:00:00 2001 From: XMRig Date: Fri, 3 Jan 2020 05:36:22 +0700 Subject: [PATCH 05/11] Fixed unwanted resume after dataset change. --- src/base/kernel/interfaces/IConfig.h | 5 +++-- src/core/Miner.cpp | 10 +++++++--- src/core/Miner.h | 4 ++-- src/version.h | 6 +++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h index f483f044..26f71469 100644 --- a/src/base/kernel/interfaces/IConfig.h +++ b/src/base/kernel/interfaces/IConfig.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -115,6 +115,7 @@ public: AccessLogFileKey = 'A', BindKey = 'b', CustomDiffKey = 1102, + CustomDiffStatsKey = 1104, DebugKey = 1101, ModeKey = 'm', PoolCoinKey = 'C', diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index bea66d71..1dc4716d 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -123,6 +123,10 @@ public: inline void handleJobChange() { + if (!enabled) { + Nonce::pause(true); + } + active = true; if (reset) { @@ -136,7 +140,7 @@ public: Nonce::touch(); if (enabled) { - Nonce::pause(false);; + Nonce::pause(false); } if (ticks == 0) { diff --git a/src/core/Miner.h b/src/core/Miner.h index f40e37f6..96ac6a16 100644 --- a/src/core/Miner.h +++ b/src/core/Miner.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 diff --git a/src/version.h b/src/version.h index 47658102..eb8e9c50 100644 --- a/src/version.h +++ b/src/version.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -31,7 +31,7 @@ #define APP_VERSION "5.5.1-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" -#define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" +#define APP_COPYRIGHT "Copyright (C) 2016-2020 xmrig.com" #define APP_KIND "miner" #define APP_VER_MAJOR 5 From 88ff8077008b78ac5868c156a9c8f0494561a84b Mon Sep 17 00:00:00 2001 From: XMRig Date: Fri, 3 Jan 2020 19:11:48 +0700 Subject: [PATCH 06/11] Fix compile warnings. --- src/crypto/common/VirtualMemory.cpp | 7 ++----- src/crypto/common/VirtualMemory.h | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/crypto/common/VirtualMemory.cpp b/src/crypto/common/VirtualMemory.cpp index 14909f1b..c6becb89 100644 --- a/src/crypto/common/VirtualMemory.cpp +++ b/src/crypto/common/VirtualMemory.cpp @@ -6,9 +6,9 @@ * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , * Copyright 2018 Lee Clagett - * Copyright 2018-2019 SChernykh * Copyright 2018-2019 tevador - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -46,9 +46,6 @@ namespace xmrig { static IMemoryPool *pool = nullptr; static std::mutex mutex; -constexpr size_t twoMiB = 2U * 1024U * 1024U; -constexpr size_t oneGiB = 1024U * 1024U * 1024U; - } // namespace xmrig diff --git a/src/crypto/common/VirtualMemory.h b/src/crypto/common/VirtualMemory.h index f27e5908..0ca30775 100644 --- a/src/crypto/common/VirtualMemory.h +++ b/src/crypto/common/VirtualMemory.h @@ -6,9 +6,9 @@ * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , * Copyright 2018 Lee Clagett - * Copyright 2018-2019 SChernykh * Copyright 2018-2019 tevador - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 From f69ba3ea1de9e4aff3ec327f6fe4fed00240167e Mon Sep 17 00:00:00 2001 From: xmrig Date: Fri, 3 Jan 2020 19:54:28 +0700 Subject: [PATCH 07/11] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67f656fe..dd65c71a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v5.x.x +- [#1469](https://github.com/xmrig/xmrig/issues/1469) Fixed build with gcc 4.8. +- [#1473](https://github.com/xmrig/xmrig/pull/1473) Added RandomX auto-config for mobile Ryzen APUs. +- [#1477](https://github.com/xmrig/xmrig/pull/1477) Fixed compilation with Clang. +- Fixed unwanted resume after RandomX dataset change. + # v5.5.0 - [#179](https://github.com/xmrig/xmrig/issues/179) Added support for [environment variables](https://xmrig.com/docs/miner/environment-variables) in config file. - [#1445](https://github.com/xmrig/xmrig/pull/1445) Removed `rx/v` algorithm. From eb20dfbc94607d6cb822dfe04d377669fd255634 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 6 Jan 2020 13:57:48 +0100 Subject: [PATCH 08/11] JIT compiler tweaks --- src/crypto/randomx/jit_compiler_x86.cpp | 52 +++++++++---------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/src/crypto/randomx/jit_compiler_x86.cpp b/src/crypto/randomx/jit_compiler_x86.cpp index e521cf90..d0b0114c 100644 --- a/src/crypto/randomx/jit_compiler_x86.cpp +++ b/src/crypto/randomx/jit_compiler_x86.cpp @@ -407,9 +407,10 @@ namespace randomx { } for (int i = 0, n = static_cast(RandomX_CurrentConfig.ProgramSize); i < n; ++i) { - Instruction instr = prog(i); + Instruction& instr = prog(i); + const uint8_t opcode = instr.opcode; *((uint64_t*)&instr) &= (uint64_t(-1) - (0xFFFF << 8)) | ((RegistersCount - 1) << 8) | ((RegistersCount - 1) << 16); - (this->*(engine[instr.opcode]))(instr); + (this->*(engine[opcode]))(instr); } emit(REX_MOV_RR, code, codePos); @@ -605,32 +606,22 @@ namespace randomx { codePos = pos; } - static const uint32_t template_IADD_M[8] = { - 0x0604034c, - 0x060c034c, - 0x0614034c, - 0x061c034c, - 0x0624034c, - 0x062c034c, - 0x0634034c, - 0x063c034c, - }; - void JitCompilerX86::h_IADD_M(const Instruction& instr) { uint8_t* const p = code; int pos = codePos; - if (instr.src != instr.dst) { + const uint32_t dst = instr.dst; + if (instr.src != dst) { genAddressReg(instr, p, pos); - emit32(template_IADD_M[instr.dst], p, pos); + emit32(0x0604034c + (dst << 19), p, pos); } else { emit(REX_ADD_RM, p, pos); - emitByte(0x86 + 8 * instr.dst, p, pos); + emitByte(0x86 + (dst << 3), p, pos); genAddressImm(instr, p, pos); } - registerUsage[instr.dst] = pos; + registerUsage[dst] = pos; codePos = pos; } @@ -660,19 +651,18 @@ namespace randomx { uint8_t* const p = code; int pos = codePos; - if (instr.src != instr.dst) { + const uint32_t dst = instr.dst; + if (instr.src != dst) { genAddressReg(instr, p, pos); - emit(REX_SUB_RM, p, pos); - emitByte(0x04 + 8 * instr.dst, p, pos); - emitByte(0x06, p, pos); + emit32(0x06042b4c + (dst << 19), p, pos); } else { emit(REX_SUB_RM, p, pos); - emitByte(0x86 + 8 * instr.dst, p, pos); + emitByte(0x86 + (dst << 3), p, pos); genAddressImm(instr, p, pos); } - registerUsage[instr.dst] = pos; + registerUsage[dst] = pos; codePos = pos; } @@ -1060,14 +1050,12 @@ namespace randomx { } } - emit(REX_ADD_I, p, pos); - emitByte(0xc0 + reg, p, pos); + *(uint32_t*)(p + pos) = 0x00c08149 + (reg << 16); const int shift = instr.getModCond() + RandomX_CurrentConfig.JumpOffset; - const uint32_t imm = (instr.getImm32() | (1UL << shift)) & ~(1UL << (shift - 1)); - emit32(imm, p, pos); - emit(REX_TEST, p, pos); - emitByte(0xc0 + reg, p, pos); - emit32(RandomX_CurrentConfig.ConditionMask_Calculated << shift, p, pos); + *(uint32_t*)(p + pos + 3) = (instr.getImm32() | (1UL << shift)) & ~(1UL << (shift - 1)); + *(uint32_t*)(p + pos + 7) = 0x00c0f749 + (reg << 16); + *(uint32_t*)(p + pos + 10) = RandomX_CurrentConfig.ConditionMask_Calculated << shift; + pos += 14; if (jmp_offset >= -128) { emitByte(JZ_SHORT, p, pos); @@ -1094,9 +1082,7 @@ namespace randomx { int pos = codePos; genAddressRegDst(instr, p, pos); - emit(REX_MOV_MR, p, pos); - emitByte(0x04 + 8 * instr.src, p, pos); - emitByte(0x06, p, pos); + emit32(0x0604894c + (static_cast(instr.src) << 19), p, pos); codePos = pos; } From c6530e352f8eb339640e040bfca28a9f075987a2 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 7 Jan 2020 10:13:01 +0700 Subject: [PATCH 09/11] Code cleanup. --- src/base/api/interfaces/IApiRequest.h | 36 +++---- src/base/api/requests/HttpApiRequest.cpp | 64 +++++++++---- src/base/api/requests/HttpApiRequest.h | 8 +- src/base/io/json/Json.cpp | 48 +++++++--- src/base/io/json/Json.h | 5 +- src/base/kernel/config/BaseConfig.cpp | 55 +++++++---- src/base/kernel/config/BaseConfig.h | 20 +++- src/base/kernel/config/BaseTransform.cpp | 114 +++++++++++------------ src/base/kernel/config/BaseTransform.h | 4 +- src/base/net/http/Http.cpp | 18 ++-- src/base/net/http/Http.h | 11 ++- src/base/net/stratum/Pool.cpp | 39 ++++---- src/base/net/stratum/Pool.h | 19 +++- src/base/net/stratum/Pools.cpp | 34 ++++--- src/base/net/stratum/Pools.h | 16 +++- src/core/config/Config.cpp | 50 +++++----- src/net/strategies/DonateStrategy.cpp | 8 +- src/net/strategies/DonateStrategy.h | 4 +- 18 files changed, 341 insertions(+), 212 deletions(-) diff --git a/src/base/api/interfaces/IApiRequest.h b/src/base/api/interfaces/IApiRequest.h index 4f74581c..c23c1652 100644 --- a/src/base/api/interfaces/IApiRequest.h +++ b/src/base/api/interfaces/IApiRequest.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -69,21 +69,23 @@ public: virtual ~IApiRequest() = default; - virtual bool accept() = 0; - virtual bool hasParseError() const = 0; - virtual bool isDone() const = 0; - virtual bool isNew() const = 0; - virtual bool isRestricted() const = 0; - virtual const rapidjson::Value &json() const = 0; - virtual const String &rpcMethod() const = 0; - virtual const String &url() const = 0; - virtual int version() const = 0; - virtual Method method() const = 0; - virtual rapidjson::Document &doc() = 0; - virtual rapidjson::Value &reply() = 0; - virtual RequestType type() const = 0; - virtual Source source() const = 0; - virtual void done(int status) = 0; + virtual bool accept() = 0; + virtual bool hasParseError() const = 0; + virtual bool isDone() const = 0; + virtual bool isNew() const = 0; + virtual bool isRestricted() const = 0; + virtual const rapidjson::Value &json() const = 0; + virtual const String &rpcMethod() const = 0; + virtual const String &url() const = 0; + virtual int version() const = 0; + virtual Method method() const = 0; + virtual rapidjson::Document &doc() = 0; + virtual rapidjson::Value &reply() = 0; + virtual RequestType type() const = 0; + virtual Source source() const = 0; + virtual void done(int status) = 0; + virtual void setRpcError(int code, const char *message = nullptr) = 0; + virtual void setRpcResult(rapidjson::Value &result) = 0; }; diff --git a/src/base/api/requests/HttpApiRequest.cpp b/src/base/api/requests/HttpApiRequest.cpp index ed13e47d..6be25e96 100644 --- a/src/base/api/requests/HttpApiRequest.cpp +++ b/src/base/api/requests/HttpApiRequest.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -53,6 +53,10 @@ static inline const char *rpcError(int code) { return "Invalid params"; } + if (code >= HTTP_STATUS_BAD_REQUEST && code <= HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED) { + return http_status_str(static_cast(code)); + } + return "Internal error"; } @@ -82,7 +86,7 @@ xmrig::HttpApiRequest::HttpApiRequest(const HttpData &req, bool restricted) : return; } - m_rpcMethod = Json::getString(json(), "method"); + m_rpcMethod = Json::getString(m_body, "method"); if (m_rpcMethod.isEmpty()) { done(RPC_INVALID_REQUEST); @@ -129,6 +133,10 @@ bool xmrig::HttpApiRequest::accept() const rapidjson::Value &xmrig::HttpApiRequest::json() const { + if (type() == REQ_JSON_RPC) { + return Json::getValue(m_body, "params"); + } + return m_body; } @@ -150,25 +158,14 @@ void xmrig::HttpApiRequest::done(int status) m_res.setStatus(HTTP_STATUS_OK); if (status != HTTP_STATUS_OK) { - if (status == HTTP_STATUS_NOT_FOUND) { - status = RPC_METHOD_NOT_FOUND; - } - - Value error(kObjectType); - error.AddMember("code", status, allocator); - error.AddMember("message", StringRef(rpcError(status)), allocator); - - reply().AddMember(StringRef(kError), error, allocator); + setRpcError(status == HTTP_STATUS_NOT_FOUND ? RPC_METHOD_NOT_FOUND : status); } else if (!reply().HasMember(kResult)) { Value result(kObjectType); result.AddMember("status", "OK", allocator); - reply().AddMember(StringRef(kResult), result, allocator); + setRpcResult(result); } - - reply().AddMember("jsonrpc", "2.0", allocator); - reply().AddMember(StringRef(kId), Value().CopyFrom(Json::getValue(json(), kId), allocator), allocator); } else { m_res.setStatus(status); @@ -176,3 +173,38 @@ void xmrig::HttpApiRequest::done(int status) m_res.end(); } + + +void xmrig::HttpApiRequest::setRpcError(int code, const char *message) +{ + using namespace rapidjson; + auto &allocator = doc().GetAllocator(); + + Value error(kObjectType); + error.AddMember("code", code, allocator); + error.AddMember("message", message ? StringRef(message) : StringRef(rpcError(code)), allocator); + + rpcDone(kError, error); +} + + +void xmrig::HttpApiRequest::setRpcResult(rapidjson::Value &result) +{ + rpcDone(kResult, result); +} + + +void xmrig::HttpApiRequest::rpcDone(const char *key, rapidjson::Value &value) +{ + ApiRequest::done(0); + + using namespace rapidjson; + auto &allocator = doc().GetAllocator(); + + reply().AddMember(StringRef(key), value, allocator); + reply().AddMember("jsonrpc", "2.0", allocator); + reply().AddMember(StringRef(kId), Value().CopyFrom(Json::getValue(m_body, kId), allocator), allocator); + + m_res.setStatus(HTTP_STATUS_OK); + m_res.end(); +} diff --git a/src/base/api/requests/HttpApiRequest.h b/src/base/api/requests/HttpApiRequest.h index 309b5a6b..2a355582 100644 --- a/src/base/api/requests/HttpApiRequest.h +++ b/src/base/api/requests/HttpApiRequest.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -53,8 +53,12 @@ protected: const rapidjson::Value &json() const override; Method method() const override; void done(int status) override; + void setRpcError(int code, const char *message = nullptr) override; + void setRpcResult(rapidjson::Value &result) override; private: + void rpcDone(const char *key, rapidjson::Value &value); + const HttpData &m_req; HttpApiResponse m_res; int m_parsed = 0; diff --git a/src/base/io/json/Json.cpp b/src/base/io/json/Json.cpp index 73862144..cd7213d2 100644 --- a/src/base/io/json/Json.cpp +++ b/src/base/io/json/Json.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -40,7 +40,9 @@ static const rapidjson::Value kNullValue; bool xmrig::Json::getBool(const rapidjson::Value &obj, const char *key, bool defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsBool()) { @@ -51,9 +53,17 @@ bool xmrig::Json::getBool(const rapidjson::Value &obj, const char *key, bool def } +bool xmrig::Json::isEmpty(const rapidjson::Value &obj) +{ + return !obj.IsObject() || obj.ObjectEmpty(); +} + + const char *xmrig::Json::getString(const rapidjson::Value &obj, const char *key, const char *defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsString()) { @@ -66,7 +76,9 @@ const char *xmrig::Json::getString(const rapidjson::Value &obj, const char *key, const rapidjson::Value &xmrig::Json::getArray(const rapidjson::Value &obj, const char *key) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return kNullValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsArray()) { @@ -79,7 +91,9 @@ const rapidjson::Value &xmrig::Json::getArray(const rapidjson::Value &obj, const const rapidjson::Value &xmrig::Json::getObject(const rapidjson::Value &obj, const char *key) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return kNullValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsObject()) { @@ -92,7 +106,9 @@ const rapidjson::Value &xmrig::Json::getObject(const rapidjson::Value &obj, cons const rapidjson::Value &xmrig::Json::getValue(const rapidjson::Value &obj, const char *key) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return kNullValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd()) { @@ -105,7 +121,9 @@ const rapidjson::Value &xmrig::Json::getValue(const rapidjson::Value &obj, const int xmrig::Json::getInt(const rapidjson::Value &obj, const char *key, int defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsInt()) { @@ -118,7 +136,9 @@ int xmrig::Json::getInt(const rapidjson::Value &obj, const char *key, int defaul int64_t xmrig::Json::getInt64(const rapidjson::Value &obj, const char *key, int64_t defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsInt64()) { @@ -131,7 +151,9 @@ int64_t xmrig::Json::getInt64(const rapidjson::Value &obj, const char *key, int6 uint64_t xmrig::Json::getUint64(const rapidjson::Value &obj, const char *key, uint64_t defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsUint64()) { @@ -144,7 +166,9 @@ uint64_t xmrig::Json::getUint64(const rapidjson::Value &obj, const char *key, ui unsigned xmrig::Json::getUint(const rapidjson::Value &obj, const char *key, unsigned defaultValue) { - assert(obj.IsObject()); + if (isEmpty(obj)) { + return defaultValue; + } auto i = obj.FindMember(key); if (i != obj.MemberEnd() && i->value.IsUint()) { @@ -169,5 +193,5 @@ rapidjson::Value xmrig::Json::normalize(double value, bool zero) bool xmrig::JsonReader::isEmpty() const { - return !m_obj.IsObject() || m_obj.ObjectEmpty(); + return Json::isEmpty(m_obj); } diff --git a/src/base/io/json/Json.h b/src/base/io/json/Json.h index b5e2a3c8..15f340a7 100644 --- a/src/base/io/json/Json.h +++ b/src/base/io/json/Json.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -37,6 +37,7 @@ class Json { public: static bool getBool(const rapidjson::Value &obj, const char *key, bool defaultValue = false); + static bool isEmpty(const rapidjson::Value &obj); static const char *getString(const rapidjson::Value &obj, const char *key, const char *defaultValue = nullptr); static const rapidjson::Value &getArray(const rapidjson::Value &obj, const char *key); static const rapidjson::Value &getObject(const rapidjson::Value &obj, const char *key); diff --git a/src/base/kernel/config/BaseConfig.cpp b/src/base/kernel/config/BaseConfig.cpp index 7b647ed0..9150dbb1 100644 --- a/src/base/kernel/config/BaseConfig.cpp +++ b/src/base/kernel/config/BaseConfig.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -47,6 +47,28 @@ #endif +namespace xmrig { + + +const char *BaseConfig::kApi = "api"; +const char *BaseConfig::kApiId = "id"; +const char *BaseConfig::kApiWorkerId = "worker-id"; +const char *BaseConfig::kAutosave = "autosave"; +const char *BaseConfig::kBackground = "background"; +const char *BaseConfig::kColors = "colors"; +const char *BaseConfig::kDryRun = "dry-run"; +const char *BaseConfig::kHttp = "http"; +const char *BaseConfig::kLogFile = "log-file"; +const char *BaseConfig::kPrintTime = "print-time"; +const char *BaseConfig::kSyslog = "syslog"; +const char *BaseConfig::kUserAgent = "user-agent"; +const char *BaseConfig::kVerbose = "verbose"; +const char *BaseConfig::kWatch = "watch"; + + +} // namespace xmrig + + bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName) { m_fileName = fileName; @@ -55,26 +77,25 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName) return false; } - m_autoSave = reader.getBool("autosave", m_autoSave); - m_background = reader.getBool("background", m_background); - m_dryRun = reader.getBool("dry-run", m_dryRun); - m_syslog = reader.getBool("syslog", m_syslog); - m_watch = reader.getBool("watch", m_watch); - m_logFile = reader.getString("log-file"); - m_userAgent = reader.getString("user-agent"); - m_version = reader.getUint("version"); + m_autoSave = reader.getBool(kAutosave, m_autoSave); + m_background = reader.getBool(kBackground, m_background); + m_dryRun = reader.getBool(kDryRun, m_dryRun); + m_syslog = reader.getBool(kSyslog, m_syslog); + m_watch = reader.getBool(kWatch, m_watch); + m_logFile = reader.getString(kLogFile); + m_userAgent = reader.getString(kUserAgent); - Log::setColors(reader.getBool("colors", Log::isColors())); - setPrintTime(reader.getUint("print-time", 60)); - setVerbose(reader.getValue("verbose")); + Log::setColors(reader.getBool(kColors, Log::isColors())); + setPrintTime(reader.getUint(kPrintTime, 60)); + setVerbose(reader.getValue(kVerbose)); - const rapidjson::Value &api = reader.getObject("api"); + const rapidjson::Value &api = reader.getObject(kApi); if (api.IsObject()) { - m_apiId = Json::getString(api, "id"); - m_apiWorkerId = Json::getString(api, "worker-id"); + m_apiId = Json::getString(api, kApiId); + m_apiWorkerId = Json::getString(api, kApiWorkerId); } - m_http.load(reader.getObject("http")); + m_http.load(reader.getObject(kHttp)); m_pools.load(reader); return m_pools.active() > 0; diff --git a/src/base/kernel/config/BaseConfig.h b/src/base/kernel/config/BaseConfig.h index 7be81828..ac0478e1 100644 --- a/src/base/kernel/config/BaseConfig.h +++ b/src/base/kernel/config/BaseConfig.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -40,6 +40,21 @@ class IJsonReader; class BaseConfig : public IConfig { public: + static const char *kApi; + static const char *kApiId; + static const char *kApiWorkerId; + static const char *kAutosave; + static const char *kBackground; + static const char *kColors; + static const char *kDryRun; + static const char *kHttp; + static const char *kLogFile; + static const char *kPrintTime; + static const char *kSyslog; + static const char *kUserAgent; + static const char *kVerbose; + static const char *kWatch; + BaseConfig() = default; inline bool isAutoSave() const { return m_autoSave; } @@ -78,7 +93,6 @@ protected: String m_logFile; String m_userAgent; uint32_t m_printTime = 60; - uint32_t m_version = 0; private: inline void setPrintTime(uint32_t printTime) { if (printTime <= 3600) { m_printTime = printTime; } } diff --git a/src/base/kernel/config/BaseTransform.cpp b/src/base/kernel/config/BaseTransform.cpp index 8a3a140e..71b3b3ad 100644 --- a/src/base/kernel/config/BaseTransform.cpp +++ b/src/base/kernel/config/BaseTransform.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -33,27 +33,17 @@ #endif +#include "base/kernel/config/BaseTransform.h" #include "base/io/json/JsonChain.h" #include "base/io/log/Log.h" -#include "base/kernel/config/BaseTransform.h" +#include "base/kernel/config/BaseConfig.h" #include "base/kernel/interfaces/IConfig.h" #include "base/kernel/Process.h" #include "base/net/stratum/Pool.h" +#include "base/net/stratum/Pools.h" #include "core/config/Config_platform.h" -namespace xmrig -{ - -static const char *kAlgo = "algo"; -static const char *kApi = "api"; -static const char *kCoin = "coin"; -static const char *kHttp = "http"; -static const char *kPools = "pools"; - -} // namespace xmrig - - void xmrig::BaseTransform::load(JsonChain &chain, Process *process, IConfigTransform &transform) { using namespace rapidjson; @@ -95,26 +85,26 @@ void xmrig::BaseTransform::finalize(rapidjson::Document &doc) using namespace rapidjson; auto &allocator = doc.GetAllocator(); - if (m_algorithm.isValid() && doc.HasMember(kPools)) { - auto &pools = doc[kPools]; + if (m_algorithm.isValid() && doc.HasMember(Pools::kPools)) { + auto &pools = doc[Pools::kPools]; for (Value &pool : pools.GetArray()) { - if (!pool.HasMember(kAlgo)) { - pool.AddMember(StringRef(kAlgo), m_algorithm.toJSON(), allocator); + if (!pool.HasMember(Pool::kAlgo)) { + pool.AddMember(StringRef(Pool::kAlgo), m_algorithm.toJSON(), allocator); } } } - if (m_coin.isValid() && doc.HasMember(kPools)) { - auto &pools = doc[kPools]; + if (m_coin.isValid() && doc.HasMember(Pools::kPools)) { + auto &pools = doc[Pools::kPools]; for (Value &pool : pools.GetArray()) { - if (!pool.HasMember(kCoin)) { - pool.AddMember(StringRef(kCoin), m_coin.toJSON(), allocator); + if (!pool.HasMember(Pool::kCoin)) { + pool.AddMember(StringRef(Pool::kCoin), m_coin.toJSON(), allocator); } } } if (m_http) { - set(doc, kHttp, "enabled", true); + set(doc, BaseConfig::kHttp, Http::kEnabled, true); } } @@ -123,20 +113,20 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch { switch (key) { case IConfig::AlgorithmKey: /* --algo */ - if (!doc.HasMember(kPools)) { + if (!doc.HasMember(Pools::kPools)) { m_algorithm = arg; } else { - return add(doc, kPools, kAlgo, arg); + return add(doc, Pools::kPools, Pool::kAlgo, arg); } break; case IConfig::CoinKey: /* --coin */ - if (!doc.HasMember(kPools)) { + if (!doc.HasMember(Pools::kPools)) { m_coin = arg; } else { - return add(doc, kPools, kCoin, arg); + return add(doc, Pools::kPools, Pool::kCoin, arg); } break; @@ -150,61 +140,61 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch char *user = new char[p - arg + 1](); strncpy(user, arg, static_cast(p - arg)); - add(doc, kPools, "user", user); - add(doc, kPools, "pass", p + 1); + add(doc, Pools::kPools, Pool::kUser, user); + add(doc, Pools::kPools, Pool::kPass, p + 1); delete [] user; } break; case IConfig::UrlKey: /* --url */ { - if (!doc.HasMember(kPools)) { - doc.AddMember(rapidjson::StringRef(kPools), rapidjson::kArrayType, doc.GetAllocator()); + if (!doc.HasMember(Pools::kPools)) { + doc.AddMember(rapidjson::StringRef(Pools::kPools), rapidjson::kArrayType, doc.GetAllocator()); } - rapidjson::Value &array = doc[kPools]; + rapidjson::Value &array = doc[Pools::kPools]; if (array.Size() == 0 || Pool(array[array.Size() - 1]).isValid()) { array.PushBack(rapidjson::kObjectType, doc.GetAllocator()); } - set(doc, array[array.Size() - 1], "url", arg); + set(doc, array[array.Size() - 1], Pool::kUrl, arg); break; } case IConfig::UserKey: /* --user */ - return add(doc, kPools, "user", arg); + return add(doc, Pools::kPools, Pool::kUser, arg); case IConfig::PasswordKey: /* --pass */ - return add(doc, kPools, "pass", arg); + return add(doc, Pools::kPools, Pool::kPass, arg); case IConfig::RigIdKey: /* --rig-id */ - return add(doc, kPools, "rig-id", arg); + return add(doc, Pools::kPools, Pool::kRigId, arg); case IConfig::FingerprintKey: /* --tls-fingerprint */ - return add(doc, kPools, "tls-fingerprint", arg); + return add(doc, Pools::kPools, Pool::kFingerprint, arg); case IConfig::SelfSelectKey: /* --self-select */ - return add(doc, kPools, "self-select", arg); + return add(doc, Pools::kPools, Pool::kSelfSelect, arg); case IConfig::LogFileKey: /* --log-file */ - return set(doc, "log-file", arg); + return set(doc, BaseConfig::kLogFile, arg); case IConfig::HttpAccessTokenKey: /* --http-access-token */ m_http = true; - return set(doc, kHttp, "access-token", arg); + return set(doc, BaseConfig::kHttp, Http::kToken, arg); case IConfig::HttpHostKey: /* --http-host */ m_http = true; - return set(doc, kHttp, "host", arg); + return set(doc, BaseConfig::kHttp, Http::kHost, arg); case IConfig::ApiWorkerIdKey: /* --api-worker-id */ - return set(doc, kApi, "worker-id", arg); + return set(doc, BaseConfig::kApi, BaseConfig::kApiWorkerId, arg); case IConfig::ApiIdKey: /* --api-id */ - return set(doc, kApi, "id", arg); + return set(doc, BaseConfig::kApi, BaseConfig::kApiId, arg); case IConfig::UserAgentKey: /* --user-agent */ - return set(doc, "user-agent", arg); + return set(doc, BaseConfig::kUserAgent, arg); case IConfig::RetriesKey: /* --retries */ case IConfig::RetryPauseKey: /* --retry-pause */ @@ -239,43 +229,43 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b { switch (key) { case IConfig::BackgroundKey: /* --background */ - return set(doc, "background", enable); + return set(doc, BaseConfig::kBackground, enable); case IConfig::SyslogKey: /* --syslog */ - return set(doc, "syslog", enable); + return set(doc, BaseConfig::kSyslog, enable); case IConfig::KeepAliveKey: /* --keepalive */ - return add(doc, kPools, "keepalive", enable); + return add(doc, Pools::kPools, Pool::kKeepalive, enable); case IConfig::TlsKey: /* --tls */ - return add(doc, kPools, "tls", enable); + return add(doc, Pools::kPools, Pool::kTls, enable); # ifdef XMRIG_FEATURE_HTTP case IConfig::DaemonKey: /* --daemon */ - return add(doc, kPools, "daemon", enable); + return add(doc, Pools::kPools, Pool::kDaemon, enable); # endif # ifndef XMRIG_PROXY_PROJECT case IConfig::NicehashKey: /* --nicehash */ - return add(doc, kPools, "nicehash", enable); + return add(doc, Pools::kPools, Pool::kNicehash, enable); # endif case IConfig::ColorKey: /* --no-color */ - return set(doc, "colors", enable); + return set(doc, BaseConfig::kColors, enable); case IConfig::HttpRestrictedKey: /* --http-no-restricted */ m_http = true; - return set(doc, kHttp, "restricted", enable); + return set(doc, BaseConfig::kHttp, Http::kRestricted, enable); case IConfig::HttpEnabledKey: /* --http-enabled */ m_http = true; break; case IConfig::DryRunKey: /* --dry-run */ - return set(doc, "dry-run", enable); + return set(doc, BaseConfig::kDryRun, enable); case IConfig::VerboseKey: /* --verbose */ - return set(doc, "verbose", enable); + return set(doc, BaseConfig::kVerbose, enable); default: break; @@ -287,27 +277,27 @@ void xmrig::BaseTransform::transformUint64(rapidjson::Document &doc, int key, ui { switch (key) { case IConfig::RetriesKey: /* --retries */ - return set(doc, "retries", arg); + return set(doc, Pools::kRetries, arg); case IConfig::RetryPauseKey: /* --retry-pause */ - return set(doc, "retry-pause", arg); + return set(doc, Pools::kRetryPause, arg); case IConfig::DonateLevelKey: /* --donate-level */ - return set(doc, "donate-level", arg); + return set(doc, Pools::kDonateLevel, arg); case IConfig::ProxyDonateKey: /* --donate-over-proxy */ - return set(doc, "donate-over-proxy", arg); + return set(doc, Pools::kDonateOverProxy, arg); case IConfig::HttpPort: /* --http-port */ m_http = true; - return set(doc, kHttp, "port", arg); + return set(doc, BaseConfig::kHttp, Http::kPort, arg); case IConfig::PrintTimeKey: /* --print-time */ - return set(doc, "print-time", arg); + return set(doc, BaseConfig::kPrintTime, arg); # ifdef XMRIG_FEATURE_HTTP case IConfig::DaemonPollKey: /* --daemon-poll-interval */ - return add(doc, kPools, "daemon-poll-interval", arg); + return add(doc, Pools::kPools, Pool::kDaemonPollInterval, arg); # endif default: diff --git a/src/base/kernel/config/BaseTransform.h b/src/base/kernel/config/BaseTransform.h index 704f0899..16ad843f 100644 --- a/src/base/kernel/config/BaseTransform.h +++ b/src/base/kernel/config/BaseTransform.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 diff --git a/src/base/net/http/Http.cpp b/src/base/net/http/Http.cpp index c58080e6..0aef85dc 100644 --- a/src/base/net/http/Http.cpp +++ b/src/base/net/http/Http.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -30,12 +30,14 @@ namespace xmrig { -static const char *kEnabled = "enabled"; -static const char *kHost = "host"; -static const char *kLocalhost = "127.0.0.1"; -static const char *kPort = "port"; -static const char *kRestricted = "restricted"; -static const char *kToken = "access-token"; + +const char *Http::kEnabled = "enabled"; +const char *Http::kHost = "host"; +const char *Http::kLocalhost = "127.0.0.1"; +const char *Http::kPort = "port"; +const char *Http::kRestricted = "restricted"; +const char *Http::kToken = "access-token"; + } diff --git a/src/base/net/http/Http.h b/src/base/net/http/Http.h index 0e8e4fbb..7ee179cd 100644 --- a/src/base/net/http/Http.h +++ b/src/base/net/http/Http.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -36,6 +36,13 @@ namespace xmrig { class Http { public: + static const char *kEnabled; + static const char *kHost; + static const char *kLocalhost; + static const char *kPort; + static const char *kRestricted; + static const char *kToken; + Http(); inline bool isAuthRequired() const { return !m_restricted || !m_token.isNull(); } diff --git a/src/base/net/stratum/Pool.cpp b/src/base/net/stratum/Pool.cpp index 59b70b11..78dd2554 100644 --- a/src/base/net/stratum/Pool.cpp +++ b/src/base/net/stratum/Pool.cpp @@ -5,9 +5,9 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2019 XMR-Stak , - * Copyright 2018-2019 SChernykh * Copyright 2019 Howard Chu - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -47,23 +47,26 @@ namespace xmrig { -static const char *kAlgo = "algo"; -static const char *kCoin = "coin"; -static const char *kDaemon = "daemon"; -static const char *kDaemonPollInterval = "daemon-poll-interval"; -static const char *kEnabled = "enabled"; -static const char *kFingerprint = "tls-fingerprint"; -static const char *kKeepalive = "keepalive"; -static const char *kNicehash = "nicehash"; -static const char *kPass = "pass"; -static const char *kRigId = "rig-id"; -static const char *kSelfSelect = "self-select"; -static const char *kTls = "tls"; -static const char *kUrl = "url"; -static const char *kUser = "user"; -const String Pool::kDefaultPassword = "x"; -const String Pool::kDefaultUser = "x"; +const String Pool::kDefaultPassword = "x"; +const String Pool::kDefaultUser = "x"; + + +const char *Pool::kAlgo = "algo"; +const char *Pool::kCoin = "coin"; +const char *Pool::kDaemon = "daemon"; +const char *Pool::kDaemonPollInterval = "daemon-poll-interval"; +const char *Pool::kEnabled = "enabled"; +const char *Pool::kFingerprint = "tls-fingerprint"; +const char *Pool::kKeepalive = "keepalive"; +const char *Pool::kNicehash = "nicehash"; +const char *Pool::kPass = "pass"; +const char *Pool::kRigId = "rig-id"; +const char *Pool::kSelfSelect = "self-select"; +const char *Pool::kTls = "tls"; +const char *Pool::kUrl = "url"; +const char *Pool::kUser = "user"; + } diff --git a/src/base/net/stratum/Pool.h b/src/base/net/stratum/Pool.h index 509b3975..782ae449 100644 --- a/src/base/net/stratum/Pool.h +++ b/src/base/net/stratum/Pool.h @@ -5,9 +5,9 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh * Copyright 2019 Howard Chu - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -55,6 +55,21 @@ public: static const String kDefaultPassword; static const String kDefaultUser; + static const char *kAlgo; + static const char *kCoin; + static const char *kDaemon; + static const char *kDaemonPollInterval; + static const char *kEnabled; + static const char *kFingerprint; + static const char *kKeepalive; + static const char *kNicehash; + static const char *kPass; + static const char *kRigId; + static const char *kSelfSelect; + static const char *kTls; + static const char *kUrl; + static const char *kUser; + constexpr static int kKeepAliveTimeout = 60; constexpr static uint16_t kDefaultPort = 3333; constexpr static uint64_t kDefaultPollInterval = 1000; diff --git a/src/base/net/stratum/Pools.cpp b/src/base/net/stratum/Pools.cpp index c88e001f..a65e26b1 100644 --- a/src/base/net/stratum/Pools.cpp +++ b/src/base/net/stratum/Pools.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -23,20 +23,30 @@ */ +#include "base/net/stratum/Pools.h" #include "base/io/log/Log.h" #include "base/kernel/interfaces/IJsonReader.h" -#include "base/net/stratum/Pools.h" #include "base/net/stratum/strategies/FailoverStrategy.h" #include "base/net/stratum/strategies/SinglePoolStrategy.h" #include "donate.h" #include "rapidjson/document.h" +namespace xmrig { + + +const char *Pools::kDonateLevel = "donate-level"; +const char *Pools::kDonateOverProxy = "donate-over-proxy"; +const char *Pools::kPools = "pools"; +const char *Pools::kRetries = "retries"; +const char *Pools::kRetryPause = "retry-pause"; + + +} // namespace xmrig + + xmrig::Pools::Pools() : - m_donateLevel(kDefaultDonateLevel), - m_retries(5), - m_retryPause(5), - m_proxyDonate(PROXY_DONATE_AUTO) + m_donateLevel(kDefaultDonateLevel) { # ifdef XMRIG_PROXY_PROJECT m_retries = 2; @@ -108,7 +118,7 @@ void xmrig::Pools::load(const IJsonReader &reader) { m_data.clear(); - const rapidjson::Value &pools = reader.getArray("pools"); + const rapidjson::Value &pools = reader.getArray(kPools); if (!pools.IsArray()) { return; } @@ -124,10 +134,10 @@ void xmrig::Pools::load(const IJsonReader &reader) } } - setDonateLevel(reader.getInt("donate-level", kDefaultDonateLevel)); - setProxyDonate(reader.getInt("donate-over-proxy", PROXY_DONATE_AUTO)); - setRetries(reader.getInt("retries")); - setRetryPause(reader.getInt("retry-pause")); + setDonateLevel(reader.getInt(kDonateLevel, kDefaultDonateLevel)); + setProxyDonate(reader.getInt(kDonateOverProxy, PROXY_DONATE_AUTO)); + setRetries(reader.getInt(kRetries)); + setRetryPause(reader.getInt(kRetryPause)); } diff --git a/src/base/net/stratum/Pools.h b/src/base/net/stratum/Pools.h index 70e17225..c2713198 100644 --- a/src/base/net/stratum/Pools.h +++ b/src/base/net/stratum/Pools.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -43,6 +43,12 @@ class IStrategyListener; class Pools { public: + static const char *kDonateLevel; + static const char *kDonateOverProxy; + static const char *kPools; + static const char *kRetries; + static const char *kRetryPause; + enum ProxyDonate { PROXY_DONATE_NONE, PROXY_DONATE_AUTO, @@ -74,9 +80,9 @@ private: void setRetryPause(int retryPause); int m_donateLevel; - int m_retries; - int m_retryPause; - ProxyDonate m_proxyDonate; + int m_retries = 5; + int m_retryPause = 5; + ProxyDonate m_proxyDonate = PROXY_DONATE_AUTO; std::vector m_data; }; diff --git a/src/core/config/Config.cpp b/src/core/config/Config.cpp index dde626f7..3998c281 100644 --- a/src/core/config/Config.cpp +++ b/src/core/config/Config.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -211,41 +211,41 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const auto &allocator = doc.GetAllocator(); Value api(kObjectType); - api.AddMember("id", m_apiId.toJSON(), allocator); - api.AddMember("worker-id", m_apiWorkerId.toJSON(), allocator); + api.AddMember(StringRef(kApiId), m_apiId.toJSON(), allocator); + api.AddMember(StringRef(kApiWorkerId), m_apiWorkerId.toJSON(), allocator); - doc.AddMember("api", api, allocator); - doc.AddMember("http", m_http.toJSON(doc), allocator); - doc.AddMember("autosave", isAutoSave(), allocator); - doc.AddMember("background", isBackground(), allocator); - doc.AddMember("colors", Log::isColors(), allocator); + doc.AddMember(StringRef(kApi), api, allocator); + doc.AddMember(StringRef(kHttp), m_http.toJSON(doc), allocator); + doc.AddMember(StringRef(kAutosave), isAutoSave(), allocator); + doc.AddMember(StringRef(kBackground), isBackground(), allocator); + doc.AddMember(StringRef(kColors), Log::isColors(), allocator); # ifdef XMRIG_ALGO_RANDOMX - doc.AddMember(StringRef(kRandomX), rx().toJSON(doc), allocator); + doc.AddMember(StringRef(kRandomX), rx().toJSON(doc), allocator); # endif - doc.AddMember(StringRef(kCPU), cpu().toJSON(doc), allocator); + doc.AddMember(StringRef(kCPU), cpu().toJSON(doc), allocator); # ifdef XMRIG_FEATURE_OPENCL - doc.AddMember(StringRef(kOcl), cl().toJSON(doc), allocator); + doc.AddMember(StringRef(kOcl), cl().toJSON(doc), allocator); # endif # ifdef XMRIG_FEATURE_CUDA - doc.AddMember(StringRef(kCuda), cuda().toJSON(doc), allocator); + doc.AddMember(StringRef(kCuda), cuda().toJSON(doc), allocator); # endif - doc.AddMember("donate-level", m_pools.donateLevel(), allocator); - doc.AddMember("donate-over-proxy", m_pools.proxyDonate(), allocator); - doc.AddMember("log-file", m_logFile.toJSON(), allocator); - doc.AddMember("pools", m_pools.toJSON(doc), allocator); - doc.AddMember("print-time", printTime(), allocator); + doc.AddMember(StringRef(Pools::kDonateLevel), m_pools.donateLevel(), allocator); + doc.AddMember(StringRef(Pools::kDonateOverProxy), m_pools.proxyDonate(), allocator); + doc.AddMember(StringRef(kLogFile), m_logFile.toJSON(), allocator); + doc.AddMember(StringRef(Pools::kPools), m_pools.toJSON(doc), allocator); + doc.AddMember(StringRef(kPrintTime), printTime(), allocator); # if defined(XMRIG_FEATURE_NVML) - doc.AddMember(StringRef(kHealthPrintTime), healthPrintTime(), allocator); + doc.AddMember(StringRef(kHealthPrintTime), healthPrintTime(), allocator); # endif - doc.AddMember("retries", m_pools.retries(), allocator); - doc.AddMember("retry-pause", m_pools.retryPause(), allocator); - doc.AddMember("syslog", isSyslog(), allocator); - doc.AddMember("user-agent", m_userAgent.toJSON(), allocator); - doc.AddMember("verbose", Log::verbose(), allocator); - doc.AddMember("watch", m_watch, allocator); + doc.AddMember(StringRef(Pools::kRetries), m_pools.retries(), allocator); + doc.AddMember(StringRef(Pools::kRetryPause), m_pools.retryPause(), allocator); + doc.AddMember(StringRef(kSyslog), isSyslog(), allocator); + doc.AddMember(StringRef(kUserAgent), m_userAgent.toJSON(), allocator); + doc.AddMember(StringRef(kVerbose), Log::verbose(), allocator); + doc.AddMember(StringRef(kWatch), m_watch, allocator); } diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index 2be0af04..86d1c4f7 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 @@ -110,9 +110,7 @@ void xmrig::DonateStrategy::connect() if (m_proxy) { m_proxy->connect(); } - else if (m_controller->config()->pools().proxyDonate() == Pools::PROXY_DONATE_ALWAYS) { - setState(STATE_IDLE); - } + else { m_strategy->connect(); } diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index c249284b..6bc0c075 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -5,8 +5,8 @@ * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright 2018-2020 SChernykh + * Copyright 2016-2020 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 From 869209389ebe7279dd57c73031fde26ba8ecb101 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Thu, 9 Jan 2020 08:10:36 +0100 Subject: [PATCH 10/11] Update MSR preset for Intel As per https://github.com/xmrig/xmrig/issues/1433#issuecomment-572126184 --- src/crypto/rx/RxConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index bef5f8f4..2ec568f9 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -65,7 +65,7 @@ constexpr size_t kMsrArraySize = 4; static const std::array msrPresets = { MsrItems(), MsrItems{{ 0xC0011020, 0x0 }, { 0xC0011021, 0x40, ~0x20ULL }, { 0xC0011022, 0x510000 }, { 0xC001102b, 0x1808cc16 }}, - MsrItems{{ 0x1a4, 0x6 }}, + MsrItems{{ 0x1a4, 0xf }}, MsrItems() }; From b3d1ca6cb2ca755edc892d0d7eb94068e726bd55 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 12 Jan 2020 07:43:29 +0700 Subject: [PATCH 11/11] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd65c71a..4d5f5cb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ -# v5.x.x +# v5.5.1 - [#1469](https://github.com/xmrig/xmrig/issues/1469) Fixed build with gcc 4.8. - [#1473](https://github.com/xmrig/xmrig/pull/1473) Added RandomX auto-config for mobile Ryzen APUs. -- [#1477](https://github.com/xmrig/xmrig/pull/1477) Fixed compilation with Clang. +- [#1477](https://github.com/xmrig/xmrig/pull/1477) Fixed build with Clang. +- [#1489](https://github.com/xmrig/xmrig/pull/1489) RandomX JIT compiler tweaks. +- [#1493](https://github.com/xmrig/xmrig/pull/1493) Default value for Intel MSR preset changed to `15`. - Fixed unwanted resume after RandomX dataset change. # v5.5.0