From 69f2baec414a9cab64b19735fd40e34504c5a160 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Wed, 8 Sep 2021 14:54:55 +0200 Subject: [PATCH] Fixed code cache flushing on macOS --- CMakeLists.txt | 6 ++++++ src/jit_compiler_a64.cpp | 16 ++++------------ src/virtual_memory.cpp | 14 ++++++++++++++ src/virtual_memory.hpp | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89b23c2..00f82fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ endif() include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) +include(CheckSymbolExists) function(add_flag flag) string(REPLACE "-" "_" supported_cxx ${flag}_cxx) @@ -216,6 +217,11 @@ if(ARM_ID STREQUAL "aarch64" OR ARM_ID STREQUAL "arm64" OR ARM_ID STREQUAL "armv endif() endif() +check_symbol_exists("__builtin___clear_cache" "stdlib.h" HAVE_BUILTIN_CLEAR_CACHE) +if (HAVE_BUILTIN_CLEAR_CACHE) + add_definitions(-DHAVE_BUILTIN_CLEAR_CACHE) +endif() + set(RANDOMX_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "RandomX Include path") add_library(randomx ${randomx_sources}) diff --git a/src/jit_compiler_a64.cpp b/src/jit_compiler_a64.cpp index e45774e..35a1b7b 100644 --- a/src/jit_compiler_a64.cpp +++ b/src/jit_compiler_a64.cpp @@ -96,9 +96,7 @@ 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(code), reinterpret_cast(code + CodeSize)); -#endif + flushInstructionCache(code, code + CodeSize); } JitCompilerA64::~JitCompilerA64() @@ -167,9 +165,7 @@ 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(code + MainLoopBegin), reinterpret_cast(code + codePos)); -#endif + flushInstructionCache(code + MainLoopBegin, code + codePos); } void JitCompilerA64::generateProgramLight(Program& program, ProgramConfiguration& config, uint32_t datasetOffset) @@ -224,9 +220,7 @@ 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(code + MainLoopBegin), reinterpret_cast(code + codePos)); -#endif + flushInstructionCache(code + MainLoopBegin, code + codePos); } template @@ -342,9 +336,7 @@ void JitCompilerA64::generateSuperscalarHash(SuperscalarProgram(&programs)[N], s memcpy(code + codePos, p1, p2 - p1); codePos += p2 - p1; -#ifdef __GNUC__ - __builtin___clear_cache(reinterpret_cast(code + CodeSize), reinterpret_cast(code + codePos)); -#endif + flushInstructionCache(code + CodeSize, code + codePos); } template void JitCompilerA64::generateSuperscalarHash(SuperscalarProgram(&programs)[RANDOMX_CACHE_ACCESSES], std::vector &reciprocalCache); diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index 262081a..1cd7e9b 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -34,6 +34,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #else #ifdef __APPLE__ +#include #include #include # if defined(__aarch64__) && TARGET_OS_OSX @@ -195,3 +196,16 @@ void freePagedMemory(void* ptr, std::size_t bytes) { munmap(ptr, bytes); #endif } + +void flushInstructionCache(void* begin, void* end) +{ + const size_t size = static_cast(reinterpret_cast(end) - reinterpret_cast(begin)); + +#if defined(_WIN32) || defined(__CYGWIN__) + ::FlushInstructionCache(GetCurrentProcess(), begin, size); +#elif defined(__APPLE__) + sys_icache_invalidate(begin, size); +#elif defined(__GNUC__) || defined(HAVE_BUILTIN_CLEAR_CACHE) + __builtin___clear_cache(reinterpret_cast(begin), reinterpret_cast(end)); +#endif +} diff --git a/src/virtual_memory.hpp b/src/virtual_memory.hpp index 9e8bc29..13dad0b 100644 --- a/src/virtual_memory.hpp +++ b/src/virtual_memory.hpp @@ -40,3 +40,4 @@ void setPagesRX(void*, std::size_t); void setPagesRWX(void*, std::size_t); void* allocLargePagesMemory(std::size_t); void freePagedMemory(void*, std::size_t); +void flushInstructionCache(void* begin, void* end);