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(); }