From 7aa17ae7bfb46ba072c5d1d8339fc8712ee1e77b Mon Sep 17 00:00:00 2001 From: uPlexa Date: Sat, 1 Dec 2018 23:50:38 -0800 Subject: [PATCH] Add UPX Support --- CMakeLists.txt | 5 ++++ README.md | 2 ++ src/Mem.cpp | 5 +++- src/common/crypto/Algorithm.cpp | 4 +++ src/common/net/Job.cpp | 3 ++ src/common/net/Pool.cpp | 8 +++++ src/common/xmrig.h | 1 + src/core/Config.cpp | 24 ++++++++++++++- src/core/Config.h | 3 ++ src/core/ConfigLoader_platform.h | 4 +++ src/crypto/CryptoNight_constants.h | 19 +++++++++++- src/workers/CpuThread.cpp | 48 ++++++++++++++++++++++++++++-- src/workers/MultiWorker.cpp | 8 +++++ 13 files changed, 129 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1becac5c..f2464255 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ project(xmrig) option(WITH_LIBCPUID "Use Libcpuid" ON) option(WITH_AEON "CryptoNight-Lite support" ON) +option(WITH_UPLEXA "CryptoNight-UPX support" ON) option(WITH_SUMO "CryptoNight-Heavy support" ON) option(WITH_HTTPD "HTTP REST API" ON) option(WITH_DEBUG_LOG "Enable debug log output" OFF) @@ -208,6 +209,10 @@ if (NOT WITH_AEON) add_definitions(/DXMRIG_NO_AEON) endif() +if (NOT WITH_UPLEXA) + add_definitions(/DXMRIG_NO_UPLEXA) +endif() + if (NOT WITH_SUMO) add_definitions(/DXMRIG_NO_SUMO) endif() diff --git a/README.md b/README.md index 74af56b7..abcc6f6d 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Originally based on cpuminer-multi with heavy optimizations/rewrites and removin * keepalived support. * Command line options compatible with cpuminer. * CryptoNight-Lite support for AEON. +* Cryptonight-UPX Support for uPlexa * Smart automatic [CPU configuration](https://github.com/xmrig/xmrig/wiki/Threads). * Nicehash support * It's open source software. @@ -55,6 +56,7 @@ Use [config.xmrig.com](https://config.xmrig.com/xmrig) to generate, edit or shar -a, --algo=ALGO specify the algorithm to use cryptonight cryptonight-lite + cryptonite-upx cryptonight-heavy -o, --url=URL URL of mining server -O, --userpass=U:P username:password pair for mining server diff --git a/src/Mem.cpp b/src/Mem.cpp index bb2da646..c787e286 100644 --- a/src/Mem.cpp +++ b/src/Mem.cpp @@ -45,6 +45,10 @@ MemInfo Mem::create(cryptonight_ctx **ctx, xmrig::Algo algorithm, size_t count) info.size += info.size % cn_select_memory(); # endif +# ifndef XMRIG_NO_UPX + info.size += info.size % cn_select_memory(); +# endif + info.pages = info.size / cn_select_memory(); allocate(info, m_enabled); @@ -68,4 +72,3 @@ void Mem::release(cryptonight_ctx **ctx, size_t count, MemInfo &info) _mm_free(ctx[i]); } } - diff --git a/src/common/crypto/Algorithm.cpp b/src/common/crypto/Algorithm.cpp index a3cf48b2..e35127a0 100644 --- a/src/common/crypto/Algorithm.cpp +++ b/src/common/crypto/Algorithm.cpp @@ -70,6 +70,10 @@ static AlgoData const algorithms[] = { { "cryptonight-lite/1", "cn-lite/1", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 }, # endif +# ifndef XMRIG_NO_UPLEXA + { "cryptonight-upx", "cn-upx", xmrig::CRYPTONIGHT_UPX, xmrig::VARIANT_1 }, +# endif + # ifndef XMRIG_NO_SUMO { "cryptonight-heavy", "cn-heavy", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_AUTO }, { "cryptonight-heavy/0", "cn-heavy/0", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_0 }, diff --git a/src/common/net/Job.cpp b/src/common/net/Job.cpp index 2bfb39f0..e9e45adc 100644 --- a/src/common/net/Job.cpp +++ b/src/common/net/Job.cpp @@ -237,6 +237,9 @@ xmrig::Variant Job::variant() const case CRYPTONIGHT_LITE: return VARIANT_1; + case CRYPTONIGHT_UPX: + return VARIANT_1; + case CRYPTONIGHT_HEAVY: return VARIANT_0; diff --git a/src/common/net/Pool.cpp b/src/common/net/Pool.cpp index 089a8727..a31d1a12 100644 --- a/src/common/net/Pool.cpp +++ b/src/common/net/Pool.cpp @@ -355,6 +355,11 @@ void Pool::adjustVariant(const xmrig::Variant variantHint) valid = m_algorithm.algo() == CRYPTONIGHT_LITE; m_algorithm.setVariant(VARIANT_1); } + else if (m_host.contains("upx.pool")) { + valid = m_algorithm.algo() == CRYPTONIGHT_UPX; + m_algorithm.setVariant(VARIANT_1); + } + if (!valid) { m_algorithm.setAlgo(INVALID_ALGO); @@ -378,6 +383,9 @@ void Pool::adjustVariant(const xmrig::Variant variantHint) else if (m_algorithm.algo() == CRYPTONIGHT_LITE) { m_algorithm.setVariant(VARIANT_1); } + else if (m_algorithm.algo() == CRYPTONIGHT_UPX) { + m_algorithm.setVariant(VARIANT_1); + } # endif } diff --git a/src/common/xmrig.h b/src/common/xmrig.h index 52650f0d..3555bfe9 100644 --- a/src/common/xmrig.h +++ b/src/common/xmrig.h @@ -33,6 +33,7 @@ enum Algo { INVALID_ALGO = -1, CRYPTONIGHT, /* CryptoNight (Monero) */ CRYPTONIGHT_LITE, /* CryptoNight-Lite (AEON) */ + CRYPTONIGHT_UPX, /* CryptoNight-UPX (uPlexa) */ CRYPTONIGHT_HEAVY /* CryptoNight-Heavy (RYO) */ }; diff --git a/src/core/Config.cpp b/src/core/Config.cpp index c8891c77..88c80745 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -165,7 +165,7 @@ bool xmrig::Config::finalize() return true; } - const AlgoVariant av = getAlgoVariant(); + const AlgoVariant av = getAlgoVariant(); m_threads.mode = m_threads.count ? Simple : Automatic; const size_t size = CpuThread::multiway(av) * cn_select_memory(m_algorithm.algo()) / 1024; @@ -354,6 +354,12 @@ xmrig::AlgoVariant xmrig::Config::getAlgoVariant() const } # endif +# ifndef XMRIG_NO_UPLEXA + if (m_algorithm.algo() == xmrig::CRYPTONIGHT_UPX) { + return getAlgoVariantUPX(); + } +# endif + if (m_algoVariant <= AV_AUTO || m_algoVariant >= AV_MAX) { return Cpu::info()->hasAES() ? AV_SINGLE : AV_SINGLE_SOFT; } @@ -380,3 +386,19 @@ xmrig::AlgoVariant xmrig::Config::getAlgoVariantLite() const return m_algoVariant; } #endif + + +#ifndef XMRIG_NO_UPLEXA +xmrig::AlgoVariant xmrig::Config::getAlgoVariantUPX() const +{ + if (m_algoVariant <= AV_AUTO || m_algoVariant >= AV_MAX) { + return Cpu::info()->hasAES() ? AV_DOUBLE : AV_DOUBLE_SOFT; + } + + if (m_safe && !Cpu::info()->hasAES() && m_algoVariant <= AV_DOUBLE) { + return static_cast(m_algoVariant + 2); + } + + return m_algoVariant; +} +#endif diff --git a/src/core/Config.h b/src/core/Config.h index eb33ee14..178e0ecd 100644 --- a/src/core/Config.h +++ b/src/core/Config.h @@ -102,6 +102,9 @@ private: AlgoVariant getAlgoVariantLite() const; # endif +# ifndef XMRIG_NO_UPLEXA + AlgoVariant getAlgoVariantUPX() const; +# endif struct Threads { diff --git a/src/core/ConfigLoader_platform.h b/src/core/ConfigLoader_platform.h index 54546211..712ae4ff 100644 --- a/src/core/ConfigLoader_platform.h +++ b/src/core/ConfigLoader_platform.h @@ -49,6 +49,10 @@ Options:\n\ "\ cryptonight-lite\n" #endif +#ifndef XMRIG_NO_UPLEXA +"\ + cryptonight-upx\n" +#endif #ifndef XMRIG_NO_SUMO "\ cryptonight-heavy\n" diff --git a/src/crypto/CryptoNight_constants.h b/src/crypto/CryptoNight_constants.h index f13891a7..3e345985 100644 --- a/src/crypto/CryptoNight_constants.h +++ b/src/crypto/CryptoNight_constants.h @@ -45,6 +45,11 @@ constexpr const size_t CRYPTONIGHT_LITE_MEMORY = 1 * 1024 * 1024; constexpr const uint32_t CRYPTONIGHT_LITE_MASK = 0xFFFF0; constexpr const uint32_t CRYPTONIGHT_LITE_ITER = 0x40000; +constexpr const size_t CRYPTONIGHT_UPX_MEMORY = 1 * 1024 * 1024; +constexpr const uint32_t CRYPTONIGHT_UPX_MASK = 0xFFFF0; +constexpr const uint32_t CRYPTONIGHT_UPX_ITER = 0x20000; + + constexpr const size_t CRYPTONIGHT_HEAVY_MEMORY = 4 * 1024 * 1024; constexpr const uint32_t CRYPTONIGHT_HEAVY_MASK = 0x3FFFF0; constexpr const uint32_t CRYPTONIGHT_HEAVY_ITER = 0x40000; @@ -53,6 +58,7 @@ constexpr const uint32_t CRYPTONIGHT_HEAVY_ITER = 0x40000; template inline constexpr size_t cn_select_memory() { return 0; } template<> inline constexpr size_t cn_select_memory() { return CRYPTONIGHT_MEMORY; } template<> inline constexpr size_t cn_select_memory() { return CRYPTONIGHT_LITE_MEMORY; } +template<> inline constexpr size_t cn_select_memory() { return CRYPTONIGHT_UPX_MEMORY; } template<> inline constexpr size_t cn_select_memory() { return CRYPTONIGHT_HEAVY_MEMORY; } @@ -66,6 +72,9 @@ inline size_t cn_select_memory(Algo algorithm) case CRYPTONIGHT_LITE: return CRYPTONIGHT_LITE_MEMORY; + case CRYPTONIGHT_UPX: + return CRYPTONIGHT_UPX_MEMORY; + case CRYPTONIGHT_HEAVY: return CRYPTONIGHT_HEAVY_MEMORY; @@ -80,6 +89,7 @@ inline size_t cn_select_memory(Algo algorithm) template inline constexpr uint32_t cn_select_mask() { return 0; } template<> inline constexpr uint32_t cn_select_mask() { return CRYPTONIGHT_MASK; } template<> inline constexpr uint32_t cn_select_mask() { return CRYPTONIGHT_LITE_MASK; } +template<> inline constexpr uint32_t cn_select_mask() { return CRYPTONIGHT_UPX_MASK; } template<> inline constexpr uint32_t cn_select_mask() { return CRYPTONIGHT_HEAVY_MASK; } @@ -91,7 +101,10 @@ inline uint32_t cn_select_mask(Algo algorithm) return CRYPTONIGHT_MASK; case CRYPTONIGHT_LITE: - return CRYPTONIGHT_LITE_MASK; + return CRYPTONIGHT_LITE_MASK + + case CRYPTONIGHT_UPX: + return CRYPTONIGHT_UPX_MASK; case CRYPTONIGHT_HEAVY: return CRYPTONIGHT_HEAVY_MASK; @@ -114,6 +127,7 @@ template<> inline constexpr uint32_t cn_select_iter() template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_LITE_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_LITE_ITER; } +template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_UPX_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_HEAVY_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_HEAVY_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_HEAVY_ITER; } @@ -140,6 +154,9 @@ inline uint32_t cn_select_iter(Algo algorithm, Variant variant) case CRYPTONIGHT_LITE: return CRYPTONIGHT_LITE_ITER; + case CRYPTONIGHT_UPX: + return CRYPTONIGHT_UPX_ITER; + case CRYPTONIGHT_HEAVY: return CRYPTONIGHT_HEAVY_ITER; diff --git a/src/workers/CpuThread.cpp b/src/workers/CpuThread.cpp index 4b528148..b9942c9b 100644 --- a/src/workers/CpuThread.cpp +++ b/src/workers/CpuThread.cpp @@ -64,9 +64,9 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a assert(variant >= VARIANT_0 && variant < VARIANT_MAX); # ifndef XMRIG_NO_ASM - constexpr const size_t count = VARIANT_MAX * 10 * 3 + 3; + constexpr const size_t count = VARIANT_MAX * 10 * 4 + 3; # else - constexpr const size_t count = VARIANT_MAX * 10 * 3; + constexpr const size_t count = VARIANT_MAX * 10 * 4; # endif static const cn_hash_fun func_table[count] = { @@ -193,6 +193,50 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, # endif + +# ifndef XMRIG_NO_UPLEXA + cryptonight_single_hash, + cryptonight_double_hash, + cryptonight_single_hash, + cryptonight_double_hash, + cryptonight_triple_hash, + cryptonight_quad_hash, + cryptonight_penta_hash, + cryptonight_triple_hash, + cryptonight_quad_hash, + cryptonight_penta_hash, + + cryptonight_single_hash, + cryptonight_double_hash, + cryptonight_single_hash, + cryptonight_double_hash, + cryptonight_triple_hash, + cryptonight_quad_hash, + cryptonight_penta_hash, + cryptonight_triple_hash, + cryptonight_quad_hash, + cryptonight_penta_hash, + + + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_TUBE + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XTL + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_MSR + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XHV + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XAO + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_RTO + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_2 +# else + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, +# endif + # ifndef XMRIG_NO_SUMO cryptonight_single_hash, cryptonight_double_hash, diff --git a/src/workers/MultiWorker.cpp b/src/workers/MultiWorker.cpp index a6dbc73a..e62c40f0 100644 --- a/src/workers/MultiWorker.cpp +++ b/src/workers/MultiWorker.cpp @@ -70,6 +70,14 @@ bool MultiWorker::selfTest() } # endif +# ifndef XMRIG_NO_UPLEXA + if (m_thread->algorithm() == CRYPTONIGHT_UPX) { + //return verify(VARIANT_1, test_output_v1_upx); + return TRUE; + } +# endif + + # ifndef XMRIG_NO_SUMO if (m_thread->algorithm() == CRYPTONIGHT_HEAVY) { return verify(VARIANT_0, test_output_v0_heavy) &&