diff --git a/CHANGELOG.md b/CHANGELOG.md index 4206cd546..d81c7c4eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# v6.20.0 +- Added new ARM CPU names. +- [#2394](https://github.com/xmrig/xmrig/pull/2394) Added new CMake options `ARM_V8` and `ARM_V7`. +- [#2830](https://github.com/xmrig/xmrig/pull/2830) Added API rebind polling. +- [#2927](https://github.com/xmrig/xmrig/pull/2927) Fixed compatibility with hwloc 1.11.x. +- [#3060](https://github.com/xmrig/xmrig/pull/3060) Added x86 to `README.md`. +- [#3236](https://github.com/xmrig/xmrig/pull/3236) Fixed: receive CUDA loader error on Linux too. +- [#3290](https://github.com/xmrig/xmrig/pull/3290) Added [Zephyr](https://www.zephyrprotocol.com/) coin support for solo mining. + # v6.19.3 - [#3245](https://github.com/xmrig/xmrig/issues/3245) Improved algorithm negotiation for donation rounds by sending extra information about current mining job. - [#3254](https://github.com/xmrig/xmrig/pull/3254) Tweaked auto-tuning for Intel CPUs. diff --git a/CMakeLists.txt b/CMakeLists.txt index a44e672be..d37734ac8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,8 @@ option(WITH_SECURE_JIT "Enable secure access to JIT memory" OFF) option(WITH_DMI "Enable DMI/SMBIOS reader" ON) option(BUILD_STATIC "Build static binary" OFF) -option(ARM_TARGET "Force use specific ARM target 8 or 7" 0) +option(ARM_V8 "Force ARMv8 (64 bit) architecture, use with caution if automatic detection fails, but you sure it may work" OFF) +option(ARM_V7 "Force ARMv7 (32 bit) architecture, use with caution if automatic detection fails, but you sure it may work" OFF) option(HWLOC_DEBUG "Enable hwloc debug helpers and log" OFF) diff --git a/README.md b/README.md index ce45b01bf..b4d40751c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ XMRig is a high performance, open source, cross platform RandomX, KawPow, CryptoNight and [GhostRider](https://github.com/xmrig/xmrig/tree/master/src/crypto/ghostrider#readme) unified CPU/GPU miner and [RandomX benchmark](https://xmrig.com/benchmark). Official binaries are available for Windows, Linux, macOS and FreeBSD. ## Mining backends -- **CPU** (x64/ARMv7/ARMv8) +- **CPU** (x86/x64/ARMv7/ARMv8) - **OpenCL** for AMD GPUs. - **CUDA** for NVIDIA GPUs via external [CUDA plugin](https://github.com/xmrig/xmrig-cuda). diff --git a/cmake/cpu.cmake b/cmake/cpu.cmake index cbcd8b015..cdc35f103 100644 --- a/cmake/cpu.cmake +++ b/cmake/cpu.cmake @@ -29,6 +29,12 @@ else() set(WITH_VAES OFF) endif() +if (ARM_V8) + set(ARM_TARGET 8) +elseif (ARM_V7) + set(ARM_TARGET 7) +endif() + if (NOT ARM_TARGET) if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8-a)$") set(ARM_TARGET 8) diff --git a/src/backend/cpu/Cpu.h b/src/backend/cpu/Cpu.h index 186063d32..3067ebcda 100644 --- a/src/backend/cpu/Cpu.h +++ b/src/backend/cpu/Cpu.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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,7 +37,7 @@ public: }; -} /* namespace xmrig */ +} // namespace xmrig -#endif /* XMRIG_CPU_H */ +#endif // XMRIG_CPU_H diff --git a/src/backend/cpu/interfaces/ICpuInfo.h b/src/backend/cpu/interfaces/ICpuInfo.h index 387f319b1..e9d795cec 100644 --- a/src/backend/cpu/interfaces/ICpuInfo.h +++ b/src/backend/cpu/interfaces/ICpuInfo.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -26,6 +26,12 @@ #include "crypto/common/Assembly.h" +#ifdef XMRIG_FEATURE_HWLOC +using hwloc_const_bitmap_t = const struct hwloc_bitmap_s *; +using hwloc_topology_t = struct hwloc_topology *; +#endif + + namespace xmrig { @@ -116,10 +122,16 @@ public: virtual size_t threads() const = 0; virtual Vendor vendor() const = 0; virtual uint32_t model() const = 0; + +# ifdef XMRIG_FEATURE_HWLOC + virtual bool membind(hwloc_const_bitmap_t nodeset) = 0; + virtual const std::vector &nodeset() const = 0; + virtual hwloc_topology_t topology() const = 0; +# endif }; -} /* namespace xmrig */ +} // namespace xmrig #endif // XMRIG_CPUINFO_H diff --git a/src/backend/cpu/platform/BasicCpuInfo.h b/src/backend/cpu/platform/BasicCpuInfo.h index 9405fa751..f56d5425c 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.h +++ b/src/backend/cpu/platform/BasicCpuInfo.h @@ -1,7 +1,7 @@ /* XMRig * Copyright (c) 2017-2019 XMR-Stak , - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -72,11 +72,10 @@ protected: # endif } -protected: Arch m_arch = ARCH_UNKNOWN; bool m_jccErratum = false; char m_brand[64 + 6]{}; - size_t m_threads; + size_t m_threads = 0; std::vector m_units; Vendor m_vendor = VENDOR_UNKNOWN; @@ -94,7 +93,7 @@ private: }; -} /* namespace xmrig */ +} // namespace xmrig -#endif /* XMRIG_BASICCPUINFO_H */ +#endif // XMRIG_BASICCPUINFO_H diff --git a/src/backend/cpu/platform/HwlocCpuInfo.cpp b/src/backend/cpu/platform/HwlocCpuInfo.cpp index d4db2039d..f6137c31e 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.cpp +++ b/src/backend/cpu/platform/HwlocCpuInfo.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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,27 +36,22 @@ #include "base/io/log/Log.h" -namespace xmrig { - - -uint32_t HwlocCpuInfo::m_features = 0; - - -static inline bool isCacheObject(hwloc_obj_t obj) +#if HWLOC_API_VERSION < 0x20000 +static inline int hwloc_obj_type_is_cache(hwloc_obj_type_t type) { -# if HWLOC_API_VERSION >= 0x20000 - return hwloc_obj_type_is_cache(obj->type); -# else - return obj->type == HWLOC_OBJ_CACHE; -# endif + return type == HWLOC_OBJ_CACHE; } +#endif + + +namespace xmrig { template static inline void findCache(hwloc_obj_t obj, unsigned min, unsigned max, func lambda) { for (size_t i = 0; i < obj->arity; i++) { - if (isCacheObject(obj->children[i])) { + if (hwloc_obj_type_is_cache(obj->children[i]->type)) { const unsigned depth = obj->children[i]->attr->cache.depth; if (depth < min || depth > max) { continue; @@ -174,10 +169,6 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() m_packages = countByType(m_topology, HWLOC_OBJ_PACKAGE); if (m_nodes > 1) { - if (hwloc_topology_get_support(m_topology)->membind->set_thisthread_membind) { - m_features |= SET_THISTHREAD_MEMBIND; - } - m_nodeset.reserve(m_nodes); hwloc_obj_t node = nullptr; @@ -322,7 +313,7 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith if (cache->attr->cache.depth == 3) { for (size_t i = 0; i < cache->arity; ++i) { hwloc_obj_t l2 = cache->children[i]; - if (!isCacheObject(l2) || l2->attr == nullptr) { + if (!hwloc_obj_type_is_cache(l2->type) || l2->attr == nullptr) { continue; } diff --git a/src/backend/cpu/platform/HwlocCpuInfo.h b/src/backend/cpu/platform/HwlocCpuInfo.h index 390c7d3f3..a08ea33ef 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.h +++ b/src/backend/cpu/platform/HwlocCpuInfo.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -21,12 +21,9 @@ #include "backend/cpu/platform/BasicCpuInfo.h" -#include "base/tools/Object.h" -using hwloc_const_bitmap_t = const struct hwloc_bitmap_s *; -using hwloc_obj_t = struct hwloc_obj *; -using hwloc_topology_t = struct hwloc_topology *; +using hwloc_obj_t = struct hwloc_obj *; namespace xmrig { @@ -37,39 +34,27 @@ class HwlocCpuInfo : public BasicCpuInfo public: XMRIG_DISABLE_COPY_MOVE(HwlocCpuInfo) - - enum Feature : uint32_t { - SET_THISTHREAD_MEMBIND = 1 - }; - - HwlocCpuInfo(); ~HwlocCpuInfo() override; - static inline bool hasFeature(Feature feature) { return m_features & feature; } - - inline const std::vector &nodeset() const { return m_nodeset; } - inline hwloc_topology_t topology() const { return m_topology; } - - bool membind(hwloc_const_bitmap_t nodeset); - protected: + bool membind(hwloc_const_bitmap_t nodeset) override; CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override; - inline const char *backend() const override { return m_backend; } - inline size_t cores() const override { return m_cores; } - inline size_t L2() const override { return m_cache[2]; } - inline size_t L3() const override { return m_cache[3]; } - inline size_t nodes() const override { return m_nodes; } - inline size_t packages() const override { return m_packages; } + inline const char *backend() const override { return m_backend; } + inline const std::vector &nodeset() const override { return m_nodeset; } + inline hwloc_topology_t topology() const override { return m_topology; } + inline size_t cores() const override { return m_cores; } + inline size_t L2() const override { return m_cache[2]; } + inline size_t L3() const override { return m_cache[3]; } + inline size_t nodes() const override { return m_nodes; } + inline size_t packages() const override { return m_packages; } private: CpuThreads allThreads(const Algorithm &algorithm, uint32_t limit) const; void processTopLevelCache(hwloc_obj_t cache, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const; void setThreads(size_t threads); - static uint32_t m_features; - char m_backend[20] = { 0 }; hwloc_topology_t m_topology = nullptr; size_t m_cache[5] = { 0 }; @@ -80,7 +65,7 @@ private: }; -} /* namespace xmrig */ +} // namespace xmrig -#endif /* XMRIG_HWLOCCPUINFO_H */ +#endif // XMRIG_HWLOCCPUINFO_H diff --git a/src/backend/cpu/platform/lscpu_arm.cpp b/src/backend/cpu/platform/lscpu_arm.cpp index d632ac494..7616632bf 100644 --- a/src/backend/cpu/platform/lscpu_arm.cpp +++ b/src/backend/cpu/platform/lscpu_arm.cpp @@ -1,7 +1,7 @@ /* XMRig * Copyright (c) 2018 Riku Voipio - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -17,7 +17,6 @@ * along with this program. If not, see . */ - #include "base/tools/String.h" #include "3rdparty/fmt/core.h" @@ -84,6 +83,7 @@ static const id_part arm_part[] = { { 0xc27, "Cortex-M7" }, { 0xc60, "Cortex-M0+" }, { 0xd01, "Cortex-A32" }, + { 0xd02, "Cortex-A34" }, { 0xd03, "Cortex-A53" }, { 0xd04, "Cortex-A35" }, { 0xd05, "Cortex-A55" }, @@ -97,40 +97,60 @@ static const id_part arm_part[] = { { 0xd0d, "Cortex-A77" }, { 0xd0e, "Cortex-A76AE" }, { 0xd13, "Cortex-R52" }, + { 0xd15, "Cortex-R82" }, { 0xd20, "Cortex-M23" }, { 0xd21, "Cortex-M33" }, + { 0xd40, "Neoverse-V1" }, { 0xd41, "Cortex-A78" }, { 0xd42, "Cortex-A78AE" }, + { 0xd43, "Cortex-A65AE" }, + { 0xd44, "Cortex-X1" }, + { 0xd46, "Cortex-A510" }, + { 0xd47, "Cortex-A710" }, + { 0xd48, "Cortex-X2" }, + { 0xd49, "Neoverse-N2" }, { 0xd4a, "Neoverse-E1" }, { 0xd4b, "Cortex-A78C" }, - { -1, nullptr }, + { 0xd4c, "Cortex-X1C" }, + { 0xd4d, "Cortex-A715" }, + { 0xd4e, "Cortex-X3" }, + { 0xd4f, "Neoverse-V2" }, + { -1, nullptr } }; static const id_part brcm_part[] = { - { 0x0f, "Brahma B15" }, - { 0x100, "Brahma B53" }, + { 0x0f, "Brahma-B15" }, + { 0x100, "Brahma-B53" }, { 0x516, "ThunderX2" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part dec_part[] = { { 0xa10, "SA110" }, { 0xa11, "SA1100" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part cavium_part[] = { { 0x0a0, "ThunderX" }, - { 0x0a1, "ThunderX 88XX" }, - { 0x0a2, "ThunderX 81XX" }, - { 0x0a3, "ThunderX 83XX" }, - { 0x0af, "ThunderX2 99xx" }, - { -1, nullptr }, + { 0x0a1, "ThunderX-88XX" }, + { 0x0a2, "ThunderX-81XX" }, + { 0x0a3, "ThunderX-83XX" }, + { 0x0af, "ThunderX2-99xx" }, + { 0x0b0, "OcteonTX2" }, + { 0x0b1, "OcteonTX2-98XX" }, + { 0x0b2, "OcteonTX2-96XX" }, + { 0x0b3, "OcteonTX2-95XX" }, + { 0x0b4, "OcteonTX2-95XXN" }, + { 0x0b5, "OcteonTX2-95XXMM" }, + { 0x0b6, "OcteonTX2-95XXO" }, + { 0x0b8, "ThunderX3-T110" }, + { -1, nullptr } }; static const id_part apm_part[] = { { 0x000, "X-Gene" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part qcom_part[] = { @@ -141,36 +161,43 @@ static const id_part qcom_part[] = { { 0x201, "Kryo" }, { 0x205, "Kryo" }, { 0x211, "Kryo" }, - { 0x800, "Falkor V1/Kryo" }, - { 0x801, "Kryo V2" }, + { 0x800, "Falkor-V1/Kryo" }, + { 0x801, "Kryo-V2" }, + { 0x802, "Kryo-3XX-Gold" }, + { 0x803, "Kryo-3XX-Silver" }, + { 0x804, "Kryo-4XX-Gold" }, + { 0x805, "Kryo-4XX-Silver" }, { 0xc00, "Falkor" }, { 0xc01, "Saphira" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part samsung_part[] = { { 0x001, "exynos-m1" }, - { -1, nullptr }, + { 0x002, "exynos-m3" }, + { 0x003, "exynos-m4" }, + { 0x004, "exynos-m5" }, + { -1, nullptr } }; static const id_part nvidia_part[] = { { 0x000, "Denver" }, { 0x003, "Denver 2" }, { 0x004, "Carmel" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part marvell_part[] = { - { 0x131, "Feroceon 88FR131" }, + { 0x131, "Feroceon-88FR131" }, { 0x581, "PJ4/PJ4b" }, { 0x584, "PJ4B-MP" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part faraday_part[] = { { 0x526, "FA526" }, { 0x626, "FA626" }, - { -1, nullptr }, + { -1, nullptr } }; static const id_part intel_part[] = { @@ -195,23 +222,50 @@ static const id_part intel_part[] = { { 0x689, "PXA31x" }, { 0xb11, "SA1110" }, { 0xc12, "IPX1200" }, - { -1, nullptr }, + { -1, nullptr } }; static const struct id_part fujitsu_part[] = { { 0x001, "A64FX" }, - { -1, "unknown" }, + { -1, nullptr } }; static const id_part hisi_part[] = { - { 0xd01, "Kunpeng-920" }, /* aka tsv110 */ - { -1, nullptr }, + { 0xd01, "Kunpeng-920" }, /* aka tsv110 */ + { 0xd40, "Cortex-A76" }, /* HiSilicon uses this ID though advertises A76 */ + { -1, nullptr } }; static const id_part apple_part[] = { { 0x022, "M1" }, { 0x023, "M1" }, - { -1, nullptr }, + { 0x024, "M1-Pro" }, + { 0x025, "M1-Pro" }, + { 0x028, "M1-Max" }, + { 0x029, "M1-Max" }, + { 0x032, "M2" }, + { 0x033, "M2" }, + { 0x034, "M2-Pro" }, + { 0x035, "M2-Pro" }, + { 0x038, "M2-Max" }, + { 0x039, "M2-Max" }, + { -1, nullptr } +}; + + +static const struct id_part ft_part[] = { + { 0x660, "FTC660" }, + { 0x661, "FTC661" }, + { 0x662, "FTC662" }, + { 0x663, "FTC663" }, + { -1, nullptr } +}; + + +static const struct id_part ampere_part[] = { + { 0xac3, "Ampere-1" }, + { 0xac4, "Ampere-1a" }, + { -1, nullptr } }; @@ -229,7 +283,9 @@ static const hw_impl hw_implementer[] = { { 0x56, marvell_part, "Marvell" }, { 0x61, apple_part, "Apple" }, { 0x66, faraday_part, "Faraday" }, - { 0x69, intel_part, "Intel" } + { 0x69, intel_part, "Intel" }, + { 0x70, ft_part, "Phytium" }, + { 0xc0, ampere_part, "Ampere" } }; diff --git a/src/backend/cuda/wrappers/CudaLib.cpp b/src/backend/cuda/wrappers/CudaLib.cpp index 00517ae56..8ca11fa5b 100644 --- a/src/backend/cuda/wrappers/CudaLib.cpp +++ b/src/backend/cuda/wrappers/CudaLib.cpp @@ -353,13 +353,9 @@ bool xmrig::CudaLib::open() # ifdef XMRIG_OS_LINUX if (m_loader == defaultLoader) { m_loader = Process::location(Process::ExeLocation, m_loader); - } - else { - return false; - } - - if (uv_dlopen(m_loader, &cudaLib) == 0) { - return true; + if (uv_dlopen(m_loader, &cudaLib) == 0) { + return true; + } } # endif diff --git a/src/backend/opencl/runners/tools/OclKawPow.cpp b/src/backend/opencl/runners/tools/OclKawPow.cpp index a7e8df3aa..4151633ca 100644 --- a/src/backend/opencl/runners/tools/OclKawPow.cpp +++ b/src/backend/opencl/runners/tools/OclKawPow.cpp @@ -399,6 +399,9 @@ private: uv_loop_t* m_loop = nullptr; uv_thread_t m_loopThread = {}; uv_async_t m_shutdownAsync = {}; + uv_async_t m_batonAsync = {}; + + std::vector m_batons; static void loop(void* data) { @@ -419,19 +422,37 @@ void KawPowBuilder::build_async(const IOclRunner& runner, uint64_t period, uint3 if (!m_loop) { m_loop = new uv_loop_t{}; uv_loop_init(m_loop); - uv_async_init(m_loop, &m_shutdownAsync, [](uv_async_t* handle) { uv_close(reinterpret_cast(handle), nullptr); }); + + uv_async_init(m_loop, &m_shutdownAsync, [](uv_async_t* handle) + { + KawPowBuilder* builder = reinterpret_cast(handle->data); + uv_close(reinterpret_cast(&builder->m_shutdownAsync), nullptr); + uv_close(reinterpret_cast(&builder->m_batonAsync), nullptr); + }); + + uv_async_init(m_loop, &m_batonAsync, [](uv_async_t* handle) + { + std::vector batons; + { + KawPowBuilder* b = reinterpret_cast(handle->data); + + std::lock_guard lock(b->m_mutex); + batons = std::move(b->m_batons); + } + + for (const KawPowBaton& baton : batons) { + builder.build(baton.runner, baton.period, baton.worksize); + } + }); + + m_shutdownAsync.data = this; + m_batonAsync.data = this; + uv_thread_create(&m_loopThread, loop, this); } - KawPowBaton* baton = new KawPowBaton(runner, period, worksize); - - uv_queue_work(m_loop, &baton->req, - [](uv_work_t* req) { - KawPowBaton* baton = static_cast(req->data); - builder.build(baton->runner, baton->period, baton->worksize); - }, - [](uv_work_t* req, int) { delete static_cast(req->data); } - ); + m_batons.emplace_back(runner, period, worksize); + uv_async_send(&m_batonAsync); } diff --git a/src/base/api/Api.cpp b/src/base/api/Api.cpp index 54666efda..ea78c35ed 100644 --- a/src/base/api/Api.cpp +++ b/src/base/api/Api.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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,21 @@ void xmrig::Api::stop() } +void xmrig::Api::tick() +{ +# ifdef XMRIG_FEATURE_HTTP + if (m_httpd->isBound() || !m_base->config()->http().isEnabled()) { + return; + } + + if (++m_ticks % 10 == 0) { + m_ticks = 0; + m_httpd->start(); + } +# endif +} + + void xmrig::Api::onConfigChanged(Config *config, Config *previousConfig) { if (config->apiId() != previousConfig->apiId()) { diff --git a/src/base/api/Api.h b/src/base/api/Api.h index c56e29ee1..7c686ff40 100644 --- a/src/base/api/Api.h +++ b/src/base/api/Api.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -21,7 +21,6 @@ #include -#include #include "base/kernel/interfaces/IBaseListener.h" @@ -44,7 +43,7 @@ class Api : public IBaseListener public: XMRIG_DISABLE_COPY_MOVE_DEFAULT(Api) - Api(Base *base); + explicit Api(Base *base); ~Api() override; inline const char *id() const { return m_id; } @@ -54,6 +53,7 @@ public: void request(const HttpData &req); void start(); void stop(); + void tick(); protected: void onConfigChanged(Config *config, Config *previousConfig) override; @@ -65,14 +65,15 @@ private: Base *m_base; char m_id[32]{}; - String m_workerId; const uint64_t m_timestamp; - Httpd *m_httpd = nullptr; + Httpd *m_httpd = nullptr; std::vector m_listeners; + String m_workerId; + uint8_t m_ticks = 0; }; } // namespace xmrig -#endif /* XMRIG_API_H */ +#endif // XMRIG_API_H diff --git a/src/base/api/Httpd.h b/src/base/api/Httpd.h index 188646f55..e00c8eb5b 100644 --- a/src/base/api/Httpd.h +++ b/src/base/api/Httpd.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -22,11 +22,6 @@ #include "base/kernel/interfaces/IBaseListener.h" #include "base/net/http/HttpListener.h" -#include "base/tools/Object.h" - - -#include -#include namespace xmrig { @@ -43,9 +38,11 @@ class Httpd : public IBaseListener, public IHttpListener public: XMRIG_DISABLE_COPY_MOVE_DEFAULT(Httpd) - Httpd(Base *base); + explicit Httpd(Base *base); ~Httpd() override; + inline bool isBound() const { return m_server != nullptr; } + bool start(); void stop(); @@ -69,7 +66,7 @@ private: }; -} /* namespace xmrig */ +} // namespace xmrig -#endif /* XMRIG_HTTPD_H */ +#endif // XMRIG_HTTPD_H diff --git a/src/base/crypto/Coin.cpp b/src/base/crypto/Coin.cpp index b63570e1d..2508e9cc7 100644 --- a/src/base/crypto/Coin.cpp +++ b/src/base/crypto/Coin.cpp @@ -53,6 +53,7 @@ static const CoinInfo coinInfo[] = { { Algorithm::RX_KEVA, "KVA", "Kevacoin", 0, 0, MAGENTA_BG_BOLD(WHITE_BOLD_S " keva ") }, { Algorithm::KAWPOW_RVN, "RVN", "Ravencoin", 0, 0, BLUE_BG_BOLD( WHITE_BOLD_S " raven ") }, { Algorithm::RX_WOW, "WOW", "Wownero", 300, 100000000000, MAGENTA_BG_BOLD(WHITE_BOLD_S " wownero ") }, + { Algorithm::RX_0, "ZEPH", "Zephyr", 120, 1000000000000, BLUE_BG_BOLD( WHITE_BOLD_S " zephyr ") }, }; diff --git a/src/base/crypto/Coin.h b/src/base/crypto/Coin.h index fbd36371f..166618b19 100644 --- a/src/base/crypto/Coin.h +++ b/src/base/crypto/Coin.h @@ -39,6 +39,7 @@ public: KEVA, RAVEN, WOWNERO, + ZEPHYR, MAX }; diff --git a/src/base/kernel/Platform_hwloc.cpp b/src/base/kernel/Platform_hwloc.cpp index 8d9d9f593..219c17424 100644 --- a/src/base/kernel/Platform_hwloc.cpp +++ b/src/base/kernel/Platform_hwloc.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -16,9 +16,7 @@ * along with this program. If not, see . */ - #include "base/kernel/Platform.h" -#include "backend/cpu/platform/HwlocCpuInfo.h" #include "backend/cpu/Cpu.h" @@ -29,20 +27,21 @@ #ifndef XMRIG_OS_APPLE bool xmrig::Platform::setThreadAffinity(uint64_t cpu_id) { - auto cpu = static_cast(Cpu::info()); - hwloc_obj_t pu = hwloc_get_pu_obj_by_os_index(cpu->topology(), static_cast(cpu_id)); + auto topology = Cpu::info()->topology(); + auto pu = hwloc_get_pu_obj_by_os_index(topology, static_cast(cpu_id)); if (pu == nullptr) { return false; } - if (hwloc_set_cpubind(cpu->topology(), pu->cpuset, HWLOC_CPUBIND_THREAD | HWLOC_CPUBIND_STRICT) >= 0) { + if (hwloc_set_cpubind(topology, pu->cpuset, HWLOC_CPUBIND_THREAD | HWLOC_CPUBIND_STRICT) >= 0) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); return true; } - const bool result = (hwloc_set_cpubind(cpu->topology(), pu->cpuset, HWLOC_CPUBIND_THREAD) >= 0); + const bool result = (hwloc_set_cpubind(topology, pu->cpuset, HWLOC_CPUBIND_THREAD) >= 0); std::this_thread::sleep_for(std::chrono::milliseconds(1)); + return result; } #endif diff --git a/src/base/tools/cryptonote/BlockTemplate.cpp b/src/base/tools/cryptonote/BlockTemplate.cpp index 6ce49679e..1926136b1 100644 --- a/src/base/tools/cryptonote/BlockTemplate.cpp +++ b/src/base/tools/cryptonote/BlockTemplate.cpp @@ -197,6 +197,11 @@ bool xmrig::BlockTemplate::parse(bool hashes) ar(m_vote); } + if (m_coin == Coin::ZEPHYR) { + uint8_t pricing_record[24]; + ar(pricing_record); + } + // Miner transaction begin // Prefix begin setOffset(MINER_TX_PREFIX_OFFSET, ar.index()); @@ -220,8 +225,8 @@ bool xmrig::BlockTemplate::parse(bool hashes) ar(m_height); ar(m_numOutputs); - // must be 1 output - if (m_numOutputs != 1) { + const uint64_t expected_outputs = (m_coin == Coin::ZEPHYR) ? 2 : 1; + if (m_numOutputs != expected_outputs) { return false; } @@ -237,7 +242,35 @@ bool xmrig::BlockTemplate::parse(bool hashes) ar(m_ephPublicKey, kKeySize); - if (m_outputType == 3) { + if (m_coin == Coin::ZEPHYR) { + if (m_outputType != 2) { + return false; + } + + uint64_t asset_type_len; + ar(asset_type_len); + ar.skip(asset_type_len); + ar(m_viewTag); + + uint64_t amount2; + ar(amount2); + + uint8_t output_type2; + ar(output_type2); + if (output_type2 != 2) { + return false; + } + + Span key2; + ar(key2, kKeySize); + + ar(asset_type_len); + ar.skip(asset_type_len); + + uint8_t view_tag2; + ar(view_tag2); + } + else if (m_outputType == 3) { ar(m_viewTag); } @@ -248,6 +281,8 @@ bool xmrig::BlockTemplate::parse(bool hashes) BlobReader ar_extra(blob(TX_EXTRA_OFFSET), m_extraSize); ar.skip(m_extraSize); + bool pubkey_offset_first = true; + while (ar_extra.index() < m_extraSize) { uint64_t extra_tag = 0; uint64_t size = 0; @@ -256,7 +291,10 @@ bool xmrig::BlockTemplate::parse(bool hashes) switch (extra_tag) { case 0x01: // TX_EXTRA_TAG_PUBKEY - setOffset(TX_PUBKEY_OFFSET, offset(TX_EXTRA_OFFSET) + ar_extra.index()); + if (pubkey_offset_first) { + pubkey_offset_first = false; + setOffset(TX_PUBKEY_OFFSET, offset(TX_EXTRA_OFFSET) + ar_extra.index()); + } ar_extra.skip(kKeySize); break; @@ -277,6 +315,13 @@ bool xmrig::BlockTemplate::parse(bool hashes) } } + if (m_coin == Coin::ZEPHYR) { + uint64_t pricing_record_height, amount_burnt, amount_minted; + ar(pricing_record_height); + ar(amount_burnt); + ar(amount_minted); + } + setOffset(MINER_TX_PREFIX_END_OFFSET, ar.index()); // Prefix end diff --git a/src/crypto/common/VirtualMemory_hwloc.cpp b/src/crypto/common/VirtualMemory_hwloc.cpp index d11290081..21b0bd46c 100644 --- a/src/crypto/common/VirtualMemory_hwloc.cpp +++ b/src/crypto/common/VirtualMemory_hwloc.cpp @@ -1,8 +1,8 @@ /* XMRig * Copyright (c) 2018 Lee Clagett * Copyright (c) 2018-2019 tevador - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -18,10 +18,8 @@ * along with this program. If not, see . */ - #include "crypto/common/VirtualMemory.h" #include "backend/cpu/Cpu.h" -#include "backend/cpu/platform/HwlocCpuInfo.h" #include "base/io/log/Log.h" @@ -34,10 +32,9 @@ uint32_t xmrig::VirtualMemory::bindToNUMANode(int64_t affinity) return 0; } - auto cpu = static_cast(Cpu::info()); - hwloc_obj_t pu = hwloc_get_pu_obj_by_os_index(cpu->topology(), static_cast(affinity)); + auto pu = hwloc_get_pu_obj_by_os_index(Cpu::info()->topology(), static_cast(affinity)); - if (pu == nullptr || !cpu->membind(pu->nodeset)) { + if (pu == nullptr || !Cpu::info()->membind(pu->nodeset)) { LOG_WARN("CPU #%02" PRId64 " warning: \"can't bind memory\"", affinity); return 0; diff --git a/src/crypto/ghostrider/ghostrider.cpp b/src/crypto/ghostrider/ghostrider.cpp index 70138470b..25bb44e74 100644 --- a/src/crypto/ghostrider/ghostrider.cpp +++ b/src/crypto/ghostrider/ghostrider.cpp @@ -47,9 +47,12 @@ #include #ifdef XMRIG_FEATURE_HWLOC -#include "base/kernel/Platform.h" -#include "backend/cpu/platform/HwlocCpuInfo.h" -#include +# include "base/kernel/Platform.h" +# include + +# if HWLOC_API_VERSION < 0x20000 +# define HWLOC_OBJ_L3CACHE HWLOC_OBJ_CACHE +# endif #endif #if defined(XMRIG_ARM) @@ -86,7 +89,7 @@ CORE_HASH(14, whirlpool ); #undef CORE_HASH -typedef void (*core_hash_func)(const uint8_t* data, size_t size, uint8_t* output); +using core_hash_func = void (*)(const uint8_t* data, size_t size, uint8_t* output); static const core_hash_func core_hash[15] = { h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11, h12, h13, h14 }; namespace xmrig @@ -165,6 +168,8 @@ static struct AlgoTune struct HelperThread { + XMRIG_DISABLE_COPY_MOVE_DEFAULT(HelperThread) + HelperThread(hwloc_bitmap_t cpu_set, int priority, bool is8MB) : m_cpuSet(cpu_set), m_priority(priority), m_is8MB(is8MB) { uv_mutex_init(&m_mutex); @@ -194,14 +199,17 @@ struct HelperThread struct TaskBase { - virtual ~TaskBase() {} - virtual void run() = 0; + XMRIG_DISABLE_COPY_MOVE(TaskBase) + + TaskBase() = default; + virtual ~TaskBase() = default; + virtual void run() = 0; }; template struct Task : TaskBase { - inline Task(T&& task) : m_task(std::move(task)) + explicit inline Task(T&& task) : m_task(std::move(task)) { static_assert(sizeof(Task) <= 128, "Task struct is too large"); } @@ -219,7 +227,7 @@ struct HelperThread inline void launch_task(T&& task) { uv_mutex_lock(&m_mutex); - new (&m_tasks[m_numTasks++]) Task(std::move(task)); + new (&m_tasks[m_numTasks++]) Task(std::forward(task)); uv_cond_signal(&m_cond); uv_mutex_unlock(&m_mutex); } @@ -234,7 +242,7 @@ struct HelperThread void run() { if (hwloc_bitmap_weight(m_cpuSet) > 0) { - hwloc_topology_t topology = reinterpret_cast(Cpu::info())->topology(); + hwloc_topology_t topology = Cpu::info()->topology(); if (hwloc_set_cpubind(topology, m_cpuSet, HWLOC_CPUBIND_THREAD | HWLOC_CPUBIND_STRICT) < 0) { hwloc_set_cpubind(topology, m_cpuSet, HWLOC_CPUBIND_THREAD); } @@ -288,9 +296,9 @@ void benchmark() // Try to avoid CPU core 0 because many system threads use it and can interfere uint32_t thread_index1 = (Cpu::info()->threads() > 2) ? 2 : 0; - hwloc_topology_t topology = reinterpret_cast(Cpu::info())->topology(); + hwloc_topology_t topology = Cpu::info()->topology(); hwloc_obj_t pu = hwloc_get_pu_obj_by_os_index(topology, thread_index1); - hwloc_obj_t pu2; + hwloc_obj_t pu2 = nullptr; hwloc_get_closest_objs(topology, pu, &pu2, 1); uint32_t thread_index2 = pu2 ? pu2->os_index : thread_index1; @@ -481,12 +489,17 @@ HelperThread* create_helper_thread(int64_t cpu_index, int priority, const std::v } if (cpu_index >= 0) { - hwloc_topology_t topology = reinterpret_cast(Cpu::info())->topology(); - hwloc_obj_t root = hwloc_get_root_obj(topology); + hwloc_obj_t root = hwloc_get_root_obj(Cpu::info()->topology()); bool is8MB = false; findByType(root, HWLOC_OBJ_L3CACHE, [cpu_index, &is8MB](hwloc_obj_t obj) { +# if HWLOC_API_VERSION < 0x20000 + if (obj->attr->cache.depth != 3) { + return false; + } +# endif + if (!hwloc_bitmap_isset(obj->cpuset, cpu_index)) { return false; } @@ -510,7 +523,11 @@ HelperThread* create_helper_thread(int64_t cpu_index, int priority, const std::v return true; }); +# if HWLOC_API_VERSION >= 0x20000 for (auto obj_type : { HWLOC_OBJ_CORE, HWLOC_OBJ_L1CACHE, HWLOC_OBJ_L2CACHE, HWLOC_OBJ_L3CACHE }) { +# else + for (auto obj_type : { HWLOC_OBJ_CORE, HWLOC_OBJ_CACHE }) { +# endif findByType(root, obj_type, [cpu_index, helper_cpu_set, main_threads_set](hwloc_obj_t obj) { const hwloc_cpuset_t& s = obj->cpuset; if (hwloc_bitmap_isset(s, cpu_index)) { @@ -571,9 +588,13 @@ void hash_octa(const uint8_t* data, size_t size, uint8_t* output, cryptonight_ct uint8_t tmp[64 * N]; if (helper && (tune[cn_indices[0]].threads == 2) && (tune[cn_indices[1]].threads == 2) && (tune[cn_indices[2]].threads == 2)) { - const size_t n = N / 2; + constexpr size_t n = N / 2; + + helper->launch_task([av, data, size, &ctx_memory, ctx, &cn_indices, &core_indices, &tmp, output, tune]() { +# ifdef _MSC_VER + constexpr size_t n = N / 2; +# endif - helper->launch_task([n, av, data, size, &ctx_memory, ctx, &cn_indices, &core_indices, &tmp, output, tune]() { const uint8_t* input = data; size_t input_size = size; diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index cb50c4d1c..cd1969354 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -22,11 +22,6 @@ #include "base/io/json/Json.h" -#ifdef XMRIG_FEATURE_HWLOC -# include "backend/cpu/platform/HwlocCpuInfo.h" -#endif - - #include #include #include @@ -190,7 +185,7 @@ std::vector xmrig::RxConfig::nodeset() const return m_nodeset; } - return (m_numa && Cpu::info()->nodes() > 1) ? static_cast(Cpu::info())->nodeset() : std::vector(); + return (m_numa && Cpu::info()->nodes() > 1) ? Cpu::info()->nodeset() : std::vector(); } #endif diff --git a/src/crypto/rx/RxConfig.h b/src/crypto/rx/RxConfig.h index e4fb4f89c..e8662e4d3 100644 --- a/src/crypto/rx/RxConfig.h +++ b/src/crypto/rx/RxConfig.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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,7 +123,7 @@ private: }; -} /* namespace xmrig */ +} // namespace xmrig -#endif /* XMRIG_RXCONFIG_H */ +#endif // XMRIG_RXCONFIG_H diff --git a/src/crypto/rx/RxNUMAStorage.cpp b/src/crypto/rx/RxNUMAStorage.cpp index b6345a061..cc66d76e5 100644 --- a/src/crypto/rx/RxNUMAStorage.cpp +++ b/src/crypto/rx/RxNUMAStorage.cpp @@ -1,7 +1,7 @@ /* XMRig * Copyright (c) 2018-2019 tevador - * Copyright (c) 2018-2021 SChernykh - * Copyright (c) 2016-2021 XMRig , + * Copyright (c) 2018-2023 SChernykh + * Copyright (c) 2016-2023 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 @@ -19,7 +19,6 @@ #include "crypto/rx/RxNUMAStorage.h" #include "backend/cpu/Cpu.h" -#include "backend/cpu/platform/HwlocCpuInfo.h" #include "base/io/log/Log.h" #include "base/io/log/Tags.h" #include "base/kernel/Platform.h" @@ -45,13 +44,12 @@ static std::mutex mutex; static bool bindToNUMANode(uint32_t nodeId) { - auto cpu = static_cast(Cpu::info()); - hwloc_obj_t node = hwloc_get_numanode_obj_by_os_index(cpu->topology(), nodeId); + auto node = hwloc_get_numanode_obj_by_os_index(Cpu::info()->topology(), nodeId); if (!node) { return false; } - if (cpu->membind(node->nodeset)) { + if (Cpu::info()->membind(node->nodeset)) { Platform::setThreadAffinity(static_cast(hwloc_bitmap_first(node->cpuset))); return true; diff --git a/src/net/Network.cpp b/src/net/Network.cpp index a35662428..0ca1914a4 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -308,6 +308,10 @@ void xmrig::Network::tick() if (m_donate) { m_donate->tick(now); } + +# ifdef XMRIG_FEATURE_API + m_controller->api()->tick(); +# endif } diff --git a/src/version.h b/src/version.h index 43bde7127..972386b75 100644 --- a/src/version.h +++ b/src/version.h @@ -22,15 +22,15 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig miner" -#define APP_VERSION "6.19.3" +#define APP_VERSION "6.20.0-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2023 xmrig.com" #define APP_KIND "miner" #define APP_VER_MAJOR 6 -#define APP_VER_MINOR 19 -#define APP_VER_PATCH 3 +#define APP_VER_MINOR 20 +#define APP_VER_PATCH 0 #ifdef _MSC_VER # if (_MSC_VER >= 1930)