Index: common/Linux/LnxHostSys.cpp
--- common/Linux/LnxHostSys.cpp.orig
+++ common/Linux/LnxHostSys.cpp
@@ -14,12 +14,14 @@
 #include <fcntl.h>
 #include <mutex>
 #include <sys/mman.h>
+#ifndef __OpenBSD__
 #include <ucontext.h>
+#endif
 #include <unistd.h>
 
 #include "fmt/format.h"
 
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
 #include "cpuinfo.h"
 #endif
 
@@ -53,13 +55,22 @@ void* HostSys::Mmap(void* base, size_t size, const Pag
 	const u32 prot = LinuxProt(mode);
 
 	u32 flags = MAP_PRIVATE | MAP_ANONYMOUS;
+#if defined(MAP_FIXED_NOREPLACE)
 	if (base)
 		flags |= MAP_FIXED_NOREPLACE;
+#endif
 
 	void* res = mmap(base, size, prot, flags, -1, 0);
 	if (res == MAP_FAILED)
 		return nullptr;
 
+#if !defined(MAP_FIXED_NOREPLACE)
+	if (base && base != res) {
+		munmap(res, size);
+		return nullptr;
+	}
+#endif
+
 	return res;
 }
 
@@ -124,11 +135,22 @@ void* HostSys::MapSharedMemory(void* handle, size_t of
 {
 	const uint lnxmode = LinuxProt(mode);
 
+#if defined(MAP_FIXED_NOREPLACE)
 	const int flags = (baseaddr != nullptr) ? (MAP_SHARED | MAP_FIXED_NOREPLACE) : MAP_SHARED;
+#else
+	const int flags = MAP_SHARED;
+#endif
 	void* ptr = mmap(baseaddr, size, lnxmode, flags, static_cast<int>(reinterpret_cast<intptr_t>(handle)), static_cast<off_t>(offset));
 	if (ptr == MAP_FAILED)
 		return nullptr;
 
+#if !defined(MAP_FIXED_NOREPLACE)
+	if (baseaddr != nullptr && baseaddr != ptr) {
+		munmap(ptr, size);
+		return nullptr;
+	}
+#endif
+
 	return ptr;
 }
 
@@ -146,7 +168,7 @@ size_t HostSys::GetRuntimePageSize()
 
 size_t HostSys::GetRuntimeCacheLineSize()
 {
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
 	if (!cpuinfo_initialize())
 		return 0;
 
@@ -315,6 +337,14 @@ void PageFaultHandler::SignalHandler(int sig, siginfo_
 	void* const exception_address = reinterpret_cast<void*>(static_cast<ucontext_t*>(ctx)->uc_mcontext->__es.__far);
 	void* const exception_pc = reinterpret_cast<void*>(static_cast<ucontext_t*>(ctx)->uc_mcontext->__ss.__pc);
 	const bool is_write = IsStoreInstruction(exception_pc);
+#endif
+
+#elif defined(__OpenBSD__)
+	void* const exception_address = reinterpret_cast<void*>(info->si_addr);
+
+#if defined(_M_X86)
+	void* const exception_pc = reinterpret_cast<void*>(static_cast<ucontext_t*>(ctx)->sc_rip);
+	const bool is_write = (static_cast<ucontext_t*>(ctx)->sc_err & 2) != 0;
 #endif
 
 #endif
