mirror of
https://github.com/xmrig/xmrig.git
synced 2024-11-17 08:17:40 +00:00
Merge branch 'master' into dev
This commit is contained in:
commit
71759e3752
34 changed files with 2619 additions and 404 deletions
24
CHANGELOG.md
24
CHANGELOG.md
|
@ -1,3 +1,27 @@
|
||||||
|
# v2.4.5
|
||||||
|
- [#324](https://github.com/xmrig/xmrig/pull/324) Fixed build without libmicrohttpd (CMake cache issue).
|
||||||
|
- [#341](https://github.com/xmrig/xmrig/issues/341) Fixed wrong exit code and added command line option `--dry-run`.
|
||||||
|
- [#385](https://github.com/xmrig/xmrig/pull/385) Up to 20% performance increase for non-AES CPU and fixed Intel Core 2 cache detection.
|
||||||
|
|
||||||
|
# v2.4.4
|
||||||
|
- Added libmicrohttpd version to --version output.
|
||||||
|
- Fixed bug in singal handler, in some cases miner wasn't shutdown properly.
|
||||||
|
- Fixed recent MSVC 2017 version detection.
|
||||||
|
- [#279](https://github.com/xmrig/xmrig/pull/279) Fixed build on some macOS versions.
|
||||||
|
|
||||||
|
# v2.4.3
|
||||||
|
- [#94](https://github.com/xmrig/xmrig/issues/94#issuecomment-342019257) [#216](https://github.com/xmrig/xmrig/issues/216) Added **ARMv8** and **ARMv7** support. Hardware AES supported, thanks [Imran Yusuff](https://github.com/imranyusuff).
|
||||||
|
- [#157](https://github.com/xmrig/xmrig/issues/157) [#196](https://github.com/xmrig/xmrig/issues/196) Fixed Linux compile issues.
|
||||||
|
- [#184](https://github.com/xmrig/xmrig/issues/184) Fixed cache size detection for CPUs with disabled Hyper-Threading.
|
||||||
|
- [#200](https://github.com/xmrig/xmrig/issues/200) In some cases miner was doesn't write log to stdout.
|
||||||
|
|
||||||
|
# v2.4.2
|
||||||
|
- [#60](https://github.com/xmrig/xmrig/issues/60) Added FreeBSD support, thanks [vcambur](https://github.com/vcambur).
|
||||||
|
- [#153](https://github.com/xmrig/xmrig/issues/153) Fixed issues with dwarfpool.com.
|
||||||
|
|
||||||
|
# v2.4.1
|
||||||
|
- [#147](https://github.com/xmrig/xmrig/issues/147) Fixed comparability with monero-stratum.
|
||||||
|
|
||||||
# v2.4.0
|
# v2.4.0
|
||||||
- Added [HTTP API](https://github.com/xmrig/xmrig/wiki/API).
|
- Added [HTTP API](https://github.com/xmrig/xmrig/wiki/API).
|
||||||
- Added comments support in config file.
|
- Added comments support in config file.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
project(xmrig)
|
project(xmrig)
|
||||||
|
|
||||||
option(WITH_LIBCPUID "Use Libcpuid" ON)
|
option(WITH_LIBCPUID "Use Libcpuid" ON)
|
||||||
|
@ -6,6 +6,7 @@ option(WITH_AEON "CryptoNight-Lite support" ON)
|
||||||
option(WITH_HTTPD "HTTP REST API" ON)
|
option(WITH_HTTPD "HTTP REST API" ON)
|
||||||
|
|
||||||
include (CheckIncludeFile)
|
include (CheckIncludeFile)
|
||||||
|
include (cmake/cpu.cmake)
|
||||||
|
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
|
@ -56,13 +57,19 @@ set(HEADERS_CRYPTO
|
||||||
src/crypto/c_keccak.h
|
src/crypto/c_keccak.h
|
||||||
src/crypto/c_skein.h
|
src/crypto/c_skein.h
|
||||||
src/crypto/CryptoNight.h
|
src/crypto/CryptoNight.h
|
||||||
src/crypto/CryptoNight_p.h
|
|
||||||
src/crypto/CryptoNight_test.h
|
src/crypto/CryptoNight_test.h
|
||||||
src/crypto/groestl_tables.h
|
src/crypto/groestl_tables.h
|
||||||
src/crypto/hash.h
|
src/crypto/hash.h
|
||||||
src/crypto/skein_port.h
|
src/crypto/skein_port.h
|
||||||
|
src/crypto/soft_aes.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (XMRIG_ARM)
|
||||||
|
set(HEADERS_CRYPTO "${HEADERS_CRYPTO}" src/crypto/CryptoNight_arm.h)
|
||||||
|
else()
|
||||||
|
set(HEADERS_CRYPTO "${HEADERS_CRYPTO}" src/crypto/CryptoNight_x86.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
src/api/Api.cpp
|
src/api/Api.cpp
|
||||||
src/api/ApiState.cpp
|
src/api/ApiState.cpp
|
||||||
|
@ -99,8 +106,6 @@ set(SOURCES_CRYPTO
|
||||||
src/crypto/c_blake256.c
|
src/crypto/c_blake256.c
|
||||||
src/crypto/c_jh.c
|
src/crypto/c_jh.c
|
||||||
src/crypto/c_skein.c
|
src/crypto/c_skein.c
|
||||||
src/crypto/soft_aes.c
|
|
||||||
src/crypto/soft_aes.c
|
|
||||||
src/crypto/CryptoNight.cpp
|
src/crypto/CryptoNight.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -130,68 +135,29 @@ else()
|
||||||
src/Platform_unix.cpp
|
src/Platform_unix.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(EXTRA_LIBS pthread)
|
set(EXTRA_LIBS pthread rt)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
|
||||||
|
set(EXTRA_LIBS ${EXTRA_LIBS} kvm)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||||
|
EXECUTE_PROCESS(COMMAND uname -o COMMAND tr -d '\n' OUTPUT_VARIABLE OPERATING_SYSTEM)
|
||||||
|
if (OPERATING_SYSTEM MATCHES "Android")
|
||||||
|
set(EXTRA_LIBS ${EXTRA_LIBS} log)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_definitions(/D__STDC_FORMAT_MACROS)
|
add_definitions(/D__STDC_FORMAT_MACROS)
|
||||||
add_definitions(/DUNICODE)
|
add_definitions(/DUNICODE)
|
||||||
add_definitions(/DRAPIDJSON_SSE2)
|
|
||||||
#add_definitions(/DAPP_DEBUG)
|
#add_definitions(/DAPP_DEBUG)
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
find_package(UV REQUIRED)
|
find_package(UV REQUIRED)
|
||||||
|
|
||||||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
include(cmake/flags.cmake)
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
|
||||||
|
|
||||||
|
|
||||||
# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -Wall -Wno-strict-aliasing")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2")
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes -Wall -fno-exceptions -fno-rtti")
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -s -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2")
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
|
||||||
else()
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(/D_GNU_SOURCE)
|
|
||||||
|
|
||||||
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -gdwarf-2")
|
|
||||||
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ox /Ot /Oi /MT /GL")
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ox /Ot /Oi /MT /GL")
|
|
||||||
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
add_definitions(/D_CRT_NONSTDC_NO_WARNINGS)
|
|
||||||
add_definitions(/DNOMINMAX)
|
|
||||||
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -Wall")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants")
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes -Wall -fno-exceptions -fno-rtti")
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants")
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WITH_LIBCPUID)
|
if (WITH_LIBCPUID)
|
||||||
add_subdirectory(src/3rdparty/libcpuid)
|
add_subdirectory(src/3rdparty/libcpuid)
|
||||||
|
@ -201,7 +167,12 @@ if (WITH_LIBCPUID)
|
||||||
set(SOURCES_CPUID src/Cpu.cpp)
|
set(SOURCES_CPUID src/Cpu.cpp)
|
||||||
else()
|
else()
|
||||||
add_definitions(/DXMRIG_NO_LIBCPUID)
|
add_definitions(/DXMRIG_NO_LIBCPUID)
|
||||||
|
|
||||||
|
if (XMRIG_ARM)
|
||||||
|
set(SOURCES_CPUID src/Cpu_arm.cpp)
|
||||||
|
else()
|
||||||
set(SOURCES_CPUID src/Cpu_stub.cpp)
|
set(SOURCES_CPUID src/Cpu_stub.cpp)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CHECK_INCLUDE_FILE (syslog.h HAVE_SYSLOG_H)
|
CHECK_INCLUDE_FILE (syslog.h HAVE_SYSLOG_H)
|
||||||
|
@ -224,6 +195,7 @@ if (WITH_HTTPD)
|
||||||
message(FATAL_ERROR "microhttpd NOT found: use `-DWITH_HTTPD=OFF` to build without http deamon support")
|
message(FATAL_ERROR "microhttpd NOT found: use `-DWITH_HTTPD=OFF` to build without http deamon support")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
|
set(MHD_LIBRARY "")
|
||||||
add_definitions(/DXMRIG_NO_HTTPD)
|
add_definitions(/DXMRIG_NO_HTTPD)
|
||||||
add_definitions(/DXMRIG_NO_API)
|
add_definitions(/DXMRIG_NO_API)
|
||||||
endif()
|
endif()
|
||||||
|
|
34
README.md
34
README.md
|
@ -1,8 +1,16 @@
|
||||||
# XMRig
|
# XMRig
|
||||||
XMRig is high performance Monero (XMR) CPU miner, with the official full Windows support.
|
[![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases)
|
||||||
Originally based on cpuminer-multi with heavy optimizations/rewrites and removing a lot of legacy code, since version 1.0.0 complete rewritten from scratch on C++.
|
[![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases)
|
||||||
|
[![GitHub Release Date](https://img.shields.io/github/release-date-pre/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/releases)
|
||||||
|
[![GitHub license](https://img.shields.io/github/license/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/blob/master/LICENSE)
|
||||||
|
[![GitHub stars](https://img.shields.io/github/stars/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/stargazers)
|
||||||
|
[![GitHub forks](https://img.shields.io/github/forks/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/network)
|
||||||
|
|
||||||
* This is the CPU-mining version, there is also a [NVIDIA GPU version](https://github.com/xmrig/xmrig-nvidia).
|
XMRig is a high performance Monero (XMR) CPU miner, with official support for Windows.
|
||||||
|
Originally based on cpuminer-multi with heavy optimizations/rewrites and removing a lot of legacy code, since version 1.0.0 completely rewritten from scratch on C++.
|
||||||
|
|
||||||
|
* This is the **CPU-mining** version, there is also a [NVIDIA GPU version](https://github.com/xmrig/xmrig-nvidia) and [AMD GPU version]( https://github.com/xmrig/xmrig-amd).
|
||||||
|
* [Roadmap](https://github.com/xmrig/xmrig/issues/106) for next releases.
|
||||||
|
|
||||||
<img src="http://i.imgur.com/OKZRVDh.png" width="619" >
|
<img src="http://i.imgur.com/OKZRVDh.png" width="619" >
|
||||||
|
|
||||||
|
@ -36,16 +44,7 @@ Originally based on cpuminer-multi with heavy optimizations/rewrites and removin
|
||||||
* Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build).
|
* Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
### Basic example
|
Use [config.xmrig.com](https://config.xmrig.com/xmrig) to generate, edit or share configurations.
|
||||||
```
|
|
||||||
xmrig.exe -o pool.minemonero.pro:5555 -u YOUR_WALLET -p x -k
|
|
||||||
```
|
|
||||||
|
|
||||||
### Failover
|
|
||||||
```
|
|
||||||
xmrig.exe -o pool.minemonero.pro:5555 -u YOUR_WALLET1 -p x -k -o pool.supportxmr.com:5555 -u YOUR_WALLET2 -p x -k
|
|
||||||
```
|
|
||||||
For failover you can add multiple pools, maximum count not limited.
|
|
||||||
|
|
||||||
### Options
|
### Options
|
||||||
```
|
```
|
||||||
|
@ -70,8 +69,11 @@ For failover you can add multiple pools, maximum count not limited.
|
||||||
-l, --log-file=FILE log all output to a file
|
-l, --log-file=FILE log all output to a file
|
||||||
--max-cpu-usage=N maximum CPU usage for automatic threads mode (default 75)
|
--max-cpu-usage=N maximum CPU usage for automatic threads mode (default 75)
|
||||||
--safe safe adjust threads and av settings for current CPU
|
--safe safe adjust threads and av settings for current CPU
|
||||||
--nicehash enable nicehash support
|
--nicehash enable nicehash/xmrig-proxy support
|
||||||
--print-time=N print hashrate report every N seconds
|
--print-time=N print hashrate report every N seconds
|
||||||
|
--api-port=N port for the miner API
|
||||||
|
--api-access-token=T access token for API
|
||||||
|
--api-worker-id=ID custom worker-id for API
|
||||||
-h, --help display this help and exit
|
-h, --help display this help and exit
|
||||||
-V, --version output version information and exit
|
-V, --version output version information and exit
|
||||||
```
|
```
|
||||||
|
@ -88,7 +90,7 @@ Since version 0.8.0.
|
||||||
## Common Issues
|
## Common Issues
|
||||||
### HUGE PAGES unavailable
|
### HUGE PAGES unavailable
|
||||||
* Run XMRig as Administrator.
|
* Run XMRig as Administrator.
|
||||||
* Since version 0.8.0 XMRig automatically enable SeLockMemoryPrivilege for current user, but reboot or sign out still required. [Manual instruction](https://msdn.microsoft.com/en-gb/library/ms190730.aspx).
|
* Since version 0.8.0 XMRig automatically enables SeLockMemoryPrivilege for current user, but reboot or sign out still required. [Manual instruction](https://msdn.microsoft.com/en-gb/library/ms190730.aspx).
|
||||||
|
|
||||||
## Other information
|
## Other information
|
||||||
* No HTTP support, only stratum protocol support.
|
* No HTTP support, only stratum protocol support.
|
||||||
|
@ -105,7 +107,7 @@ Please note performance is highly dependent on system load. The numbers above ar
|
||||||
### Maximum performance checklist
|
### Maximum performance checklist
|
||||||
* Idle operating system.
|
* Idle operating system.
|
||||||
* Do not exceed optimal thread count.
|
* Do not exceed optimal thread count.
|
||||||
* Use modern CPUs with AES-NI instructuon set.
|
* Use modern CPUs with AES-NI instruction set.
|
||||||
* Try setup optimal cpu affinity.
|
* Try setup optimal cpu affinity.
|
||||||
* Enable fast memory (Large/Huge pages).
|
* Enable fast memory (Large/Huge pages).
|
||||||
|
|
||||||
|
|
25
cmake/cpu.cmake
Normal file
25
cmake/cpu.cmake
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
if (NOT CMAKE_SYSTEM_PROCESSOR)
|
||||||
|
message(WARNING "CMAKE_SYSTEM_PROCESSOR not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$")
|
||||||
|
add_definitions(/DRAPIDJSON_SSE2)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64)$")
|
||||||
|
set(XMRIG_ARM ON)
|
||||||
|
set(XMRIG_ARMv8 ON)
|
||||||
|
set(WITH_LIBCPUID OFF)
|
||||||
|
|
||||||
|
add_definitions(/DXMRIG_ARM)
|
||||||
|
add_definitions(/DXMRIG_ARMv8)
|
||||||
|
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|armv7f|armv7s|armv7k|armv7-a|armv7l)$")
|
||||||
|
set(XMRIG_ARM ON)
|
||||||
|
set(XMRIG_ARMv7 ON)
|
||||||
|
set(WITH_LIBCPUID OFF)
|
||||||
|
|
||||||
|
add_definitions(/DXMRIG_ARM)
|
||||||
|
add_definitions(/DXMRIG_ARMv7)
|
||||||
|
endif()
|
69
cmake/flags.cmake
Normal file
69
cmake/flags.cmake
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
|
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||||
|
set(CMAKE_BUILD_TYPE Release)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-aliasing")
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-exceptions -fno-rtti")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -s -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2")
|
||||||
|
|
||||||
|
if (XMRIG_ARMv8)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crypto")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crypto -flax-vector-conversions")
|
||||||
|
elseif (XMRIG_ARMv7)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -flax-vector-conversions")
|
||||||
|
else()
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||||
|
else()
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_definitions(/D_GNU_SOURCE)
|
||||||
|
|
||||||
|
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -gdwarf-2")
|
||||||
|
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ox /Ot /Oi /MT /GL")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ox /Ot /Oi /MT /GL")
|
||||||
|
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
|
||||||
|
add_definitions(/D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
|
add_definitions(/DNOMINMAX)
|
||||||
|
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-exceptions -fno-rtti -Wno-missing-braces")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants")
|
||||||
|
|
||||||
|
if (XMRIG_ARMv8)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crypto")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crypto")
|
||||||
|
elseif (XMRIG_ARMv7)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
65
src/3rdparty/aligned_malloc.h
vendored
Normal file
65
src/3rdparty/aligned_malloc.h
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2016-2017 XMRig <support@xmrig.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ALIGNED_MALLOC_H__
|
||||||
|
#define __ALIGNED_MALLOC_H__
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
extern int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
|
||||||
|
#else
|
||||||
|
// Some systems (e.g. those with GNU libc) declare posix_memalign with an
|
||||||
|
// exception specifier. Via an "egregious workaround" in
|
||||||
|
// Sema::CheckEquivalentExceptionSpec, Clang accepts the following as a valid
|
||||||
|
// redeclaration of glibc's declaration.
|
||||||
|
extern "C" int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static __inline__ void *__attribute__((__always_inline__, __malloc__)) _mm_malloc(size_t __size, size_t __align)
|
||||||
|
{
|
||||||
|
if (__align == 1) {
|
||||||
|
return malloc(__size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(__align & (__align - 1)) && __align < sizeof(void *))
|
||||||
|
__align = sizeof(void *);
|
||||||
|
|
||||||
|
void *__mallocedMemory;
|
||||||
|
if (posix_memalign(&__mallocedMemory, __align, __size)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return __mallocedMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static __inline__ void __attribute__((__always_inline__)) _mm_free(void *__p)
|
||||||
|
{
|
||||||
|
free(__p);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ALIGNED_MALLOC_H__ */
|
40
src/App.cpp
40
src/App.cpp
|
@ -92,7 +92,9 @@ App::App(int argc, char **argv) :
|
||||||
|
|
||||||
m_network = new Network(m_options);
|
m_network = new Network(m_options);
|
||||||
|
|
||||||
uv_signal_init(uv_default_loop(), &m_signal);
|
uv_signal_init(uv_default_loop(), &m_sigHUP);
|
||||||
|
uv_signal_init(uv_default_loop(), &m_sigINT);
|
||||||
|
uv_signal_init(uv_default_loop(), &m_sigTERM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,12 +113,12 @@ App::~App()
|
||||||
int App::exec()
|
int App::exec()
|
||||||
{
|
{
|
||||||
if (!m_options) {
|
if (!m_options) {
|
||||||
return 0;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
uv_signal_start(&m_signal, App::onSignal, SIGHUP);
|
uv_signal_start(&m_sigHUP, App::onSignal, SIGHUP);
|
||||||
uv_signal_start(&m_signal, App::onSignal, SIGTERM);
|
uv_signal_start(&m_sigINT, App::onSignal, SIGINT);
|
||||||
uv_signal_start(&m_signal, App::onSignal, SIGINT);
|
uv_signal_start(&m_sigTERM, App::onSignal, SIGTERM);
|
||||||
|
|
||||||
background();
|
background();
|
||||||
|
|
||||||
|
@ -128,6 +130,13 @@ int App::exec()
|
||||||
Mem::allocate(m_options->algo(), m_options->threads(), m_options->doubleHash(), m_options->hugePages());
|
Mem::allocate(m_options->algo(), m_options->threads(), m_options->doubleHash(), m_options->hugePages());
|
||||||
Summary::print();
|
Summary::print();
|
||||||
|
|
||||||
|
if (m_options->dryRun()) {
|
||||||
|
LOG_NOTICE("OK");
|
||||||
|
release();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
# ifndef XMRIG_NO_API
|
# ifndef XMRIG_NO_API
|
||||||
Api::start();
|
Api::start();
|
||||||
# endif
|
# endif
|
||||||
|
@ -144,12 +153,7 @@ int App::exec()
|
||||||
const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
|
const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
|
||||||
uv_loop_close(uv_default_loop());
|
uv_loop_close(uv_default_loop());
|
||||||
|
|
||||||
delete m_network;
|
release();
|
||||||
|
|
||||||
Options::release();
|
|
||||||
Mem::release();
|
|
||||||
Platform::release();
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,8 +168,10 @@ void App::onConsoleCommand(char command)
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if (Workers::isEnabled()) {
|
||||||
LOG_INFO(m_options->colors() ? "\x1B[01;33mpaused\x1B[0m, press \x1B[01;35mr\x1B[0m to resume" : "paused, press 'r' to resume");
|
LOG_INFO(m_options->colors() ? "\x1B[01;33mpaused\x1B[0m, press \x1B[01;35mr\x1B[0m to resume" : "paused, press 'r' to resume");
|
||||||
Workers::setEnabled(false);
|
Workers::setEnabled(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
|
@ -196,6 +202,18 @@ void App::close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void App::release()
|
||||||
|
{
|
||||||
|
if (m_network) {
|
||||||
|
delete m_network;
|
||||||
|
}
|
||||||
|
|
||||||
|
Options::release();
|
||||||
|
Mem::release();
|
||||||
|
Platform::release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void App::onSignal(uv_signal_t *handle, int signum)
|
void App::onSignal(uv_signal_t *handle, int signum)
|
||||||
{
|
{
|
||||||
switch (signum)
|
switch (signum)
|
||||||
|
|
|
@ -51,6 +51,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
void background();
|
void background();
|
||||||
void close();
|
void close();
|
||||||
|
void release();
|
||||||
|
|
||||||
static void onSignal(uv_signal_t *handle, int signum);
|
static void onSignal(uv_signal_t *handle, int signum);
|
||||||
|
|
||||||
|
@ -60,7 +61,9 @@ private:
|
||||||
Httpd *m_httpd;
|
Httpd *m_httpd;
|
||||||
Network *m_network;
|
Network *m_network;
|
||||||
Options *m_options;
|
Options *m_options;
|
||||||
uv_signal_t m_signal;
|
uv_signal_t m_sigHUP;
|
||||||
|
uv_signal_t m_sigINT;
|
||||||
|
uv_signal_t m_sigTERM;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
14
src/Cpu.cpp
14
src/Cpu.cpp
|
@ -87,8 +87,12 @@ void Cpu::initCommon()
|
||||||
|
|
||||||
m_totalThreads = data.total_logical_cpus;
|
m_totalThreads = data.total_logical_cpus;
|
||||||
m_sockets = m_totalThreads / data.num_logical_cpus;
|
m_sockets = m_totalThreads / data.num_logical_cpus;
|
||||||
m_totalCores = data.num_cores *m_sockets;
|
|
||||||
|
|
||||||
|
if (m_sockets == 0) {
|
||||||
|
m_sockets = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_totalCores = data.num_cores * m_sockets;
|
||||||
m_l3_cache = data.l3_cache > 0 ? data.l3_cache * m_sockets : 0;
|
m_l3_cache = data.l3_cache > 0 ? data.l3_cache * m_sockets : 0;
|
||||||
|
|
||||||
// Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97
|
// Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97
|
||||||
|
@ -96,7 +100,13 @@ void Cpu::initCommon()
|
||||||
m_l2_cache = data.l2_cache * (m_totalCores / 2) * m_sockets;
|
m_l2_cache = data.l2_cache * (m_totalCores / 2) * m_sockets;
|
||||||
m_l2_exclusive = true;
|
m_l2_exclusive = true;
|
||||||
}
|
}
|
||||||
else {
|
// Workaround for Intel Core Solo, Core Duo, Core 2 Duo, Core 2 Quad and their Xeon homologue
|
||||||
|
// These processors have L2 cache shared by 2 cores.
|
||||||
|
else if (data.vendor == VENDOR_INTEL && data.family == 0x06 && (data.model == 0x0E || data.model == 0x0F || data.model == 0x07)) {
|
||||||
|
int l2_count_per_socket = m_totalCores > 1 ? m_totalCores / 2 : 1;
|
||||||
|
m_l2_cache = data.l2_cache > 0 ? data.l2_cache * l2_count_per_socket * m_sockets : 0;
|
||||||
|
}
|
||||||
|
else{
|
||||||
m_l2_cache = data.l2_cache > 0 ? data.l2_cache * m_totalCores * m_sockets : 0;
|
m_l2_cache = data.l2_cache > 0 ? data.l2_cache * m_totalCores * m_sockets : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
54
src/Cpu_arm.cpp
Normal file
54
src/Cpu_arm.cpp
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2016-2017 XMRig <support@xmrig.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "Cpu.h"
|
||||||
|
|
||||||
|
|
||||||
|
char Cpu::m_brand[64] = { 0 };
|
||||||
|
int Cpu::m_flags = 0;
|
||||||
|
int Cpu::m_l2_cache = 0;
|
||||||
|
int Cpu::m_l3_cache = 0;
|
||||||
|
int Cpu::m_sockets = 1;
|
||||||
|
int Cpu::m_totalCores = 0;
|
||||||
|
int Cpu::m_totalThreads = 0;
|
||||||
|
|
||||||
|
|
||||||
|
int Cpu::optimalThreadsCount(int algo, bool doubleHash, int maxCpuUsage)
|
||||||
|
{
|
||||||
|
return m_totalThreads;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Cpu::initCommon()
|
||||||
|
{
|
||||||
|
memcpy(m_brand, "Unknown", 7);
|
||||||
|
|
||||||
|
# if defined(XMRIG_ARMv8)
|
||||||
|
m_flags |= X86_64;
|
||||||
|
m_flags |= AES;
|
||||||
|
# endif
|
||||||
|
}
|
|
@ -22,6 +22,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/param.h>
|
||||||
|
# include <sys/cpuset.h>
|
||||||
|
# include <pthread_np.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -31,6 +39,11 @@
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
typedef cpuset_t cpu_set_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void Cpu::init()
|
void Cpu::init()
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_NO_LIBCPUID
|
# ifdef XMRIG_NO_LIBCPUID
|
||||||
|
@ -53,8 +66,14 @@ void Cpu::setAffinity(int id, uint64_t mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == -1) {
|
if (id == -1) {
|
||||||
|
# ifndef __FreeBSD__
|
||||||
sched_setaffinity(0, sizeof(&set), &set);
|
sched_setaffinity(0, sizeof(&set), &set);
|
||||||
|
# endif
|
||||||
} else {
|
} else {
|
||||||
|
# ifndef __ANDROID__
|
||||||
pthread_setaffinity_np(pthread_self(), sizeof(&set), &set);
|
pthread_setaffinity_np(pthread_self(), sizeof(&set), &set);
|
||||||
|
# else
|
||||||
|
sched_setaffinity(gettid(), sizeof(&set), &set);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,10 +23,16 @@
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <mm_malloc.h>
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XMRIG_ARM) && !defined(__clang__)
|
||||||
|
# include "aligned_malloc.h"
|
||||||
|
#else
|
||||||
|
# include <mm_malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "crypto/CryptoNight.h"
|
#include "crypto/CryptoNight.h"
|
||||||
#include "log/Log.h"
|
#include "log/Log.h"
|
||||||
#include "Mem.h"
|
#include "Mem.h"
|
||||||
|
@ -51,10 +57,11 @@ bool Mem::allocate(int algo, int threads, bool doubleHash, bool enabled)
|
||||||
|
|
||||||
# if defined(__APPLE__)
|
# if defined(__APPLE__)
|
||||||
m_memory = static_cast<uint8_t*>(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0));
|
m_memory = static_cast<uint8_t*>(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0));
|
||||||
|
# elif defined(__FreeBSD__)
|
||||||
|
m_memory = static_cast<uint8_t*>(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER | MAP_PREFAULT_READ, -1, 0));
|
||||||
# else
|
# else
|
||||||
m_memory = static_cast<uint8_t*>(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_POPULATE, 0, 0));
|
m_memory = static_cast<uint8_t*>(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_POPULATE, 0, 0));
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (m_memory == MAP_FAILED) {
|
if (m_memory == MAP_FAILED) {
|
||||||
m_memory = static_cast<uint8_t*>(_mm_malloc(size, 16));
|
m_memory = static_cast<uint8_t*>(_mm_malloc(size, 16));
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -33,6 +33,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef XMRIG_NO_HTTPD
|
||||||
|
# include <microhttpd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
#include "donate.h"
|
#include "donate.h"
|
||||||
#include "net/Url.h"
|
#include "net/Url.h"
|
||||||
|
@ -96,12 +101,16 @@ static char const short_options[] = "a:c:khBp:Px:r:R:s:t:T:o:u:O:v:Vl:S";
|
||||||
|
|
||||||
static struct option const options[] = {
|
static struct option const options[] = {
|
||||||
{ "algo", 1, nullptr, 'a' },
|
{ "algo", 1, nullptr, 'a' },
|
||||||
|
{ "api-access-token", 1, nullptr, 4001 },
|
||||||
|
{ "api-port", 1, nullptr, 4000 },
|
||||||
|
{ "api-worker-id", 1, nullptr, 4002 },
|
||||||
{ "av", 1, nullptr, 'v' },
|
{ "av", 1, nullptr, 'v' },
|
||||||
{ "background", 0, nullptr, 'B' },
|
{ "background", 0, nullptr, 'B' },
|
||||||
{ "config", 1, nullptr, 'c' },
|
{ "config", 1, nullptr, 'c' },
|
||||||
{ "cpu-affinity", 1, nullptr, 1020 },
|
{ "cpu-affinity", 1, nullptr, 1020 },
|
||||||
{ "cpu-priority", 1, nullptr, 1021 },
|
{ "cpu-priority", 1, nullptr, 1021 },
|
||||||
{ "donate-level", 1, nullptr, 1003 },
|
{ "donate-level", 1, nullptr, 1003 },
|
||||||
|
{ "dry-run", 0, nullptr, 5000 },
|
||||||
{ "help", 0, nullptr, 'h' },
|
{ "help", 0, nullptr, 'h' },
|
||||||
{ "keepalive", 0, nullptr ,'k' },
|
{ "keepalive", 0, nullptr ,'k' },
|
||||||
{ "log-file", 1, nullptr, 'l' },
|
{ "log-file", 1, nullptr, 'l' },
|
||||||
|
@ -121,9 +130,6 @@ static struct option const options[] = {
|
||||||
{ "user-agent", 1, nullptr, 1008 },
|
{ "user-agent", 1, nullptr, 1008 },
|
||||||
{ "userpass", 1, nullptr, 'O' },
|
{ "userpass", 1, nullptr, 'O' },
|
||||||
{ "version", 0, nullptr, 'V' },
|
{ "version", 0, nullptr, 'V' },
|
||||||
{ "api-port", 1, nullptr, 4000 },
|
|
||||||
{ "api-access-token", 1, nullptr, 4001 },
|
|
||||||
{ "api-worker-id", 1, nullptr, 4002 },
|
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -136,6 +142,7 @@ static struct option const config_options[] = {
|
||||||
{ "cpu-affinity", 1, nullptr, 1020 },
|
{ "cpu-affinity", 1, nullptr, 1020 },
|
||||||
{ "cpu-priority", 1, nullptr, 1021 },
|
{ "cpu-priority", 1, nullptr, 1021 },
|
||||||
{ "donate-level", 1, nullptr, 1003 },
|
{ "donate-level", 1, nullptr, 1003 },
|
||||||
|
{ "dry-run", 0, nullptr, 5000 },
|
||||||
{ "huge-pages", 0, nullptr, 1009 },
|
{ "huge-pages", 0, nullptr, 1009 },
|
||||||
{ "log-file", 1, nullptr, 'l' },
|
{ "log-file", 1, nullptr, 'l' },
|
||||||
{ "max-cpu-usage", 1, nullptr, 1004 },
|
{ "max-cpu-usage", 1, nullptr, 1004 },
|
||||||
|
@ -200,6 +207,7 @@ Options::Options(int argc, char **argv) :
|
||||||
m_background(false),
|
m_background(false),
|
||||||
m_colors(true),
|
m_colors(true),
|
||||||
m_doubleHash(false),
|
m_doubleHash(false),
|
||||||
|
m_dryRun(false),
|
||||||
m_hugePages(true),
|
m_hugePages(true),
|
||||||
m_ready(false),
|
m_ready(false),
|
||||||
m_safe(false),
|
m_safe(false),
|
||||||
|
@ -379,6 +387,7 @@ bool Options::parseArg(int key, const char *arg)
|
||||||
case 'S': /* --syslog */
|
case 'S': /* --syslog */
|
||||||
case 1005: /* --safe */
|
case 1005: /* --safe */
|
||||||
case 1006: /* --nicehash */
|
case 1006: /* --nicehash */
|
||||||
|
case 5000: /* --dry-run */
|
||||||
return parseBoolean(key, true);
|
return parseBoolean(key, true);
|
||||||
|
|
||||||
case 1002: /* --no-color */
|
case 1002: /* --no-color */
|
||||||
|
@ -552,6 +561,10 @@ bool Options::parseBoolean(int key, bool enable)
|
||||||
m_colors = enable;
|
m_colors = enable;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5000: /* --dry-run */
|
||||||
|
m_dryRun = enable;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -665,6 +678,10 @@ void Options::showVersion()
|
||||||
"\n");
|
"\n");
|
||||||
|
|
||||||
printf("\nlibuv/%s\n", uv_version_string());
|
printf("\nlibuv/%s\n", uv_version_string());
|
||||||
|
|
||||||
|
# ifndef XMRIG_NO_HTTPD
|
||||||
|
printf("libmicrohttpd/%s\n", MHD_get_version());
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ public:
|
||||||
inline bool background() const { return m_background; }
|
inline bool background() const { return m_background; }
|
||||||
inline bool colors() const { return m_colors; }
|
inline bool colors() const { return m_colors; }
|
||||||
inline bool doubleHash() const { return m_doubleHash; }
|
inline bool doubleHash() const { return m_doubleHash; }
|
||||||
|
inline bool dryRun() const { return m_dryRun; }
|
||||||
inline bool hugePages() const { return m_hugePages; }
|
inline bool hugePages() const { return m_hugePages; }
|
||||||
inline bool syslog() const { return m_syslog; }
|
inline bool syslog() const { return m_syslog; }
|
||||||
inline const char *apiToken() const { return m_apiToken; }
|
inline const char *apiToken() const { return m_apiToken; }
|
||||||
|
@ -76,6 +77,7 @@ public:
|
||||||
inline int retryPause() const { return m_retryPause; }
|
inline int retryPause() const { return m_retryPause; }
|
||||||
inline int threads() const { return m_threads; }
|
inline int threads() const { return m_threads; }
|
||||||
inline int64_t affinity() const { return m_affinity; }
|
inline int64_t affinity() const { return m_affinity; }
|
||||||
|
inline void setColors(bool colors) { m_colors = colors; }
|
||||||
|
|
||||||
inline static void release() { delete m_self; }
|
inline static void release() { delete m_self; }
|
||||||
|
|
||||||
|
@ -109,6 +111,7 @@ private:
|
||||||
bool m_background;
|
bool m_background;
|
||||||
bool m_colors;
|
bool m_colors;
|
||||||
bool m_doubleHash;
|
bool m_doubleHash;
|
||||||
|
bool m_dryRun;
|
||||||
bool m_hugePages;
|
bool m_hugePages;
|
||||||
bool m_ready;
|
bool m_ready;
|
||||||
bool m_safe;
|
bool m_safe;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
@ -116,6 +116,7 @@ void Platform::setThreadPriority(int priority)
|
||||||
|
|
||||||
setpriority(PRIO_PROCESS, 0, prio);
|
setpriority(PRIO_PROCESS, 0, prio);
|
||||||
|
|
||||||
|
# ifdef SCHED_IDLE
|
||||||
if (priority == 0) {
|
if (priority == 0) {
|
||||||
sched_param param;
|
sched_param param;
|
||||||
param.sched_priority = 0;
|
param.sched_priority = 0;
|
||||||
|
@ -124,4 +125,5 @@ void Platform::setThreadPriority(int priority)
|
||||||
sched_setscheduler(0, SCHED_BATCH, ¶m);
|
sched_setscheduler(0, SCHED_BATCH, ¶m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cmath>
|
#include <math.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
@ -53,11 +53,11 @@ extern "C"
|
||||||
|
|
||||||
static inline double normalize(double d)
|
static inline double normalize(double d)
|
||||||
{
|
{
|
||||||
if (!std::isnormal(d)) {
|
if (!isnormal(d)) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::floor(d * 100.0) / 100.0;
|
return floor(d * 100.0) / 100.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@ private:
|
||||||
double m_highestHashrate;
|
double m_highestHashrate;
|
||||||
double m_totalHashrate[3];
|
double m_totalHashrate[3];
|
||||||
int m_threads;
|
int m_threads;
|
||||||
mutable char m_buf[4096];
|
|
||||||
NetworkState m_network;
|
NetworkState m_network;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,10 +31,6 @@
|
||||||
#include "log/Log.h"
|
#include "log/Log.h"
|
||||||
|
|
||||||
|
|
||||||
static const char k500 [] = "{\"error\":\"INTERNAL_SERVER_ERROR\"}";
|
|
||||||
static const size_t k500Size = sizeof(k500) - 1;
|
|
||||||
|
|
||||||
|
|
||||||
Httpd::Httpd(int port, const char *accessToken) :
|
Httpd::Httpd(int port, const char *accessToken) :
|
||||||
m_accessToken(accessToken),
|
m_accessToken(accessToken),
|
||||||
m_port(port),
|
m_port(port),
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
@ -45,7 +46,7 @@ NetworkState::NetworkState() :
|
||||||
|
|
||||||
int NetworkState::connectionTime() const
|
int NetworkState::connectionTime() const
|
||||||
{
|
{
|
||||||
return m_active ? ((uv_now(uv_default_loop()) - m_connectionTime) / 1000) : 0;
|
return m_active ? (int)((uv_now(uv_default_loop()) - m_connectionTime) / 1000) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ uint32_t NetworkState::avgTime() const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (uint32_t) connectionTime() / m_latency.size();
|
return connectionTime() / (uint32_t)m_latency.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,13 @@
|
||||||
|
|
||||||
|
|
||||||
#include "crypto/CryptoNight.h"
|
#include "crypto/CryptoNight.h"
|
||||||
#include "crypto/CryptoNight_p.h"
|
|
||||||
|
#if defined(XMRIG_ARM)
|
||||||
|
# include "crypto/CryptoNight_arm.h"
|
||||||
|
#else
|
||||||
|
# include "crypto/CryptoNight_x86.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "crypto/CryptoNight_test.h"
|
#include "crypto/CryptoNight_test.h"
|
||||||
#include "net/Job.h"
|
#include "net/Job.h"
|
||||||
#include "net/JobResult.h"
|
#include "net/JobResult.h"
|
||||||
|
@ -34,12 +40,16 @@ void (*cryptonight_hash_ctx)(const void *input, size_t size, void *output, crypt
|
||||||
|
|
||||||
|
|
||||||
static void cryptonight_av1_aesni(const void *input, size_t size, void *output, struct cryptonight_ctx *ctx) {
|
static void cryptonight_av1_aesni(const void *input, size_t size, void *output, struct cryptonight_ctx *ctx) {
|
||||||
|
# if !defined(XMRIG_ARMv7)
|
||||||
cryptonight_hash<0x80000, MEMORY, 0x1FFFF0, false>(input, size, output, ctx);
|
cryptonight_hash<0x80000, MEMORY, 0x1FFFF0, false>(input, size, output, ctx);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void cryptonight_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
static void cryptonight_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
||||||
|
# if !defined(XMRIG_ARMv7)
|
||||||
cryptonight_double_hash<0x80000, MEMORY, 0x1FFFF0, false>(input, size, output, ctx);
|
cryptonight_double_hash<0x80000, MEMORY, 0x1FFFF0, false>(input, size, output, ctx);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,12 +65,16 @@ static void cryptonight_av4_softaes_double(const void *input, size_t size, void
|
||||||
|
|
||||||
#ifndef XMRIG_NO_AEON
|
#ifndef XMRIG_NO_AEON
|
||||||
static void cryptonight_lite_av1_aesni(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
static void cryptonight_lite_av1_aesni(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
||||||
|
# if !defined(XMRIG_ARMv7)
|
||||||
cryptonight_hash<0x40000, MEMORY_LITE, 0xFFFF0, false>(input, size, output, ctx);
|
cryptonight_hash<0x40000, MEMORY_LITE, 0xFFFF0, false>(input, size, output, ctx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void cryptonight_lite_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
static void cryptonight_lite_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx) {
|
||||||
|
# if !defined(XMRIG_ARMv7)
|
||||||
cryptonight_double_hash<0x40000, MEMORY_LITE, 0xFFFF0, false>(input, size, output, ctx);
|
cryptonight_double_hash<0x40000, MEMORY_LITE, 0xFFFF0, false>(input, size, output, ctx);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
493
src/crypto/CryptoNight_arm.h
Normal file
493
src/crypto/CryptoNight_arm.h
Normal file
|
@ -0,0 +1,493 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2016 Imran Yusuff <https://github.com/imranyusuff>
|
||||||
|
* Copyright 2016-2017 XMRig <support@xmrig.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CRYPTONIGHT_ARM_H__
|
||||||
|
#define __CRYPTONIGHT_ARM_H__
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XMRIG_ARM) && !defined(__clang__)
|
||||||
|
# include "aligned_malloc.h"
|
||||||
|
#else
|
||||||
|
# include <mm_malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "crypto/CryptoNight.h"
|
||||||
|
#include "crypto/soft_aes.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "crypto/c_keccak.h"
|
||||||
|
#include "crypto/c_groestl.h"
|
||||||
|
#include "crypto/c_blake256.h"
|
||||||
|
#include "crypto/c_jh.h"
|
||||||
|
#include "crypto/c_skein.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void do_blake_hash(const void* input, size_t len, char* output) {
|
||||||
|
blake256_hash(reinterpret_cast<uint8_t*>(output), static_cast<const uint8_t*>(input), len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void do_groestl_hash(const void* input, size_t len, char* output) {
|
||||||
|
groestl(static_cast<const uint8_t*>(input), len * 8, reinterpret_cast<uint8_t*>(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void do_jh_hash(const void* input, size_t len, char* output) {
|
||||||
|
jh_hash(32 * 8, static_cast<const uint8_t*>(input), 8 * len, reinterpret_cast<uint8_t*>(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void do_skein_hash(const void* input, size_t len, char* output) {
|
||||||
|
xmr_skein(static_cast<const uint8_t*>(input), reinterpret_cast<uint8_t*>(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void (* const extra_hashes[4])(const void *, size_t, char *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash};
|
||||||
|
|
||||||
|
|
||||||
|
static inline __attribute__((always_inline)) __m128i _mm_set_epi64x(const uint64_t a, const uint64_t b)
|
||||||
|
{
|
||||||
|
return vcombine_u64(vcreate_u64(b), vcreate_u64(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this one was not implemented yet so here it is */
|
||||||
|
static inline __attribute__((always_inline)) uint64_t _mm_cvtsi128_si64(__m128i a)
|
||||||
|
{
|
||||||
|
return vgetq_lane_u64(a, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define EXTRACT64(X) _mm_cvtsi128_si64(X)
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XMRIG_ARMv8)
|
||||||
|
static inline uint64_t __umul128(uint64_t a, uint64_t b, uint64_t* hi)
|
||||||
|
{
|
||||||
|
unsigned __int128 r = (unsigned __int128) a * (unsigned __int128) b;
|
||||||
|
*hi = r >> 64;
|
||||||
|
return (uint64_t) r;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline uint64_t __umul128(uint64_t multiplier, uint64_t multiplicand, uint64_t *product_hi) {
|
||||||
|
// multiplier = ab = a * 2^32 + b
|
||||||
|
// multiplicand = cd = c * 2^32 + d
|
||||||
|
// ab * cd = a * c * 2^64 + (a * d + b * c) * 2^32 + b * d
|
||||||
|
uint64_t a = multiplier >> 32;
|
||||||
|
uint64_t b = multiplier & 0xFFFFFFFF;
|
||||||
|
uint64_t c = multiplicand >> 32;
|
||||||
|
uint64_t d = multiplicand & 0xFFFFFFFF;
|
||||||
|
|
||||||
|
//uint64_t ac = a * c;
|
||||||
|
uint64_t ad = a * d;
|
||||||
|
//uint64_t bc = b * c;
|
||||||
|
uint64_t bd = b * d;
|
||||||
|
|
||||||
|
uint64_t adbc = ad + (b * c);
|
||||||
|
uint64_t adbc_carry = adbc < ad ? 1 : 0;
|
||||||
|
|
||||||
|
// multiplier * multiplicand = product_hi * 2^64 + product_lo
|
||||||
|
uint64_t product_lo = bd + (adbc << 32);
|
||||||
|
uint64_t product_lo_carry = product_lo < bd ? 1 : 0;
|
||||||
|
*product_hi = (a * c) + (adbc >> 32) + (adbc_carry << 32) + product_lo_carry;
|
||||||
|
|
||||||
|
return product_lo;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// This will shift and xor tmp1 into itself as 4 32-bit vals such as
|
||||||
|
// sl_xor(a1 a2 a3 a4) = a1 (a2^a1) (a3^a2^a1) (a4^a3^a2^a1)
|
||||||
|
static inline __m128i sl_xor(__m128i tmp1)
|
||||||
|
{
|
||||||
|
__m128i tmp4;
|
||||||
|
tmp4 = _mm_slli_si128(tmp1, 0x04);
|
||||||
|
tmp1 = _mm_xor_si128(tmp1, tmp4);
|
||||||
|
tmp4 = _mm_slli_si128(tmp4, 0x04);
|
||||||
|
tmp1 = _mm_xor_si128(tmp1, tmp4);
|
||||||
|
tmp4 = _mm_slli_si128(tmp4, 0x04);
|
||||||
|
tmp1 = _mm_xor_si128(tmp1, tmp4);
|
||||||
|
return tmp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<uint8_t rcon>
|
||||||
|
static inline void aes_genkey_sub(__m128i* xout0, __m128i* xout2)
|
||||||
|
{
|
||||||
|
// __m128i xout1 = _mm_aeskeygenassist_si128(*xout2, rcon);
|
||||||
|
// xout1 = _mm_shuffle_epi32(xout1, 0xFF); // see PSHUFD, set all elems to 4th elem
|
||||||
|
// *xout0 = sl_xor(*xout0);
|
||||||
|
// *xout0 = _mm_xor_si128(*xout0, xout1);
|
||||||
|
// xout1 = _mm_aeskeygenassist_si128(*xout0, 0x00);
|
||||||
|
// xout1 = _mm_shuffle_epi32(xout1, 0xAA); // see PSHUFD, set all elems to 3rd elem
|
||||||
|
// *xout2 = sl_xor(*xout2);
|
||||||
|
// *xout2 = _mm_xor_si128(*xout2, xout1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<uint8_t rcon>
|
||||||
|
static inline void soft_aes_genkey_sub(__m128i* xout0, __m128i* xout2)
|
||||||
|
{
|
||||||
|
__m128i xout1 = soft_aeskeygenassist<rcon>(*xout2);
|
||||||
|
xout1 = _mm_shuffle_epi32(xout1, 0xFF); // see PSHUFD, set all elems to 4th elem
|
||||||
|
*xout0 = sl_xor(*xout0);
|
||||||
|
*xout0 = _mm_xor_si128(*xout0, xout1);
|
||||||
|
xout1 = soft_aeskeygenassist<0x00>(*xout0);
|
||||||
|
xout1 = _mm_shuffle_epi32(xout1, 0xAA); // see PSHUFD, set all elems to 3rd elem
|
||||||
|
*xout2 = sl_xor(*xout2);
|
||||||
|
*xout2 = _mm_xor_si128(*xout2, xout1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<bool SOFT_AES>
|
||||||
|
static inline void aes_genkey(const __m128i* memory, __m128i* k0, __m128i* k1, __m128i* k2, __m128i* k3, __m128i* k4, __m128i* k5, __m128i* k6, __m128i* k7, __m128i* k8, __m128i* k9)
|
||||||
|
{
|
||||||
|
__m128i xout0 = _mm_load_si128(memory);
|
||||||
|
__m128i xout2 = _mm_load_si128(memory + 1);
|
||||||
|
*k0 = xout0;
|
||||||
|
*k1 = xout2;
|
||||||
|
|
||||||
|
SOFT_AES ? soft_aes_genkey_sub<0x01>(&xout0, &xout2) : soft_aes_genkey_sub<0x01>(&xout0, &xout2);
|
||||||
|
*k2 = xout0;
|
||||||
|
*k3 = xout2;
|
||||||
|
|
||||||
|
SOFT_AES ? soft_aes_genkey_sub<0x02>(&xout0, &xout2) : soft_aes_genkey_sub<0x02>(&xout0, &xout2);
|
||||||
|
*k4 = xout0;
|
||||||
|
*k5 = xout2;
|
||||||
|
|
||||||
|
SOFT_AES ? soft_aes_genkey_sub<0x04>(&xout0, &xout2) : soft_aes_genkey_sub<0x04>(&xout0, &xout2);
|
||||||
|
*k6 = xout0;
|
||||||
|
*k7 = xout2;
|
||||||
|
|
||||||
|
SOFT_AES ? soft_aes_genkey_sub<0x08>(&xout0, &xout2) : soft_aes_genkey_sub<0x08>(&xout0, &xout2);
|
||||||
|
*k8 = xout0;
|
||||||
|
*k9 = xout2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<bool SOFT_AES>
|
||||||
|
static inline void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7)
|
||||||
|
{
|
||||||
|
if (SOFT_AES) {
|
||||||
|
*x0 = soft_aesenc((uint32_t*)x0, key);
|
||||||
|
*x1 = soft_aesenc((uint32_t*)x1, key);
|
||||||
|
*x2 = soft_aesenc((uint32_t*)x2, key);
|
||||||
|
*x3 = soft_aesenc((uint32_t*)x3, key);
|
||||||
|
*x4 = soft_aesenc((uint32_t*)x4, key);
|
||||||
|
*x5 = soft_aesenc((uint32_t*)x5, key);
|
||||||
|
*x6 = soft_aesenc((uint32_t*)x6, key);
|
||||||
|
*x7 = soft_aesenc((uint32_t*)x7, key);
|
||||||
|
}
|
||||||
|
# ifndef XMRIG_ARMv7
|
||||||
|
else {
|
||||||
|
*x0 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x0), key));
|
||||||
|
*x1 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x1), key));
|
||||||
|
*x2 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x2), key));
|
||||||
|
*x3 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x3), key));
|
||||||
|
*x4 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x4), key));
|
||||||
|
*x5 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x5), key));
|
||||||
|
*x6 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x6), key));
|
||||||
|
*x7 = vaesmcq_u8(vaeseq_u8(*((uint8x16_t *) x7), key));
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<size_t MEM, bool SOFT_AES>
|
||||||
|
static inline void cn_explode_scratchpad(const __m128i *input, __m128i *output)
|
||||||
|
{
|
||||||
|
__m128i xin0, xin1, xin2, xin3, xin4, xin5, xin6, xin7;
|
||||||
|
__m128i k0, k1, k2, k3, k4, k5, k6, k7, k8, k9;
|
||||||
|
|
||||||
|
aes_genkey<SOFT_AES>(input, &k0, &k1, &k2, &k3, &k4, &k5, &k6, &k7, &k8, &k9);
|
||||||
|
|
||||||
|
xin0 = _mm_load_si128(input + 4);
|
||||||
|
xin1 = _mm_load_si128(input + 5);
|
||||||
|
xin2 = _mm_load_si128(input + 6);
|
||||||
|
xin3 = _mm_load_si128(input + 7);
|
||||||
|
xin4 = _mm_load_si128(input + 8);
|
||||||
|
xin5 = _mm_load_si128(input + 9);
|
||||||
|
xin6 = _mm_load_si128(input + 10);
|
||||||
|
xin7 = _mm_load_si128(input + 11);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < MEM / sizeof(__m128i); i += 8) {
|
||||||
|
if (!SOFT_AES) {
|
||||||
|
aes_round<SOFT_AES>(_mm_setzero_si128(), &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
}
|
||||||
|
|
||||||
|
aes_round<SOFT_AES>(k0, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k1, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k2, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k3, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k4, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k5, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k6, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k7, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
aes_round<SOFT_AES>(k8, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
|
||||||
|
if (!SOFT_AES) {
|
||||||
|
xin0 ^= k9;
|
||||||
|
xin1 ^= k9;
|
||||||
|
xin2 ^= k9;
|
||||||
|
xin3 ^= k9;
|
||||||
|
xin4 ^= k9;
|
||||||
|
xin5 ^= k9;
|
||||||
|
xin6 ^= k9;
|
||||||
|
xin7 ^= k9;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aes_round<SOFT_AES>(k9, &xin0, &xin1, &xin2, &xin3, &xin4, &xin5, &xin6, &xin7);
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_store_si128(output + i + 0, xin0);
|
||||||
|
_mm_store_si128(output + i + 1, xin1);
|
||||||
|
_mm_store_si128(output + i + 2, xin2);
|
||||||
|
_mm_store_si128(output + i + 3, xin3);
|
||||||
|
_mm_store_si128(output + i + 4, xin4);
|
||||||
|
_mm_store_si128(output + i + 5, xin5);
|
||||||
|
_mm_store_si128(output + i + 6, xin6);
|
||||||
|
_mm_store_si128(output + i + 7, xin7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<size_t MEM, bool SOFT_AES>
|
||||||
|
static inline void cn_implode_scratchpad(const __m128i *input, __m128i *output)
|
||||||
|
{
|
||||||
|
__m128i xout0, xout1, xout2, xout3, xout4, xout5, xout6, xout7;
|
||||||
|
__m128i k0, k1, k2, k3, k4, k5, k6, k7, k8, k9;
|
||||||
|
|
||||||
|
aes_genkey<SOFT_AES>(output + 2, &k0, &k1, &k2, &k3, &k4, &k5, &k6, &k7, &k8, &k9);
|
||||||
|
|
||||||
|
xout0 = _mm_load_si128(output + 4);
|
||||||
|
xout1 = _mm_load_si128(output + 5);
|
||||||
|
xout2 = _mm_load_si128(output + 6);
|
||||||
|
xout3 = _mm_load_si128(output + 7);
|
||||||
|
xout4 = _mm_load_si128(output + 8);
|
||||||
|
xout5 = _mm_load_si128(output + 9);
|
||||||
|
xout6 = _mm_load_si128(output + 10);
|
||||||
|
xout7 = _mm_load_si128(output + 11);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < MEM / sizeof(__m128i); i += 8)
|
||||||
|
{
|
||||||
|
xout0 = _mm_xor_si128(_mm_load_si128(input + i + 0), xout0);
|
||||||
|
xout1 = _mm_xor_si128(_mm_load_si128(input + i + 1), xout1);
|
||||||
|
xout2 = _mm_xor_si128(_mm_load_si128(input + i + 2), xout2);
|
||||||
|
xout3 = _mm_xor_si128(_mm_load_si128(input + i + 3), xout3);
|
||||||
|
xout4 = _mm_xor_si128(_mm_load_si128(input + i + 4), xout4);
|
||||||
|
xout5 = _mm_xor_si128(_mm_load_si128(input + i + 5), xout5);
|
||||||
|
xout6 = _mm_xor_si128(_mm_load_si128(input + i + 6), xout6);
|
||||||
|
xout7 = _mm_xor_si128(_mm_load_si128(input + i + 7), xout7);
|
||||||
|
|
||||||
|
if (!SOFT_AES) {
|
||||||
|
aes_round<SOFT_AES>(_mm_setzero_si128(), &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
}
|
||||||
|
|
||||||
|
aes_round<SOFT_AES>(k0, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k1, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k2, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k3, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k4, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k5, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k6, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k7, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
aes_round<SOFT_AES>(k8, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
|
||||||
|
if (!SOFT_AES) {
|
||||||
|
xout0 ^= k9;
|
||||||
|
xout1 ^= k9;
|
||||||
|
xout2 ^= k9;
|
||||||
|
xout3 ^= k9;
|
||||||
|
xout4 ^= k9;
|
||||||
|
xout5 ^= k9;
|
||||||
|
xout6 ^= k9;
|
||||||
|
xout7 ^= k9;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aes_round<SOFT_AES>(k9, &xout0, &xout1, &xout2, &xout3, &xout4, &xout5, &xout6, &xout7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_store_si128(output + 4, xout0);
|
||||||
|
_mm_store_si128(output + 5, xout1);
|
||||||
|
_mm_store_si128(output + 6, xout2);
|
||||||
|
_mm_store_si128(output + 7, xout3);
|
||||||
|
_mm_store_si128(output + 8, xout4);
|
||||||
|
_mm_store_si128(output + 9, xout5);
|
||||||
|
_mm_store_si128(output + 10, xout6);
|
||||||
|
_mm_store_si128(output + 11, xout7);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<size_t ITERATIONS, size_t MEM, size_t MASK, bool SOFT_AES>
|
||||||
|
inline void cryptonight_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, cryptonight_ctx *__restrict__ ctx)
|
||||||
|
{
|
||||||
|
keccak(static_cast<const uint8_t*>(input), (int) size, ctx->state0, 200);
|
||||||
|
|
||||||
|
cn_explode_scratchpad<MEM, SOFT_AES>((__m128i*) ctx->state0, (__m128i*) ctx->memory);
|
||||||
|
|
||||||
|
const uint8_t* l0 = ctx->memory;
|
||||||
|
uint64_t* h0 = reinterpret_cast<uint64_t*>(ctx->state0);
|
||||||
|
|
||||||
|
uint64_t al0 = h0[0] ^ h0[4];
|
||||||
|
uint64_t ah0 = h0[1] ^ h0[5];
|
||||||
|
__m128i bx0 = _mm_set_epi64x(h0[3] ^ h0[7], h0[2] ^ h0[6]);
|
||||||
|
|
||||||
|
uint64_t idx0 = h0[0] ^ h0[4];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < ITERATIONS; i++) {
|
||||||
|
__m128i cx;
|
||||||
|
|
||||||
|
if (SOFT_AES) {
|
||||||
|
cx = soft_aesenc((uint32_t*)&l0[idx0 & MASK], _mm_set_epi64x(ah0, al0));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cx = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
||||||
|
# ifndef XMRIG_ARMv7
|
||||||
|
cx = vreinterpretq_m128i_u8(vaesmcq_u8(vaeseq_u8(cx, vdupq_n_u8(0)))) ^ _mm_set_epi64x(ah0, al0);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_store_si128((__m128i *) &l0[idx0 & MASK], _mm_xor_si128(bx0, cx));
|
||||||
|
idx0 = EXTRACT64(cx);
|
||||||
|
bx0 = cx;
|
||||||
|
|
||||||
|
uint64_t hi, lo, cl, ch;
|
||||||
|
cl = ((uint64_t*) &l0[idx0 & MASK])[0];
|
||||||
|
ch = ((uint64_t*) &l0[idx0 & MASK])[1];
|
||||||
|
lo = __umul128(idx0, cl, &hi);
|
||||||
|
|
||||||
|
al0 += hi;
|
||||||
|
ah0 += lo;
|
||||||
|
|
||||||
|
((uint64_t*)&l0[idx0 & MASK])[0] = al0;
|
||||||
|
((uint64_t*)&l0[idx0 & MASK])[1] = ah0;
|
||||||
|
|
||||||
|
ah0 ^= ch;
|
||||||
|
al0 ^= cl;
|
||||||
|
idx0 = al0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cn_implode_scratchpad<MEM, SOFT_AES>((__m128i*) ctx->memory, (__m128i*) ctx->state0);
|
||||||
|
|
||||||
|
keccakf(h0, 24);
|
||||||
|
extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast<char*>(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<size_t ITERATIONS, size_t MEM, size_t MASK, bool SOFT_AES>
|
||||||
|
inline void cryptonight_double_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, struct cryptonight_ctx *__restrict__ ctx)
|
||||||
|
{
|
||||||
|
keccak((const uint8_t *) input, (int) size, ctx->state0, 200);
|
||||||
|
keccak((const uint8_t *) input + size, (int) size, ctx->state1, 200);
|
||||||
|
|
||||||
|
const uint8_t* l0 = ctx->memory;
|
||||||
|
const uint8_t* l1 = ctx->memory + MEM;
|
||||||
|
uint64_t* h0 = reinterpret_cast<uint64_t*>(ctx->state0);
|
||||||
|
uint64_t* h1 = reinterpret_cast<uint64_t*>(ctx->state1);
|
||||||
|
|
||||||
|
cn_explode_scratchpad<MEM, SOFT_AES>((__m128i*) h0, (__m128i*) l0);
|
||||||
|
cn_explode_scratchpad<MEM, SOFT_AES>((__m128i*) h1, (__m128i*) l1);
|
||||||
|
|
||||||
|
uint64_t al0 = h0[0] ^ h0[4];
|
||||||
|
uint64_t al1 = h1[0] ^ h1[4];
|
||||||
|
uint64_t ah0 = h0[1] ^ h0[5];
|
||||||
|
uint64_t ah1 = h1[1] ^ h1[5];
|
||||||
|
|
||||||
|
__m128i bx0 = _mm_set_epi64x(h0[3] ^ h0[7], h0[2] ^ h0[6]);
|
||||||
|
__m128i bx1 = _mm_set_epi64x(h1[3] ^ h1[7], h1[2] ^ h1[6]);
|
||||||
|
|
||||||
|
uint64_t idx0 = h0[0] ^ h0[4];
|
||||||
|
uint64_t idx1 = h1[0] ^ h1[4];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < ITERATIONS; i++) {
|
||||||
|
__m128i cx0, cx1;
|
||||||
|
|
||||||
|
if (SOFT_AES) {
|
||||||
|
cx0 = soft_aesenc((uint32_t*)&l0[idx0 & MASK], _mm_set_epi64x(ah0, al0));
|
||||||
|
cx1 = soft_aesenc((uint32_t*)&l1[idx1 & MASK], _mm_set_epi64x(ah1, al1));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cx0 = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
||||||
|
cx1 = _mm_load_si128((__m128i *) &l1[idx1 & MASK]);
|
||||||
|
# ifndef XMRIG_ARMv7
|
||||||
|
cx0 = vreinterpretq_m128i_u8(vaesmcq_u8(vaeseq_u8(cx0, vdupq_n_u8(0)))) ^ _mm_set_epi64x(ah0, al0);
|
||||||
|
cx1 = vreinterpretq_m128i_u8(vaesmcq_u8(vaeseq_u8(cx1, vdupq_n_u8(0)))) ^ _mm_set_epi64x(ah1, al1);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_store_si128((__m128i *) &l0[idx0 & MASK], _mm_xor_si128(bx0, cx0));
|
||||||
|
_mm_store_si128((__m128i *) &l1[idx1 & MASK], _mm_xor_si128(bx1, cx1));
|
||||||
|
|
||||||
|
idx0 = EXTRACT64(cx0);
|
||||||
|
idx1 = EXTRACT64(cx1);
|
||||||
|
|
||||||
|
bx0 = cx0;
|
||||||
|
bx1 = cx1;
|
||||||
|
|
||||||
|
uint64_t hi, lo, cl, ch;
|
||||||
|
cl = ((uint64_t*) &l0[idx0 & MASK])[0];
|
||||||
|
ch = ((uint64_t*) &l0[idx0 & MASK])[1];
|
||||||
|
lo = __umul128(idx0, cl, &hi);
|
||||||
|
|
||||||
|
al0 += hi;
|
||||||
|
ah0 += lo;
|
||||||
|
|
||||||
|
((uint64_t*) &l0[idx0 & MASK])[0] = al0;
|
||||||
|
((uint64_t*) &l0[idx0 & MASK])[1] = ah0;
|
||||||
|
|
||||||
|
ah0 ^= ch;
|
||||||
|
al0 ^= cl;
|
||||||
|
idx0 = al0;
|
||||||
|
|
||||||
|
cl = ((uint64_t*) &l1[idx1 & MASK])[0];
|
||||||
|
ch = ((uint64_t*) &l1[idx1 & MASK])[1];
|
||||||
|
lo = __umul128(idx1, cl, &hi);
|
||||||
|
|
||||||
|
al1 += hi;
|
||||||
|
ah1 += lo;
|
||||||
|
|
||||||
|
((uint64_t*) &l1[idx1 & MASK])[0] = al1;
|
||||||
|
((uint64_t*) &l1[idx1 & MASK])[1] = ah1;
|
||||||
|
|
||||||
|
ah1 ^= ch;
|
||||||
|
al1 ^= cl;
|
||||||
|
idx1 = al1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cn_implode_scratchpad<MEM, SOFT_AES>((__m128i*) l0, (__m128i*) h0);
|
||||||
|
cn_implode_scratchpad<MEM, SOFT_AES>((__m128i*) l1, (__m128i*) h1);
|
||||||
|
|
||||||
|
keccakf(h0, 24);
|
||||||
|
keccakf(h1, 24);
|
||||||
|
|
||||||
|
extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast<char*>(output));
|
||||||
|
extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, static_cast<char*>(output) + 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __CRYPTONIGHT_ARM_H__ */
|
|
@ -21,8 +21,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CRYPTONIGHT_P_H__
|
#ifndef __CRYPTONIGHT_X86_H__
|
||||||
#define __CRYPTONIGHT_P_H__
|
#define __CRYPTONIGHT_X86_H__
|
||||||
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "crypto/CryptoNight.h"
|
#include "crypto/CryptoNight.h"
|
||||||
|
#include "crypto/soft_aes.h"
|
||||||
|
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -43,9 +44,6 @@ extern "C"
|
||||||
#include "crypto/c_blake256.h"
|
#include "crypto/c_blake256.h"
|
||||||
#include "crypto/c_jh.h"
|
#include "crypto/c_jh.h"
|
||||||
#include "crypto/c_skein.h"
|
#include "crypto/c_skein.h"
|
||||||
|
|
||||||
__m128i soft_aesenc(__m128i in, __m128i key);
|
|
||||||
__m128i soft_aeskeygenassist(__m128i key, uint8_t rcon);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -151,13 +149,14 @@ static inline void aes_genkey_sub(__m128i* xout0, __m128i* xout2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void soft_aes_genkey_sub(__m128i* xout0, __m128i* xout2, uint8_t rcon)
|
template<uint8_t rcon>
|
||||||
|
static inline void soft_aes_genkey_sub(__m128i* xout0, __m128i* xout2)
|
||||||
{
|
{
|
||||||
__m128i xout1 = soft_aeskeygenassist(*xout2, rcon);
|
__m128i xout1 = soft_aeskeygenassist<rcon>(*xout2);
|
||||||
xout1 = _mm_shuffle_epi32(xout1, 0xFF); // see PSHUFD, set all elems to 4th elem
|
xout1 = _mm_shuffle_epi32(xout1, 0xFF); // see PSHUFD, set all elems to 4th elem
|
||||||
*xout0 = sl_xor(*xout0);
|
*xout0 = sl_xor(*xout0);
|
||||||
*xout0 = _mm_xor_si128(*xout0, xout1);
|
*xout0 = _mm_xor_si128(*xout0, xout1);
|
||||||
xout1 = soft_aeskeygenassist(*xout0, 0x00);
|
xout1 = soft_aeskeygenassist<0x00>(*xout0);
|
||||||
xout1 = _mm_shuffle_epi32(xout1, 0xAA); // see PSHUFD, set all elems to 3rd elem
|
xout1 = _mm_shuffle_epi32(xout1, 0xAA); // see PSHUFD, set all elems to 3rd elem
|
||||||
*xout2 = sl_xor(*xout2);
|
*xout2 = sl_xor(*xout2);
|
||||||
*xout2 = _mm_xor_si128(*xout2, xout1);
|
*xout2 = _mm_xor_si128(*xout2, xout1);
|
||||||
|
@ -168,23 +167,23 @@ template<bool SOFT_AES>
|
||||||
static inline void aes_genkey(const __m128i* memory, __m128i* k0, __m128i* k1, __m128i* k2, __m128i* k3, __m128i* k4, __m128i* k5, __m128i* k6, __m128i* k7, __m128i* k8, __m128i* k9)
|
static inline void aes_genkey(const __m128i* memory, __m128i* k0, __m128i* k1, __m128i* k2, __m128i* k3, __m128i* k4, __m128i* k5, __m128i* k6, __m128i* k7, __m128i* k8, __m128i* k9)
|
||||||
{
|
{
|
||||||
__m128i xout0 = _mm_load_si128(memory);
|
__m128i xout0 = _mm_load_si128(memory);
|
||||||
__m128i xout2 = _mm_load_si128(memory +1 );
|
__m128i xout2 = _mm_load_si128(memory + 1);
|
||||||
*k0 = xout0;
|
*k0 = xout0;
|
||||||
*k1 = xout2;
|
*k1 = xout2;
|
||||||
|
|
||||||
SOFT_AES ? soft_aes_genkey_sub(&xout0, &xout2, 0x01) : aes_genkey_sub<0x01>(&xout0, &xout2);
|
SOFT_AES ? soft_aes_genkey_sub<0x01>(&xout0, &xout2) : aes_genkey_sub<0x01>(&xout0, &xout2);
|
||||||
*k2 = xout0;
|
*k2 = xout0;
|
||||||
*k3 = xout2;
|
*k3 = xout2;
|
||||||
|
|
||||||
SOFT_AES ? soft_aes_genkey_sub(&xout0, &xout2, 0x02) : aes_genkey_sub<0x02>(&xout0, &xout2);
|
SOFT_AES ? soft_aes_genkey_sub<0x02>(&xout0, &xout2) : aes_genkey_sub<0x02>(&xout0, &xout2);
|
||||||
*k4 = xout0;
|
*k4 = xout0;
|
||||||
*k5 = xout2;
|
*k5 = xout2;
|
||||||
|
|
||||||
SOFT_AES ? soft_aes_genkey_sub(&xout0, &xout2, 0x04) : aes_genkey_sub<0x04>(&xout0, &xout2);
|
SOFT_AES ? soft_aes_genkey_sub<0x04>(&xout0, &xout2) : aes_genkey_sub<0x04>(&xout0, &xout2);
|
||||||
*k6 = xout0;
|
*k6 = xout0;
|
||||||
*k7 = xout2;
|
*k7 = xout2;
|
||||||
|
|
||||||
SOFT_AES ? soft_aes_genkey_sub(&xout0, &xout2, 0x08) : aes_genkey_sub<0x08>(&xout0, &xout2);
|
SOFT_AES ? soft_aes_genkey_sub<0x08>(&xout0, &xout2) : aes_genkey_sub<0x08>(&xout0, &xout2);
|
||||||
*k8 = xout0;
|
*k8 = xout0;
|
||||||
*k9 = xout2;
|
*k9 = xout2;
|
||||||
}
|
}
|
||||||
|
@ -194,14 +193,14 @@ template<bool SOFT_AES>
|
||||||
static inline void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7)
|
static inline void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7)
|
||||||
{
|
{
|
||||||
if (SOFT_AES) {
|
if (SOFT_AES) {
|
||||||
*x0 = soft_aesenc(*x0, key);
|
*x0 = soft_aesenc((uint32_t*)x0, key);
|
||||||
*x1 = soft_aesenc(*x1, key);
|
*x1 = soft_aesenc((uint32_t*)x1, key);
|
||||||
*x2 = soft_aesenc(*x2, key);
|
*x2 = soft_aesenc((uint32_t*)x2, key);
|
||||||
*x3 = soft_aesenc(*x3, key);
|
*x3 = soft_aesenc((uint32_t*)x3, key);
|
||||||
*x4 = soft_aesenc(*x4, key);
|
*x4 = soft_aesenc((uint32_t*)x4, key);
|
||||||
*x5 = soft_aesenc(*x5, key);
|
*x5 = soft_aesenc((uint32_t*)x5, key);
|
||||||
*x6 = soft_aesenc(*x6, key);
|
*x6 = soft_aesenc((uint32_t*)x6, key);
|
||||||
*x7 = soft_aesenc(*x7, key);
|
*x7 = soft_aesenc((uint32_t*)x7, key);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*x0 = _mm_aesenc_si128(*x0, key);
|
*x0 = _mm_aesenc_si128(*x0, key);
|
||||||
|
@ -326,15 +325,14 @@ inline void cryptonight_hash(const void *__restrict__ input, size_t size, void *
|
||||||
|
|
||||||
for (size_t i = 0; i < ITERATIONS; i++) {
|
for (size_t i = 0; i < ITERATIONS; i++) {
|
||||||
__m128i cx;
|
__m128i cx;
|
||||||
cx = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
|
||||||
|
|
||||||
if (SOFT_AES) {
|
if (SOFT_AES) {
|
||||||
cx = soft_aesenc(cx, _mm_set_epi64x(ah0, al0));
|
cx = soft_aesenc((uint32_t*)&l0[idx0 & MASK], _mm_set_epi64x(ah0, al0));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
cx = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
||||||
cx = _mm_aesenc_si128(cx, _mm_set_epi64x(ah0, al0));
|
cx = _mm_aesenc_si128(cx, _mm_set_epi64x(ah0, al0));
|
||||||
}
|
}
|
||||||
|
|
||||||
_mm_store_si128((__m128i *) &l0[idx0 & MASK], _mm_xor_si128(bx0, cx));
|
_mm_store_si128((__m128i *) &l0[idx0 & MASK], _mm_xor_si128(bx0, cx));
|
||||||
idx0 = EXTRACT64(cx);
|
idx0 = EXTRACT64(cx);
|
||||||
bx0 = cx;
|
bx0 = cx;
|
||||||
|
@ -388,14 +386,15 @@ inline void cryptonight_double_hash(const void *__restrict__ input, size_t size,
|
||||||
uint64_t idx1 = h1[0] ^ h1[4];
|
uint64_t idx1 = h1[0] ^ h1[4];
|
||||||
|
|
||||||
for (size_t i = 0; i < ITERATIONS; i++) {
|
for (size_t i = 0; i < ITERATIONS; i++) {
|
||||||
__m128i cx0 = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
__m128i cx0, cx1;
|
||||||
__m128i cx1 = _mm_load_si128((__m128i *) &l1[idx1 & MASK]);
|
|
||||||
|
|
||||||
if (SOFT_AES) {
|
if (SOFT_AES) {
|
||||||
cx0 = soft_aesenc(cx0, _mm_set_epi64x(ah0, al0));
|
cx0 = soft_aesenc((uint32_t*)&l0[idx0 & MASK], _mm_set_epi64x(ah0, al0));
|
||||||
cx1 = soft_aesenc(cx1, _mm_set_epi64x(ah1, al1));
|
cx1 = soft_aesenc((uint32_t*)&l1[idx1 & MASK], _mm_set_epi64x(ah1, al1));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
cx0 = _mm_load_si128((__m128i *) &l0[idx0 & MASK]);
|
||||||
|
cx1 = _mm_load_si128((__m128i *) &l1[idx1 & MASK]);
|
||||||
cx0 = _mm_aesenc_si128(cx0, _mm_set_epi64x(ah0, al0));
|
cx0 = _mm_aesenc_si128(cx0, _mm_set_epi64x(ah0, al0));
|
||||||
cx1 = _mm_aesenc_si128(cx1, _mm_set_epi64x(ah1, al1));
|
cx1 = _mm_aesenc_si128(cx1, _mm_set_epi64x(ah1, al1));
|
||||||
}
|
}
|
||||||
|
@ -449,4 +448,4 @@ inline void cryptonight_double_hash(const void *__restrict__ input, size_t size,
|
||||||
extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, static_cast<char*>(output) + 32);
|
extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, static_cast<char*>(output) + 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __CRYPTONIGHT_P_H__ */
|
#endif /* __CRYPTONIGHT_X86_H__ */
|
1497
src/crypto/SSE2NEON.h
Normal file
1497
src/crypto/SSE2NEON.h
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,212 +0,0 @@
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Additional permission under GNU GPL version 3 section 7
|
|
||||||
*
|
|
||||||
* If you modify this Program, or any covered work, by linking or combining
|
|
||||||
* it with OpenSSL (or a modified version of that library), containing parts
|
|
||||||
* covered by the terms of OpenSSL License and SSLeay License, the licensors
|
|
||||||
* of this Program grant you additional permission to convey the resulting work.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The orginal author of this AES implementation is Karl Malbrain.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#include <x86intrin.h>
|
|
||||||
#else
|
|
||||||
#include <intrin.h>
|
|
||||||
#endif // __GNUC__
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#define TABLE_ALIGN 32
|
|
||||||
#define WPOLY 0x011b
|
|
||||||
#define N_COLS 4
|
|
||||||
#define AES_BLOCK_SIZE 16
|
|
||||||
#define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define ALIGN __declspec(align(TABLE_ALIGN))
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
#define ALIGN __attribute__ ((aligned(16)))
|
|
||||||
#else
|
|
||||||
#define ALIGN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define rf1(r,c) (r)
|
|
||||||
#define word_in(x,c) (*((uint32_t*)(x)+(c)))
|
|
||||||
#define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = (v))
|
|
||||||
|
|
||||||
#define s(x,c) x[c]
|
|
||||||
#define si(y,x,c) (s(y,c) = word_in(x, c))
|
|
||||||
#define so(y,x,c) word_out(y, c, s(x,c))
|
|
||||||
#define state_in(y,x) si(y,x,0); si(y,x,1); si(y,x,2); si(y,x,3)
|
|
||||||
#define state_out(y,x) so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)
|
|
||||||
#define round(y,x,k) \
|
|
||||||
y[0] = (k)[0] ^ (t_fn[0][x[0] & 0xff] ^ t_fn[1][(x[1] >> 8) & 0xff] ^ t_fn[2][(x[2] >> 16) & 0xff] ^ t_fn[3][x[3] >> 24]); \
|
|
||||||
y[1] = (k)[1] ^ (t_fn[0][x[1] & 0xff] ^ t_fn[1][(x[2] >> 8) & 0xff] ^ t_fn[2][(x[3] >> 16) & 0xff] ^ t_fn[3][x[0] >> 24]); \
|
|
||||||
y[2] = (k)[2] ^ (t_fn[0][x[2] & 0xff] ^ t_fn[1][(x[3] >> 8) & 0xff] ^ t_fn[2][(x[0] >> 16) & 0xff] ^ t_fn[3][x[1] >> 24]); \
|
|
||||||
y[3] = (k)[3] ^ (t_fn[0][x[3] & 0xff] ^ t_fn[1][(x[0] >> 8) & 0xff] ^ t_fn[2][(x[1] >> 16) & 0xff] ^ t_fn[3][x[2] >> 24]);
|
|
||||||
#define to_byte(x) ((x) & 0xff)
|
|
||||||
#define bval(x,n) to_byte((x) >> (8 * (n)))
|
|
||||||
|
|
||||||
#define fwd_var(x,r,c)\
|
|
||||||
( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
|
|
||||||
: r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\
|
|
||||||
: r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
|
|
||||||
: ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2)))
|
|
||||||
|
|
||||||
#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))
|
|
||||||
|
|
||||||
#define sb_data(w) {\
|
|
||||||
w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
|
|
||||||
w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
|
|
||||||
w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
|
|
||||||
w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
|
|
||||||
w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
|
|
||||||
w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
|
|
||||||
w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
|
|
||||||
w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
|
|
||||||
w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
|
|
||||||
w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
|
|
||||||
w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
|
|
||||||
w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
|
|
||||||
w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
|
|
||||||
w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
|
|
||||||
w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
|
|
||||||
w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
|
|
||||||
w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
|
|
||||||
w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
|
|
||||||
w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
|
|
||||||
w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
|
|
||||||
w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
|
|
||||||
w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
|
|
||||||
w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
|
|
||||||
w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
|
|
||||||
w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
|
|
||||||
w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
|
|
||||||
w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
|
|
||||||
w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
|
|
||||||
w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
|
|
||||||
w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
|
|
||||||
w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
|
|
||||||
w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
|
|
||||||
|
|
||||||
#define rc_data(w) {\
|
|
||||||
w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
|
|
||||||
w(0x1b), w(0x36) }
|
|
||||||
|
|
||||||
#define bytes2word(b0, b1, b2, b3) (((uint32_t)(b3) << 24) | \
|
|
||||||
((uint32_t)(b2) << 16) | ((uint32_t)(b1) << 8) | (b0))
|
|
||||||
|
|
||||||
#define h0(x) (x)
|
|
||||||
#define w0(p) bytes2word(p, 0, 0, 0)
|
|
||||||
#define w1(p) bytes2word(0, p, 0, 0)
|
|
||||||
#define w2(p) bytes2word(0, 0, p, 0)
|
|
||||||
#define w3(p) bytes2word(0, 0, 0, p)
|
|
||||||
|
|
||||||
#define u0(p) bytes2word(f2(p), p, p, f3(p))
|
|
||||||
#define u1(p) bytes2word(f3(p), f2(p), p, p)
|
|
||||||
#define u2(p) bytes2word(p, f3(p), f2(p), p)
|
|
||||||
#define u3(p) bytes2word(p, p, f3(p), f2(p))
|
|
||||||
|
|
||||||
#define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
|
|
||||||
#define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
|
|
||||||
#define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
|
|
||||||
#define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
|
|
||||||
|
|
||||||
#define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
|
|
||||||
#define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
|
|
||||||
#define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) ^ (((x>>5) & 4) * WPOLY))
|
|
||||||
#define f3(x) (f2(x) ^ x)
|
|
||||||
#define f9(x) (f8(x) ^ x)
|
|
||||||
#define fb(x) (f8(x) ^ f2(x) ^ x)
|
|
||||||
#define fd(x) (f8(x) ^ f4(x) ^ x)
|
|
||||||
#define fe(x) (f8(x) ^ f4(x) ^ f2(x))
|
|
||||||
|
|
||||||
#define t_dec(m,n) t_##m##n
|
|
||||||
#define t_set(m,n) t_##m##n
|
|
||||||
#define t_use(m,n) t_##m##n
|
|
||||||
|
|
||||||
#define d_4(t,n,b,e,f,g,h) ALIGN const t n[4][256] = { b(e), b(f), b(g), b(h) }
|
|
||||||
|
|
||||||
#define four_tables(x,tab,vf,rf,c) \
|
|
||||||
(tab[0][bval(vf(x,0,c),rf(0,c))] \
|
|
||||||
^ tab[1][bval(vf(x,1,c),rf(1,c))] \
|
|
||||||
^ tab[2][bval(vf(x,2,c),rf(2,c))] \
|
|
||||||
^ tab[3][bval(vf(x,3,c),rf(3,c))])
|
|
||||||
|
|
||||||
d_4(uint32_t, t_dec(f,n), sb_data, u0, u1, u2, u3);
|
|
||||||
|
|
||||||
__m128i soft_aesenc(__m128i in, __m128i key)
|
|
||||||
{
|
|
||||||
uint32_t x0, x1, x2, x3;
|
|
||||||
x0 = _mm_cvtsi128_si32(in);
|
|
||||||
x1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(in, 0x55));
|
|
||||||
x2 = _mm_cvtsi128_si32(_mm_shuffle_epi32(in, 0xAA));
|
|
||||||
x3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(in, 0xFF));
|
|
||||||
|
|
||||||
__m128i out = _mm_set_epi32(
|
|
||||||
(t_fn[0][x3 & 0xff] ^ t_fn[1][(x0 >> 8) & 0xff] ^ t_fn[2][(x1 >> 16) & 0xff] ^ t_fn[3][x2 >> 24]),
|
|
||||||
(t_fn[0][x2 & 0xff] ^ t_fn[1][(x3 >> 8) & 0xff] ^ t_fn[2][(x0 >> 16) & 0xff] ^ t_fn[3][x1 >> 24]),
|
|
||||||
(t_fn[0][x1 & 0xff] ^ t_fn[1][(x2 >> 8) & 0xff] ^ t_fn[2][(x3 >> 16) & 0xff] ^ t_fn[3][x0 >> 24]),
|
|
||||||
(t_fn[0][x0 & 0xff] ^ t_fn[1][(x1 >> 8) & 0xff] ^ t_fn[2][(x2 >> 16) & 0xff] ^ t_fn[3][x3 >> 24]));
|
|
||||||
|
|
||||||
return _mm_xor_si128(out, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t Sbox[256] = { // forward s-box
|
|
||||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
|
||||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
|
||||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
|
||||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
|
||||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
|
||||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
|
||||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
|
||||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
|
||||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
|
||||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
|
||||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
|
||||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
|
||||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
|
||||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
|
||||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
|
||||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};
|
|
||||||
|
|
||||||
static inline void sub_word(uint8_t* key)
|
|
||||||
{
|
|
||||||
key[0] = Sbox[key[0]];
|
|
||||||
key[1] = Sbox[key[1]];
|
|
||||||
key[2] = Sbox[key[2]];
|
|
||||||
key[3] = Sbox[key[3]];
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
uint32_t _rotr(uint32_t value, uint32_t amount)
|
|
||||||
{
|
|
||||||
return (value >> amount) | (value << ((32 - amount) & 31));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__m128i soft_aeskeygenassist(__m128i key, uint8_t rcon)
|
|
||||||
{
|
|
||||||
uint32_t X1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(key, 0x55));
|
|
||||||
uint32_t X3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(key, 0xFF));
|
|
||||||
sub_word((uint8_t*)&X1);
|
|
||||||
sub_word((uint8_t*)&X3);
|
|
||||||
return _mm_set_epi32(_rotr(X3, 8) ^ rcon, X3,_rotr(X1, 8) ^ rcon, X1);
|
|
||||||
}
|
|
129
src/crypto/soft_aes.h
Normal file
129
src/crypto/soft_aes.h
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional permission under GNU GPL version 3 section 7
|
||||||
|
*
|
||||||
|
* If you modify this Program, or any covered work, by linking or combining
|
||||||
|
* it with OpenSSL (or a modified version of that library), containing parts
|
||||||
|
* covered by the terms of OpenSSL License and SSLeay License, the licensors
|
||||||
|
* of this Program grant you additional permission to convey the resulting work.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parts of this file are originally copyright (c) 2014-2017, The Monero Project
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XMRIG_ARM)
|
||||||
|
# include "crypto/SSE2NEON.h"
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define saes_data(w) {\
|
||||||
|
w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
|
||||||
|
w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
|
||||||
|
w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
|
||||||
|
w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
|
||||||
|
w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
|
||||||
|
w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
|
||||||
|
w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
|
||||||
|
w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
|
||||||
|
w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
|
||||||
|
w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
|
||||||
|
w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
|
||||||
|
w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
|
||||||
|
w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
|
||||||
|
w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
|
||||||
|
w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
|
||||||
|
w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
|
||||||
|
w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
|
||||||
|
w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
|
||||||
|
w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
|
||||||
|
w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
|
||||||
|
w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
|
||||||
|
w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
|
||||||
|
w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
|
||||||
|
w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
|
||||||
|
w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
|
||||||
|
w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
|
||||||
|
w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
|
||||||
|
w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
|
||||||
|
w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
|
||||||
|
w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
|
||||||
|
w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
|
||||||
|
w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
|
||||||
|
|
||||||
|
#define SAES_WPOLY 0x011b
|
||||||
|
|
||||||
|
#define saes_b2w(b0, b1, b2, b3) (((uint32_t)(b3) << 24) | \
|
||||||
|
((uint32_t)(b2) << 16) | ((uint32_t)(b1) << 8) | (b0))
|
||||||
|
|
||||||
|
#define saes_f2(x) ((x<<1) ^ (((x>>7) & 1) * SAES_WPOLY))
|
||||||
|
#define saes_f3(x) (saes_f2(x) ^ x)
|
||||||
|
#define saes_h0(x) (x)
|
||||||
|
|
||||||
|
#define saes_u0(p) saes_b2w(saes_f2(p), p, p, saes_f3(p))
|
||||||
|
#define saes_u1(p) saes_b2w(saes_f3(p), saes_f2(p), p, p)
|
||||||
|
#define saes_u2(p) saes_b2w( p, saes_f3(p), saes_f2(p), p)
|
||||||
|
#define saes_u3(p) saes_b2w( p, p, saes_f3(p), saes_f2(p))
|
||||||
|
|
||||||
|
alignas(16) const uint32_t saes_table[4][256] = { saes_data(saes_u0), saes_data(saes_u1), saes_data(saes_u2), saes_data(saes_u3) };
|
||||||
|
alignas(16) const uint8_t saes_sbox[256] = saes_data(saes_h0);
|
||||||
|
|
||||||
|
static inline __m128i soft_aesenc(const uint32_t* in, __m128i key)
|
||||||
|
{
|
||||||
|
const uint32_t x0 = in[0];
|
||||||
|
const uint32_t x1 = in[1];
|
||||||
|
const uint32_t x2 = in[2];
|
||||||
|
const uint32_t x3 = in[3];
|
||||||
|
|
||||||
|
__m128i out = _mm_set_epi32(
|
||||||
|
(saes_table[0][x3 & 0xff] ^ saes_table[1][(x0 >> 8) & 0xff] ^ saes_table[2][(x1 >> 16) & 0xff] ^ saes_table[3][x2 >> 24]),
|
||||||
|
(saes_table[0][x2 & 0xff] ^ saes_table[1][(x3 >> 8) & 0xff] ^ saes_table[2][(x0 >> 16) & 0xff] ^ saes_table[3][x1 >> 24]),
|
||||||
|
(saes_table[0][x1 & 0xff] ^ saes_table[1][(x2 >> 8) & 0xff] ^ saes_table[2][(x3 >> 16) & 0xff] ^ saes_table[3][x0 >> 24]),
|
||||||
|
(saes_table[0][x0 & 0xff] ^ saes_table[1][(x1 >> 8) & 0xff] ^ saes_table[2][(x2 >> 16) & 0xff] ^ saes_table[3][x3 >> 24]));
|
||||||
|
|
||||||
|
return _mm_xor_si128(out, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t sub_word(uint32_t key)
|
||||||
|
{
|
||||||
|
return (saes_sbox[key >> 24 ] << 24) |
|
||||||
|
(saes_sbox[(key >> 16) & 0xff] << 16 ) |
|
||||||
|
(saes_sbox[(key >> 8) & 0xff] << 8 ) |
|
||||||
|
saes_sbox[key & 0xff];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__clang__) || defined(XMRIG_ARM)
|
||||||
|
static inline uint32_t _rotr(uint32_t value, uint32_t amount)
|
||||||
|
{
|
||||||
|
return (value >> amount) | (value << ((32 - amount) & 31));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<uint8_t rcon>
|
||||||
|
static inline __m128i soft_aeskeygenassist(__m128i key)
|
||||||
|
{
|
||||||
|
const uint32_t X1 = sub_word(_mm_cvtsi128_si32(_mm_shuffle_epi32(key, 0x55)));
|
||||||
|
const uint32_t X3 = sub_word(_mm_cvtsi128_si32(_mm_shuffle_epi32(key, 0xFF)));
|
||||||
|
return _mm_set_epi32(_rotr(X3, 8) ^ rcon, X3, _rotr(X1, 8) ^ rcon, X1);
|
||||||
|
}
|
|
@ -36,6 +36,7 @@
|
||||||
|
|
||||||
#include "log/ConsoleLog.h"
|
#include "log/ConsoleLog.h"
|
||||||
#include "log/Log.h"
|
#include "log/Log.h"
|
||||||
|
#include "Options.h"
|
||||||
|
|
||||||
|
|
||||||
ConsoleLog::ConsoleLog(bool colors) :
|
ConsoleLog::ConsoleLog(bool colors) :
|
||||||
|
@ -43,6 +44,8 @@ ConsoleLog::ConsoleLog(bool colors) :
|
||||||
m_stream(nullptr)
|
m_stream(nullptr)
|
||||||
{
|
{
|
||||||
if (uv_tty_init(uv_default_loop(), &m_tty, 1, 0) < 0) {
|
if (uv_tty_init(uv_default_loop(), &m_tty, 1, 0) < 0) {
|
||||||
|
Options::i()->setColors(false);
|
||||||
|
m_colors = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,10 +68,6 @@ ConsoleLog::ConsoleLog(bool colors) :
|
||||||
|
|
||||||
void ConsoleLog::message(int level, const char* fmt, va_list args)
|
void ConsoleLog::message(int level, const char* fmt, va_list args)
|
||||||
{
|
{
|
||||||
if (!isWritable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
tm stime;
|
tm stime;
|
||||||
|
|
||||||
|
@ -121,10 +120,6 @@ void ConsoleLog::message(int level, const char* fmt, va_list args)
|
||||||
|
|
||||||
void ConsoleLog::text(const char* fmt, va_list args)
|
void ConsoleLog::text(const char* fmt, va_list args)
|
||||||
{
|
{
|
||||||
if (!isWritable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(m_fmt, sizeof(m_fmt) - 1, "%s%s\n", fmt, m_colors ? Log::kCL_N : "");
|
snprintf(m_fmt, sizeof(m_fmt) - 1, "%s%s\n", fmt, m_colors ? Log::kCL_N : "");
|
||||||
|
|
||||||
print(args);
|
print(args);
|
||||||
|
@ -149,5 +144,11 @@ void ConsoleLog::print(va_list args)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isWritable()) {
|
||||||
|
fputs(m_buf, stdout);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
else {
|
||||||
uv_try_write(m_stream, &m_uvBuf, 1);
|
uv_try_write(m_stream, &m_uvBuf, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,11 @@ bool Client::parseJob(const rapidjson::Value ¶ms, int *code)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_job == job) {
|
if (m_job == job) {
|
||||||
LOG_WARN("[%s:%u] duplicate job received, ignore", m_url.host(), m_url.port());
|
if (!m_quiet) {
|
||||||
|
LOG_WARN("[%s:%u] duplicate job received, reconnect", m_url.host(), m_url.port());
|
||||||
|
}
|
||||||
|
|
||||||
|
close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +532,7 @@ void Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t
|
||||||
auto client = getClient(handle->data);
|
auto client = getClient(handle->data);
|
||||||
|
|
||||||
buf->base = &client->m_recvBuf.base[client->m_recvBufPos];
|
buf->base = &client->m_recvBuf.base[client->m_recvBufPos];
|
||||||
buf->len = client->m_recvBuf.len - client->m_recvBufPos;
|
buf->len = client->m_recvBuf.len - (unsigned long)client->m_recvBufPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -578,11 +582,11 @@ void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
|
||||||
LOG_ERR("[%s:%u] read error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror((int) nread));
|
LOG_ERR("[%s:%u] read error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror((int) nread));
|
||||||
}
|
}
|
||||||
|
|
||||||
return client->close();;
|
return client->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t) nread > (sizeof(m_buf) - 8 - client->m_recvBufPos)) {
|
if ((size_t) nread > (sizeof(m_buf) - 8 - client->m_recvBufPos)) {
|
||||||
return client->close();;
|
return client->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
client->m_recvBufPos += nread;
|
client->m_recvBufPos += nread;
|
||||||
|
@ -619,7 +623,7 @@ void Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res)
|
||||||
auto client = getClient(req->data);
|
auto client = getClient(req->data);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
LOG_ERR("[%s:%u] DNS error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status));
|
LOG_ERR("[%s:%u] DNS error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status));
|
||||||
return client->reconnect();;
|
return client->reconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
addrinfo *ptr = res;
|
addrinfo *ptr = res;
|
||||||
|
|
|
@ -171,5 +171,5 @@ void Job::toHex(const unsigned char* in, unsigned int len, char* out)
|
||||||
|
|
||||||
bool Job::operator==(const Job &other) const
|
bool Job::operator==(const Job &other) const
|
||||||
{
|
{
|
||||||
return m_id == other.m_id && memcmp(m_blob, other.m_blob, sizeof(m_blob) == 0);
|
return m_id == other.m_id && memcmp(m_blob, other.m_blob, sizeof(m_blob)) == 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,8 @@ public:
|
||||||
bool operator==(const Job &other) const;
|
bool operator==(const Job &other) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
VAR_ALIGN(16, uint8_t m_blob[84]); // Max blob size is 84 (75 fixed + 9 variable), aligned to 96. https://github.com/xmrig/xmrig/issues/1 Thanks fireice-uk.
|
||||||
|
|
||||||
bool m_nicehash;
|
bool m_nicehash;
|
||||||
int m_poolId;
|
int m_poolId;
|
||||||
int m_threadId;
|
int m_threadId;
|
||||||
|
@ -77,7 +79,6 @@ private:
|
||||||
size_t m_size;
|
size_t m_size;
|
||||||
uint64_t m_diff;
|
uint64_t m_diff;
|
||||||
uint64_t m_target;
|
uint64_t m_target;
|
||||||
VAR_ALIGN(16, uint8_t m_blob[84]); // Max blob size is 84 (75 fixed + 9 variable), aligned to 96. https://github.com/xmrig/xmrig/issues/1 Thanks fireice-uk.
|
|
||||||
|
|
||||||
# ifdef XMRIG_PROXY_PROJECT
|
# ifdef XMRIG_PROXY_PROJECT
|
||||||
VAR_ALIGN(16, char m_rawBlob[169]);
|
VAR_ALIGN(16, char m_rawBlob[169]);
|
||||||
|
|
|
@ -63,7 +63,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t size = strlen(id);
|
const size_t size = strlen(id);
|
||||||
if (size < 4 || size >= sizeof(m_data)) {
|
if (size >= sizeof(m_data)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2016-2017 XMRig <support@xmrig.com>
|
* Copyright 2016-2018 XMRig <support@xmrig.com>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -27,19 +27,19 @@
|
||||||
#define APP_ID "xmrig"
|
#define APP_ID "xmrig"
|
||||||
#define APP_NAME "XMRig"
|
#define APP_NAME "XMRig"
|
||||||
#define APP_DESC "XMRig CPU miner"
|
#define APP_DESC "XMRig CPU miner"
|
||||||
#define APP_VERSION "2.4.0-dev"
|
#define APP_VERSION "2.4.5"
|
||||||
#define APP_DOMAIN "xmrig.com"
|
#define APP_DOMAIN "xmrig.com"
|
||||||
#define APP_SITE "www.xmrig.com"
|
#define APP_SITE "www.xmrig.com"
|
||||||
#define APP_COPYRIGHT "Copyright (C) 2016-2017 xmrig.com"
|
#define APP_COPYRIGHT "Copyright (C) 2016-2018 xmrig.com"
|
||||||
#define APP_KIND "cpu"
|
#define APP_KIND "cpu"
|
||||||
|
|
||||||
#define APP_VER_MAJOR 2
|
#define APP_VER_MAJOR 2
|
||||||
#define APP_VER_MINOR 4
|
#define APP_VER_MINOR 4
|
||||||
#define APP_VER_BUILD 0
|
#define APP_VER_BUILD 5
|
||||||
#define APP_VER_REV 0
|
#define APP_VER_REV 0
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# if (_MSC_VER == 1910 || _MSC_VER == 1911)
|
# if (_MSC_VER >= 1910)
|
||||||
# define MSVC_VERSION 2017
|
# define MSVC_VERSION 2017
|
||||||
# elif _MSC_VER == 1900
|
# elif _MSC_VER == 1900
|
||||||
# define MSVC_VERSION 2015
|
# define MSVC_VERSION 2015
|
||||||
|
|
|
@ -23,8 +23,9 @@
|
||||||
|
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <math.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "log/Log.h"
|
#include "log/Log.h"
|
||||||
#include "Options.h"
|
#include "Options.h"
|
||||||
|
@ -33,7 +34,7 @@
|
||||||
|
|
||||||
inline const char *format(double h, char* buf, size_t size)
|
inline const char *format(double h, char* buf, size_t size)
|
||||||
{
|
{
|
||||||
if (std::isnormal(h)) {
|
if (isnormal(h)) {
|
||||||
snprintf(buf, size, "%03.1f", h);
|
snprintf(buf, size, "%03.1f", h);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +78,7 @@ double Hashrate::calc(size_t ms) const
|
||||||
|
|
||||||
for (int i = 0; i < m_threads; ++i) {
|
for (int i = 0; i < m_threads; ++i) {
|
||||||
data = calc(i, ms);
|
data = calc(i, ms);
|
||||||
if (std::isnormal(data)) {
|
if (isnormal(data)) {
|
||||||
result += data;
|
result += data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,7 +171,7 @@ void Hashrate::stop()
|
||||||
void Hashrate::updateHighest()
|
void Hashrate::updateHighest()
|
||||||
{
|
{
|
||||||
double highest = calc(ShortInterval);
|
double highest = calc(ShortInterval);
|
||||||
if (std::isnormal(highest) && highest > m_highest) {
|
if (isnormal(highest) && highest > m_highest) {
|
||||||
m_highest = highest;
|
m_highest = highest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue