diff --git a/src/3rdparty/argon2/CMakeLists.txt b/src/3rdparty/argon2/CMakeLists.txt index 80b0056d..02c43f1f 100644 --- a/src/3rdparty/argon2/CMakeLists.txt +++ b/src/3rdparty/argon2/CMakeLists.txt @@ -40,7 +40,23 @@ set_property(TARGET argon2 APPEND PROPERTY ) if (CMAKE_C_COMPILER_ID MATCHES MSVC) + function(add_feature_impl FEATURE MSVC_FLAG DEF) + add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c) + target_link_libraries(argon2-${FEATURE} PRIVATE argon2-internal) + set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True) + target_compile_options(argon2-${FEATURE} PRIVATE ${MSVC_FLAG}) + target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF}) + target_link_libraries(argon2 PUBLIC argon2-${FEATURE}) + endfunction() + + add_feature_impl(sse2 "" HAVE_SSE2) + add_feature_impl(ssse3 ""/arch:SSSE3"" HAVE_SSSE3) + add_feature_impl(xop "" HAVE_XOP) + add_feature_impl(avx2 "/arch:AVX2" HAVE_AVX2) + add_feature_impl(avx512f "/arch:AVX512F" HAVE_AVX512F) + + target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c) elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8) function(add_feature_impl FEATURE GCC_FLAG DEF) add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c) @@ -81,12 +97,7 @@ elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8) add_feature_impl(avx2 -mavx2 HAVE_AVX2) add_feature_impl(avx512f -mavx512f HAVE_AVX512F) - target_sources(argon2 PRIVATE - arch/x86_64/lib/argon2-arch.c - arch/x86_64/lib/cpu-flags.c - ) + target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c) else() - target_sources(argon2 PRIVATE - arch/generic/lib/argon2-arch.c - ) + target_sources(argon2 PRIVATE arch/generic/lib/argon2-arch.c) endif() diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx2.c b/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx2.c index 01cb9078..09ef421a 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx2.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx2.c @@ -3,7 +3,11 @@ #ifdef HAVE_AVX2 #include -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "cpu-flags.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx512f.c b/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx512f.c index 0d329ea2..79fd2dda 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx512f.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-avx512f.c @@ -4,7 +4,11 @@ #include #include -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "cpu-flags.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-sse2.c b/src/3rdparty/argon2/arch/x86_64/lib/argon2-sse2.c index 91588419..5eccdf07 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-sse2.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-sse2.c @@ -1,7 +1,11 @@ #include "argon2-sse2.h" #ifdef HAVE_SSE2 -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "cpu-flags.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-ssse3.c b/src/3rdparty/argon2/arch/x86_64/lib/argon2-ssse3.c index dead71f2..86e9b3c9 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-ssse3.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-ssse3.c @@ -3,7 +3,11 @@ #ifdef HAVE_SSSE3 #include -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "cpu-flags.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-template-128.h b/src/3rdparty/argon2/arch/x86_64/lib/argon2-template-128.h index 4eeec2e0..4fb04c1f 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-template-128.h +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-template-128.h @@ -1,6 +1,10 @@ #include -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "core.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c b/src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c index 87178bdb..0e877bce 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c @@ -3,7 +3,11 @@ #ifdef HAVE_XOP #include -#include +#ifdef __GNUC__ +# include +#else +# include +#endif #include "cpu-flags.h" diff --git a/src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c b/src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c index ec8b7c44..cd13cb01 100644 --- a/src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c +++ b/src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c @@ -1,6 +1,49 @@ +#include +#include + + #include "cpu-flags.h" -#include +#include + +#ifdef _MSC_VER +# include +#else +# include +#endif + +#ifndef bit_OSXSAVE +# define bit_OSXSAVE (1 << 27) +#endif + +#ifndef bit_SSE2 +# define bit_SSE2 (1 << 26) +#endif + +#ifndef bit_SSSE3 +# define bit_SSSE3 (1 << 9) +#endif + +#ifndef bit_AVX2 +# define bit_AVX2 (1 << 5) +#endif + +#ifndef bit_AVX512F +# define bit_AVX512F (1 << 16) +#endif + +#ifndef bit_XOP +# define bit_XOP (1 << 11) +#endif + +#define PROCESSOR_INFO (1) +#define EXTENDED_FEATURES (7) + +#define EAX_Reg (0) +#define EBX_Reg (1) +#define ECX_Reg (2) +#define EDX_Reg (3) + enum { X86_64_FEATURE_SSE2 = (1 << 0), @@ -12,56 +55,51 @@ enum { static unsigned int cpu_flags; -static unsigned int get_cpuid(int ext, unsigned int level, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx) + +static inline void cpuid(uint32_t level, int32_t output[4]) { - unsigned int eax; - __cpuid(ext ? (0x80000000 | level) : level, - eax, *ebx, *ecx, *edx); - return eax; +# ifdef _MSC_VER + __cpuid(output, (int) level); +# else + __cpuid_count(level, 0, output[0], output[1], output[2], output[3]); +# endif } -static unsigned int get_cpuid_count(int ext, unsigned int level, - unsigned int count, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx) + +static bool has_feature(uint32_t level, uint32_t reg, int32_t bit) { - unsigned int eax; - __cpuid_count(ext ? (0x80000000 | level) : level, - count, eax, *ebx, *ecx, *edx); - return 1; + int32_t cpu_info[4] = { 0 }; + cpuid(level, cpu_info); + + return (cpu_info[reg] & bit) != 0; } + void cpu_flags_get(void) { - unsigned int ebx, ecx, edx; - unsigned int level, level_ext; + if (has_feature(PROCESSOR_INFO, EDX_Reg, bit_SSE2)) { + cpu_flags |= X86_64_FEATURE_SSE2; + } - cpu_flags = 0; - level = get_cpuid(0, 0, &ebx, &ecx, &edx); - level_ext = get_cpuid(1, 0, &ebx, &ecx, &edx); + if (has_feature(PROCESSOR_INFO, ECX_Reg, bit_SSSE3)) { + cpu_flags |= X86_64_FEATURE_SSSE3; + } - if (level >= 1 && get_cpuid(0, 1, &ebx, &ecx, &edx)) { - if (edx & (1 << 26)) { - cpu_flags |= X86_64_FEATURE_SSE2; - } - if (ecx & (1 << 9)) { - cpu_flags |= X86_64_FEATURE_SSSE3; - } + if (!has_feature(PROCESSOR_INFO, ECX_Reg, bit_OSXSAVE)) { + return; } - if (level >= 7 && get_cpuid_count(0, 7, 0, &ebx, &ecx, &edx)) { - if (ebx & (1 << 5)) { - cpu_flags |= X86_64_FEATURE_AVX2; - } - if (ebx & (1 << 16)) { - cpu_flags |= X86_64_FEATURE_AVX512F; - } + + if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX2)) { + cpu_flags |= X86_64_FEATURE_AVX2; } - if (level_ext >= 1 && get_cpuid(1, 1, &ebx, &ecx, &edx)) { - if (ecx & (1 << 11)) { - cpu_flags |= X86_64_FEATURE_XOP; - } + + if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX512F)) { + cpu_flags |= X86_64_FEATURE_AVX512F; + } + + if (has_feature(0x80000001, ECX_Reg, bit_XOP)) { + cpu_flags |= X86_64_FEATURE_XOP; } - /* FIXME: check also OS support! */ } int cpu_flags_have_sse2(void) diff --git a/src/3rdparty/argon2/include/argon2.h b/src/3rdparty/argon2/include/argon2.h index 837e3437..7dedf00c 100644 --- a/src/3rdparty/argon2/include/argon2.h +++ b/src/3rdparty/argon2/include/argon2.h @@ -430,7 +430,7 @@ ARGON2_PUBLIC size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, * @param prefix What to print before each line; NULL is equivalent to empty * string */ -ARGON2_PUBLIC void argon2_select_impl(FILE *out, const char *prefix); +ARGON2_PUBLIC void argon2_select_impl(); ARGON2_PUBLIC const char *argon2_get_impl_name(); ARGON2_PUBLIC int argon2_select_impl_by_name(const char *name); diff --git a/src/3rdparty/argon2/lib/impl-select.c b/src/3rdparty/argon2/lib/impl-select.c index f66a04ce..d618010c 100644 --- a/src/3rdparty/argon2/lib/impl-select.c +++ b/src/3rdparty/argon2/lib/impl-select.c @@ -5,14 +5,7 @@ #include "argon2.h" -#define log_maybe(file, ...) \ - do { \ - if (file) { \ - fprintf(file, __VA_ARGS__); \ - } \ - } while((void)0, 0) - -#define BENCH_SAMPLES 512 +#define BENCH_SAMPLES 1024 #define BENCH_MEM_BLOCKS 512 static argon2_impl selected_argon_impl = { @@ -60,32 +53,24 @@ static uint64_t benchmark_impl(const argon2_impl *impl) { return bench; } -static void select_impl(FILE *out, const char *prefix) +void argon2_select_impl() { argon2_impl_list impls; unsigned int i; const argon2_impl *best_impl = NULL; uint64_t best_bench = UINT_MAX; - log_maybe(out, "%sSelecting best fill_segment implementation...\n", prefix); - argon2_get_impl_list(&impls); for (i = 0; i < impls.count; i++) { const argon2_impl *impl = &impls.entries[i]; uint64_t bench; - log_maybe(out, "%s%s: Checking availability... ", prefix, impl->name); if (impl->check != NULL && !impl->check()) { - log_maybe(out, "FAILED!\n"); continue; } - log_maybe(out, "OK!\n"); - log_maybe(out, "%s%s: Benchmarking...\n", prefix, impl->name); bench = benchmark_impl(impl); - log_maybe(out, "%s%s: Benchmark result: %llu\n", prefix, impl->name, - (unsigned long long)bench); if (bench < best_bench) { best_bench = bench; @@ -94,15 +79,7 @@ static void select_impl(FILE *out, const char *prefix) } if (best_impl != NULL) { - log_maybe(out, - "%sBest implementation: '%s' (bench %llu)\n", prefix, - best_impl->name, (unsigned long long)best_bench); - selected_argon_impl = *best_impl; - } else { - log_maybe(out, - "%sNo optimized implementation available, using default!\n", - prefix); } } @@ -111,14 +88,6 @@ void fill_segment(const argon2_instance_t *instance, argon2_position_t position) selected_argon_impl.fill_segment(instance, position); } -void argon2_select_impl(FILE *out, const char *prefix) -{ - if (prefix == NULL) { - prefix = ""; - } - select_impl(out, prefix); -} - const char *argon2_get_impl_name() { return selected_argon_impl.name; diff --git a/src/backend/cpu/CpuBackend.cpp b/src/backend/cpu/CpuBackend.cpp index 78cd4617..6e90098f 100644 --- a/src/backend/cpu/CpuBackend.cpp +++ b/src/backend/cpu/CpuBackend.cpp @@ -333,6 +333,10 @@ rapidjson::Value xmrig::CpuBackend::toJSON(rapidjson::Document &doc) const out.AddMember("asm", false, allocator); # endif +# ifdef XMRIG_ALGO_ARGON2 + out.AddMember("argon2-impl", argon2::Impl::name().toJSON(), allocator); +# endif + const auto pages = hugePages(); rapidjson::Value hugepages(rapidjson::kArrayType); diff --git a/src/backend/cpu/platform/BasicCpuInfo.cpp b/src/backend/cpu/platform/BasicCpuInfo.cpp index 2f3177d2..7df8fb71 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.cpp +++ b/src/backend/cpu/platform/BasicCpuInfo.cpp @@ -52,7 +52,6 @@ #define VENDOR_ID (0) #define PROCESSOR_INFO (1) -#define CACHE_TLB_DESCRIPTOR (2) #define EXTENDED_FEATURES (7) #define PROCESSOR_BRAND_STRING_1 (0x80000002) #define PROCESSOR_BRAND_STRING_2 (0x80000003) diff --git a/src/crypto/argon2/Impl.cpp b/src/crypto/argon2/Impl.cpp index 0108818e..d0f267f9 100644 --- a/src/crypto/argon2/Impl.cpp +++ b/src/crypto/argon2/Impl.cpp @@ -43,7 +43,7 @@ bool xmrig::argon2::Impl::select(const String &nameHint) { if (!selected) { if (nameHint.isEmpty() || argon2_select_impl_by_name(nameHint) == 0) { - argon2_select_impl(nullptr, nullptr); + argon2_select_impl(); } selected = true;