mirror of
				https://git.wownero.com/wownero/RandomWOW.git
				synced 2024-08-15 00:23:14 +00:00 
			
		
		
		
	Merge pull request #187 from tevador/pr-netbsd
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.
This commit is contained in:
		
						commit
						a1c08a2f41
					
				
					 6 changed files with 21 additions and 11 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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; | ||||
| 		} | ||||
|  |  | |||
|  | @ -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<HANDLE>(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); | ||||
|  |  | |||
|  | @ -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 <windows.h> | ||||
| #include <VersionHelpers.h> | ||||
|  | @ -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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -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 | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue