From 708a4e50c53f89d3b91aff749ce24b01c293dbe3 Mon Sep 17 00:00:00 2001 From: tevador Date: Thu, 25 Jun 2020 19:25:20 +0200 Subject: [PATCH] Fix compilation and JIT support on NetBSD: 1. Disable hugepages (not supported). 2. Force W^X (required). 3. When allocating JIT memory, PROT_EXEC must be reserved in order to set the pages executable later. --- src/jit_compiler.hpp | 4 ++++ src/randomx.cpp | 2 +- src/tests/affinity.cpp | 2 +- src/tests/benchmark.cpp | 5 +++-- src/tests/tests.cpp | 10 +++++----- src/virtual_memory.cpp | 9 +++++++-- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/jit_compiler.hpp b/src/jit_compiler.hpp index bd9c2b0..70ffedd 100644 --- a/src/jit_compiler.hpp +++ b/src/jit_compiler.hpp @@ -35,3 +35,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #else #include "jit_compiler_fallback.hpp" #endif + +#if defined(__OpenBSD__) || defined(__NetBSD__) +#define RANDOMX_FORCE_SECURE +#endif diff --git a/src/randomx.cpp b/src/randomx.cpp index 75dfdfe..e56b44c 100644 --- a/src/randomx.cpp +++ b/src/randomx.cpp @@ -43,7 +43,7 @@ extern "C" { randomx_flags randomx_get_flags() { randomx_flags flags = RANDOMX_HAVE_COMPILER ? RANDOMX_FLAG_JIT : RANDOMX_FLAG_DEFAULT; randomx::Cpu cpu; -#ifdef __OpenBSD__ +#ifdef RANDOMX_FORCE_SECURE if (flags == RANDOMX_FLAG_JIT) { flags |= RANDOMX_FLAG_SECURE; } diff --git a/src/tests/affinity.cpp b/src/tests/affinity.cpp index 40f6458..b090d47 100644 --- a/src/tests/affinity.cpp +++ b/src/tests/affinity.cpp @@ -65,7 +65,7 @@ set_thread_affinity(std::thread::native_handle_type thread, (thread_policy_t)&policy, 1); #elif defined(_WIN32) || defined(__CYGWIN__) rc = SetThreadAffinityMask(reinterpret_cast(thread), 1ULL << cpuid) == 0 ? -2 : 0; -#elif !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__ANDROID__) +#elif !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__ANDROID__) && !defined(__NetBSD__) cpu_set_t cs; CPU_ZERO(&cs); CPU_SET(cpuid, &cs); diff --git a/src/tests/benchmark.cpp b/src/tests/benchmark.cpp index 47cd026..9314ef8 100644 --- a/src/tests/benchmark.cpp +++ b/src/tests/benchmark.cpp @@ -40,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../dataset.hpp" #include "../blake2/endian.h" #include "../common.hpp" +#include "../jit_compiler.hpp" #ifdef _WIN32 #include #include @@ -199,7 +200,7 @@ int main(int argc, char** argv) { } if (jit) { flags |= RANDOMX_FLAG_JIT; -#ifdef __OpenBSD__ +#ifdef RANDOMX_FORCE_SECURE flags |= RANDOMX_FLAG_SECURE; #endif } @@ -211,7 +212,7 @@ int main(int argc, char** argv) { if (miningMode) { flags |= RANDOMX_FLAG_FULL_MEM; } -#ifndef __OpenBSD__ +#ifndef RANDOMX_FORCE_SECURE if (secure) { flags |= RANDOMX_FLAG_SECURE; } diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index 75daaba..412585b 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -143,7 +143,7 @@ int main() { randomx::JitCompiler jit; jit.generateSuperscalarHash(cache->programs, cache->reciprocalCache); jit.generateDatasetInitCode(); -#ifdef __OpenBSD__ +#ifdef RANDOMX_FORCE_SECURE jit.enableExecution(); #else jit.enableAll(); @@ -954,7 +954,7 @@ int main() { assert(ibc.memMask == randomx::ScratchpadL3Mask); }); -#ifdef __OpenBSD__ +#ifdef RANDOMX_FORCE_SECURE vm = randomx_create_vm(RANDOMX_FLAG_DEFAULT | RANDOMX_FLAG_SECURE, cache, nullptr); #else vm = randomx_create_vm(RANDOMX_FLAG_DEFAULT, cache, nullptr); @@ -1009,10 +1009,10 @@ int main() { vm = nullptr; cache = randomx_alloc_cache(RANDOMX_FLAG_JIT); initCache("test key 000"); -#ifdef __OpenBSD__ - vm = randomx_create_vm(RANDOMX_FLAG_DEFAULT | RANDOMX_FLAG_SECURE, cache, nullptr); +#ifdef RANDOMX_FORCE_SECURE + vm = randomx_create_vm(RANDOMX_FLAG_JIT | RANDOMX_FLAG_SECURE, cache, nullptr); #else - vm = randomx_create_vm(RANDOMX_FLAG_DEFAULT, cache, nullptr); + vm = randomx_create_vm(RANDOMX_FLAG_JIT, cache, nullptr); #endif } diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index fc46ae9..2b752cb 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -94,7 +94,12 @@ void* allocMemoryPages(std::size_t bytes) { if (mem == nullptr) throw std::runtime_error(getErrorMessage("allocMemoryPages - VirtualAlloc")); #else - mem = mmap(nullptr, bytes, PAGE_READWRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + #if defined(__NetBSD__) + #define RESERVED_FLAGS PROT_MPROTECT(PROT_EXEC) + #else + #define RESERVED_FLAGS 0 + #endif + mem = mmap(nullptr, bytes, PAGE_READWRITE | RESERVED_FLAGS, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (mem == MAP_FAILED) throw std::runtime_error("allocMemoryPages - mmap failed"); #endif @@ -141,7 +146,7 @@ void* allocLargePagesMemory(std::size_t bytes) { mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0); #elif defined(__FreeBSD__) mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER, -1, 0); -#elif defined(__OpenBSD__) +#elif defined(__OpenBSD__) || defined(__NetBSD__) mem = MAP_FAILED; // OpenBSD does not support huge pages #else mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_POPULATE, -1, 0);