Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,17 @@ src/virtual_machine.cpp
src/vm_compiled_light.cpp
src/blake2/blake2b.c)

if (NOT WIN32)
check_symbol_exists("__builtin___clear_cache" "stdlib.h" HAVE_BUILTIN_CLEAR_CACHE)
if (HAVE_BUILTIN_CLEAR_CACHE)
add_definitions(-DHAVE_BUILTIN_CLEAR_CACHE)
endif()
endif()

if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
add_definitions(-D_GNU_SOURCE -DHAVE_BUILTIN_CLEAR_CACHE)
endif()

if(NOT ARCH_ID)
# allow cross compiling
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "")
Expand Down
27 changes: 19 additions & 8 deletions src/jit_compiler_a64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "program.hpp"
#include "reciprocal.h"
#include "virtual_memory.h"
#if !defined(HAVE_BUILTIN_CLEAR_CACHE) && defined(__APPLE__)
#include <libkern/OSCacheControl.h>
#endif

namespace ARMV8A {

Expand Down Expand Up @@ -98,8 +101,10 @@ JitCompilerA64::JitCompilerA64()
memset(reg_changed_offset, 0, sizeof(reg_changed_offset));
memcpy(code, (void*) randomx_program_aarch64, CodeSize);

#ifdef __GNUC__
__builtin___clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code + CodeSize));
#if defined(HAVE_BUILTIN_CLEAR_CACHE) || !defined(__APPLE__)
__builtin___clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code + CodeSize));
#else
sys_icache_invalidate(code, CodeSize);
#endif
}

Expand Down Expand Up @@ -169,8 +174,10 @@ void JitCompilerA64::generateProgram(Program& program, ProgramConfiguration& con
codePos = ((uint8_t*)randomx_program_aarch64_update_spMix1) - ((uint8_t*)randomx_program_aarch64);
emit32(ARMV8A::EOR | 10 | (IntRegMap[config.readReg0] << 5) | (IntRegMap[config.readReg1] << 16), code, codePos);

#ifdef __GNUC__
__builtin___clear_cache(reinterpret_cast<char*>(code + MainLoopBegin), reinterpret_cast<char*>(code + codePos));
#if defined(HAVE_BUILTIN_CLEAR_CACHE) || !defined(__APPLE__)
__builtin___clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code + CodeSize));
#else
sys_icache_invalidate(code, CodeSize);
#endif
}

Expand Down Expand Up @@ -226,8 +233,10 @@ void JitCompilerA64::generateProgramLight(Program& program, ProgramConfiguration
emit32(ARMV8A::ADD_IMM_LO | 2 | (2 << 5) | (imm_lo << 10), code, codePos);
emit32(ARMV8A::ADD_IMM_HI | 2 | (2 << 5) | (imm_hi << 10), code, codePos);

#ifdef __GNUC__
__builtin___clear_cache(reinterpret_cast<char*>(code + MainLoopBegin), reinterpret_cast<char*>(code + codePos));
#if defined(HAVE_BUILTIN_CLEAR_CACHE) || !defined(__APPLE__)
__builtin___clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code + CodeSize));
#else
sys_icache_invalidate(code, CodeSize);
#endif
}

Expand Down Expand Up @@ -344,8 +353,10 @@ void JitCompilerA64::generateSuperscalarHash(SuperscalarProgram(&programs)[N], s
memcpy(code + codePos, p1, p2 - p1);
codePos += p2 - p1;

#ifdef __GNUC__
__builtin___clear_cache(reinterpret_cast<char*>(code + CodeSize), reinterpret_cast<char*>(code + codePos));
#if defined(HAVE_BUILTIN_CLEAR_CACHE) || !defined(__APPLE__)
__builtin___clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code + CodeSize));
#else
sys_icache_invalidate(code, CodeSize);
#endif
}

Expand Down