aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2019-03-05 12:40:06 +0200
committerRiccardo Spagni <ric@spagni.net>2019-03-05 12:40:06 +0200
commit39d7d3113bfe3655e721fa08b132d3b7fbcfb9b3 (patch)
tree01313a7ac6efed723a88e4063478539323fd556b
parentMerge pull request #5101 (diff)
parentCryptonightR: define out i386/x86_64 specific code on other archs (diff)
downloadmonero-39d7d3113bfe3655e721fa08b132d3b7fbcfb9b3.tar.xz
Merge pull request #5231
108c625b CryptonightR: define out i386/x86_64 specific code on other archs (moneromooo-monero) 1b8757dd slow-hash: fix build on arm (moneromooo-monero) 5057eb11 cmake: ARCH_ID fixes for cross compilation (TheCharlatan)
Diffstat (limited to '')
-rw-r--r--CMakeLists.txt3
-rw-r--r--contrib/depends/toolchain.cmake.in7
-rw-r--r--src/crypto/CMakeLists.txt5
-rw-r--r--src/crypto/CryptonightR_JIT.c8
-rw-r--r--src/crypto/CryptonightR_JIT.h6
-rw-r--r--src/crypto/CryptonightR_template.h4
-rw-r--r--src/crypto/slow-hash.c54
7 files changed, 60 insertions, 27 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 90b16cab8..191cc8966 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -115,6 +115,9 @@ string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER)
# to identify the target architecture, to direct logic in this cmake script.
# Since ARCH is a cached variable, it will not be set on first cmake invocation.
if (NOT ARCH OR ARCH STREQUAL "" OR ARCH STREQUAL "native" OR ARCH STREQUAL "default")
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "")
+ set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
+ endif()
set(ARCH_ID "${CMAKE_SYSTEM_PROCESSOR}")
else()
set(ARCH_ID "${ARCH}")
diff --git a/contrib/depends/toolchain.cmake.in b/contrib/depends/toolchain.cmake.in
index 547b59108..b0af7bd6b 100644
--- a/contrib/depends/toolchain.cmake.in
+++ b/contrib/depends/toolchain.cmake.in
@@ -47,6 +47,8 @@ set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target
+set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR} CACHE STRING "" FORCE)
+
# specify the cross compiler to be used. Darwin uses clang provided by the SDK.
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
SET(CMAKE_C_COMPILER @prefix@/native/bin/clang)
@@ -88,6 +90,11 @@ endif()
if(ARCHITECTURE STREQUAL "i686" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
SET(LINUX_32 ON)
+ SET(ARCH_ID "i386")
+endif()
+
+if(ARCHITECTURE STREQUAL "x86_64" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ SET(ARCH_ID "x86_64")
endif()
#Create a new global cmake flag that indicates building with depends
diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt
index 5ce43be22..6e774b8d5 100644
--- a/src/crypto/CMakeLists.txt
+++ b/src/crypto/CMakeLists.txt
@@ -46,9 +46,12 @@ set(crypto_sources
skein.c
slow-hash.c
CryptonightR_JIT.c
- CryptonightR_template.S
tree-hash.c)
+if(ARCH_ID STREQUAL "i386" OR ARCH_ID STREQUAL "x86_64" OR ARCH_ID STREQUAL "x86-64")
+list(APPEND crypto_sources CryptonightR_template.S)
+endif()
+
set(crypto_headers)
set(crypto_private_headers
diff --git a/src/crypto/CryptonightR_JIT.c b/src/crypto/CryptonightR_JIT.c
index 9add65296..68258a959 100644
--- a/src/crypto/CryptonightR_JIT.c
+++ b/src/crypto/CryptonightR_JIT.c
@@ -12,6 +12,7 @@
#include "CryptonightR_template.h"
static const uint8_t prologue[] = {
+#if defined __i386 || defined __x86_64__
0x4C, 0x8B, 0xD7, // mov r10, rdi
0x53, // push rbx
0x55, // push rbp
@@ -26,9 +27,11 @@ static const uint8_t prologue[] = {
0x41, 0x8B, 0x42, 0x18, // mov eax, DWORD PTR [r10+24]
0x41, 0x8B, 0x52, 0x1C, // mov edx, DWORD PTR [r10+28]
0x45, 0x8B, 0x4A, 0x20, // mov r9d, DWORD PTR [r10+32]
+#endif
};
static const uint8_t epilogue[] = {
+#if defined __i386 || defined __x86_64__
0x49, 0x8B, 0xE3, // mov rsp, r11
0x41, 0x89, 0x1A, // mov DWORD PTR [r10], ebx
0x41, 0x89, 0x72, 0x04, // mov DWORD PTR [r10+4], esi
@@ -38,6 +41,7 @@ static const uint8_t epilogue[] = {
0x5D, // pop rbp
0x5B, // pop rbx
0xC3, // ret
+#endif
};
#define APPEND_CODE(src, size) \
@@ -50,6 +54,7 @@ static const uint8_t epilogue[] = {
int v4_generate_JIT_code(const struct V4_Instruction* code, v4_random_math_JIT_func buf, const size_t buf_size)
{
+#if defined __i386 || defined __x86_64__
uint8_t* JIT_code = (uint8_t*) buf;
const uint8_t* JIT_code_end = JIT_code + buf_size;
@@ -99,4 +104,7 @@ int v4_generate_JIT_code(const struct V4_Instruction* code, v4_random_math_JIT_f
__builtin___clear_cache((char*)buf, (char*)JIT_code);
return 0;
+#else
+ return 1;
+#endif
}
diff --git a/src/crypto/CryptonightR_JIT.h b/src/crypto/CryptonightR_JIT.h
index 5f689b37b..cb32c3a79 100644
--- a/src/crypto/CryptonightR_JIT.h
+++ b/src/crypto/CryptonightR_JIT.h
@@ -8,7 +8,11 @@
// - Call v4_generate_JIT_code with "buf" pointed to memory allocated on previous step
// - Call the generated code instead of "v4_random_math(code, r)", omit the "code" parameter
-typedef void (*v4_random_math_JIT_func)(uint32_t* r) __attribute__((sysv_abi));
+typedef void (*v4_random_math_JIT_func)(uint32_t* r)
+#if defined __i386 || defined __x86_64__
+__attribute__((sysv_abi))
+#endif
+;
// Given the random math sequence, generates machine code (x86-64) for it
// Returns 0 if code was generated successfully
diff --git a/src/crypto/CryptonightR_template.h b/src/crypto/CryptonightR_template.h
index 57eb92ebe..dab1bd750 100644
--- a/src/crypto/CryptonightR_template.h
+++ b/src/crypto/CryptonightR_template.h
@@ -1,6 +1,8 @@
#ifndef CRYPTONIGHTR_TEMPLATE_H
#define CRYPTONIGHTR_TEMPLATE_H
+#if defined __i386 || defined __x86_64__
+
void CryptonightR_instruction0(void);
void CryptonightR_instruction1(void);
void CryptonightR_instruction2(void);
@@ -1036,4 +1038,6 @@ const void* instructions_mov[257] = {
CryptonightR_instruction_mov256,
};
+#endif
+
#endif // CRYPTONIGHTR_TEMPLATE_H
diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c
index 2a8ddb59c..6bdc1b28c 100644
--- a/src/crypto/slow-hash.c
+++ b/src/crypto/slow-hash.c
@@ -65,6 +65,31 @@ static void local_abort(const char *msg)
#endif
}
+volatile int use_v4_jit_flag = -1;
+
+static inline int use_v4_jit(void)
+{
+#if defined(__x86_64__)
+
+ if (use_v4_jit_flag != -1)
+ return use_v4_jit_flag;
+
+ const char *env = getenv("MONERO_USE_CNV4_JIT");
+ if (!env) {
+ use_v4_jit_flag = 0;
+ }
+ else if (!strcmp(env, "0") || !strcmp(env, "no")) {
+ use_v4_jit_flag = 0;
+ }
+ else {
+ use_v4_jit_flag = 1;
+ }
+ return use_v4_jit_flag;
+#else
+ return 0;
+#endif
+}
+
#define VARIANT1_1(p) \
do if (variant == 1) \
{ \
@@ -494,31 +519,6 @@ STATIC INLINE int force_software_aes(void)
return use;
}
-volatile int use_v4_jit_flag = -1;
-
-STATIC INLINE int use_v4_jit(void)
-{
-#if defined(__x86_64__)
-
- if (use_v4_jit_flag != -1)
- return use_v4_jit_flag;
-
- const char *env = getenv("MONERO_USE_CNV4_JIT");
- if (!env) {
- use_v4_jit_flag = 0;
- }
- else if (!strcmp(env, "0") || !strcmp(env, "no")) {
- use_v4_jit_flag = 0;
- }
- else {
- use_v4_jit_flag = 1;
- }
- return use_v4_jit_flag;
-#else
- return 0;
-#endif
-}
-
STATIC INLINE int check_aes_hw(void)
{
int cpuid_results[4];
@@ -1029,6 +1029,8 @@ void slow_hash_free_state(void)
#define U64(x) ((uint64_t *) (x))
+#define hp_jitfunc ((v4_random_math_JIT_func)NULL)
+
STATIC INLINE void xor64(uint64_t *a, const uint64_t b)
{
*a ^= b;
@@ -1574,6 +1576,8 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int
#else
// Portable implementation as a fallback
+#define hp_jitfunc ((v4_random_math_JIT_func)NULL)
+
void slow_hash_allocate_state(void)
{
// Do nothing, this is just to maintain compatibility with the upgraded slow-hash.c