diff --git a/src/crypto/randomx/jit_compiler_x86.cpp b/src/crypto/randomx/jit_compiler_x86.cpp index d0a97bbd..ee3e1b45 100644 --- a/src/crypto/randomx/jit_compiler_x86.cpp +++ b/src/crypto/randomx/jit_compiler_x86.cpp @@ -170,16 +170,26 @@ namespace randomx { {0x0F, 0x1F, 0x44, 0x00, 0x00, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E}, }; + static inline uint8_t* alignToPage(uint8_t* p, size_t pageSize) { + size_t k = (size_t) p; + k -= k % pageSize; + return (uint8_t*) k; + } + size_t JitCompilerX86::getCodeSize() { return codePos < prologueSize ? 0 : codePos - prologueSize; } void JitCompilerX86::enableWriting() const { - xmrig::VirtualMemory::protectRW(allocatedCode, allocatedSize); + uint8_t* p1 = alignToPage(code, 4096); + uint8_t* p2 = code + CodeSize; + xmrig::VirtualMemory::protectRW(p1, p2 - p1); } void JitCompilerX86::enableExecution() const { - xmrig::VirtualMemory::protectRX(allocatedCode, allocatedSize); + uint8_t* p1 = alignToPage(code, 4096); + uint8_t* p2 = code + CodeSize; + xmrig::VirtualMemory::protectRX(p1, p2 - p1); } static inline void cpuid(uint32_t level, int32_t output[4]) @@ -213,7 +223,13 @@ namespace randomx { hasXOP = ((info[2] & (1 << 11)) != 0); allocatedSize = CodeSize * 2; - allocatedCode = static_cast(allocExecutableMemory(allocatedSize, hugePagesJIT && hugePagesEnable)); + allocatedCode = static_cast(allocExecutableMemory(allocatedSize, +# ifdef XMRIG_SECURE_JIT + false +# else + hugePagesJIT && hugePagesEnable +# endif + )); // Shift code base address to improve caching - all threads will use different L2/L3 cache sets code = allocatedCode + (codeOffset.fetch_add(codeOffsetIncrement) % CodeSize);