From c8c61a12c39a0e2df7c38b21a035b0c03759dc1e Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 15 Jun 2026 22:06:14 +0200 Subject: [PATCH] [dynarmic, MacroHLE] Fix crashes on W^X systems (#4090) should fix crashes on: - NetBSD - SELinux - OpenBSD - other W^X systems - some person trying to be funny with W^X on their system even if they dont have to perf impact should be minimal Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4090 Reviewed-by: MaranBr Reviewed-by: Maufeat --- src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp | 3 +++ src/video_core/macro.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp index 1a80ae638a..f1898a92ef 100644 --- a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp @@ -90,6 +90,8 @@ std::once_flag flag; std::optional impl; void SpinLockImpl::Initialize() noexcept { + // Needed for W^X systems (i.e SElinux, OpenBSD) + code.setProtectMode(Xbyak::CodeArray::ProtectMode::PROTECT_RW); Xbyak::Reg64 const ABI_PARAM1 = Backend::X64::HostLocToReg64(Backend::X64::ABI_PARAM1); code.align(); lock = code.getCurr(); @@ -99,6 +101,7 @@ void SpinLockImpl::Initialize() noexcept { unlock = code.getCurr(); EmitSpinLockUnlock(code, ABI_PARAM1, code.eax); code.ret(); + code.setProtectMode(Xbyak::CodeArray::ProtectMode::PROTECT_RE); } void SpinLockImpl::GlobalInitialize() noexcept { diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index dbf011860e..76a054665c 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -1117,6 +1117,8 @@ void MacroJITx64Impl::Optimizer_ScanFlags() { } void MacroJITx64Impl::Compile() { + // Matching PROTECT_RE needed for W^X systems + setProtectMode(Xbyak::CodeArray::ProtectMode::PROTECT_RW); labels.fill(Xbyak::Label()); Common::X64::ABI_PushRegistersAndAdjustStack(*this, Common::X64::ABI_ALL_CALLEE_SAVED, 8); @@ -1164,6 +1166,7 @@ void MacroJITx64Impl::Compile() { Common::X64::ABI_PopRegistersAndAdjustStack(*this, Common::X64::ABI_ALL_CALLEE_SAVED, 8); ret(); ready(); + setProtectMode(Xbyak::CodeArray::ProtectMode::PROTECT_RE); program = getCode(); }