diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d43b6392..2442a75af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,7 +69,7 @@ if (WIN32) set(EXTRA_LIBS ws2_32 psapi iphlpapi userenv) else() - set(SOURCES_OS src/Cpu_unix.cpp) + set(SOURCES_OS src/Cpu_unix.cpp src/Mem_unix.cpp) set(EXTRA_LIBS pthread) endif() diff --git a/src/Mem.cpp b/src/Mem.cpp index b7bf25117..f95540525 100644 --- a/src/Mem.cpp +++ b/src/Mem.cpp @@ -21,8 +21,67 @@ * along with this program. If not, see . */ + +#include + + +#include "crypto/CryptoNight.h" #include "Mem.h" +#include "Options.h" +bool Mem::m_doubleHash = false; +int Mem::m_algo = 0; +int Mem::m_flags = 0; +int Mem::m_threads = 0; +size_t Mem::m_offset = 0; uint8_t *Mem::m_memory = nullptr; -int Mem::m_flags = 0; + + +cryptonight_ctx *Mem::create(int algo, int threadId, bool doubleHash) +{ +# ifndef XMRIG_NO_AEON + if (algo == Options::ALGO_CRYPTONIGHT_LITE) { + return createLite(threadId, doubleHash); + } +# endif + + cryptonight_ctx *ctx = reinterpret_cast(&m_memory[MEMORY - sizeof(cryptonight_ctx) * (threadId + 1)]); + + const int ratio = doubleHash ? 2 : 1; + ctx->memory = &m_memory[MEMORY * (threadId * ratio + 1)]; + + return ctx; +} + + + +void *Mem::calloc(size_t num, size_t size) +{ + void *mem = &m_memory[m_offset]; + m_offset += (num * size); + + memset(mem, 0, num * size); + + return mem; +} + + +#ifndef XMRIG_NO_AEON +cryptonight_ctx *Mem::createLite(int threadId, bool doubleHash) { + cryptonight_ctx *ctx; + + if (!doubleHash) { + const size_t offset = MEMORY * (threadId + 1); + + ctx = reinterpret_cast(&m_memory[offset + MEMORY_LITE]); + ctx->memory = &m_memory[offset]; + return ctx; + } + + ctx = reinterpret_cast(&m_memory[MEMORY - sizeof(cryptonight_ctx) * (threadId + 1)]); + ctx->memory = &m_memory[MEMORY * (threadId + 1)]; + + return ctx; +} +#endif diff --git a/src/Mem.h b/src/Mem.h index d38417354..21a9f0f9a 100644 --- a/src/Mem.h +++ b/src/Mem.h @@ -25,7 +25,10 @@ #define __MEM_H__ -#include "crypto/CryptoNight.h" +#include + + +struct cryptonight_ctx; class Mem @@ -38,13 +41,23 @@ public: }; static bool allocate(int algo, int threads, bool doubleHash); + static cryptonight_ctx *create(int algo, int threadId, bool doubleHash); + static void *calloc(size_t num, size_t size); static void release(); static inline int flags() { return m_flags; } private: - static uint8_t *m_memory __attribute__((aligned(16))); + static bool m_doubleHash; + static int m_algo; static int m_flags; + static int m_threads; + static size_t m_offset; + static uint8_t *m_memory __attribute__((aligned(16))); + +# ifndef XMRIG_NO_AEON + static cryptonight_ctx *createLite(int threadId, bool doubleHash); +# endif }; diff --git a/src/Mem_unix.cpp b/src/Mem_unix.cpp new file mode 100644 index 000000000..a0690e79c --- /dev/null +++ b/src/Mem_unix.cpp @@ -0,0 +1,26 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2016-2017 XMRig + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "crypto/CryptoNight.h" +#include "Mem.h" diff --git a/src/Mem_win.cpp b/src/Mem_win.cpp index bab483bbc..42114eafa 100644 --- a/src/Mem_win.cpp +++ b/src/Mem_win.cpp @@ -26,10 +26,12 @@ #include #include #include +#include -#include "Mem.h" #include "Console.h" +#include "crypto/CryptoNight.h" +#include "Mem.h" #include "Options.h"