From 417ed904f038543f91288692a5153ffffbd8617d Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 23 Apr 2026 05:06:33 +0200 Subject: [PATCH] [dynarmic] fix MWAIT push/pop not being handled properly on xbyak (#3875) push %edx is not what i wanted, nor what anybody wants, xbyak silently accepting this before was not intended now that xbyak is updated this is an issue the issue was simply: a) ptr being overwritten (if it happened to be EDX/EBX/EAX) due to changed WAITPKG logic (oops) b) xbyak not reporting wrong r32 pop/push on older versions thus missing it and now it throws an exception Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3875 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- .../src/dynarmic/common/spin_lock_x64.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp index 7607bbaafc..e3f1721132 100644 --- a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp @@ -23,16 +23,14 @@ static const auto default_cg_mode = nullptr; //Allow RWE namespace Dynarmic { void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp, bool waitpkg) { - // TODO: this is because we lack regalloc - so better to be safe :( - if (waitpkg) { - code.push(Xbyak::util::eax); - code.push(Xbyak::util::ebx); - code.push(Xbyak::util::edx); - } Xbyak::Label start, loop; code.jmp(start, code.T_NEAR); code.L(loop); if (waitpkg) { + // TODO: this is because we lack regalloc - so better to be safe :( + code.push(Xbyak::util::rax); + code.push(Xbyak::util::rbx); + code.push(Xbyak::util::rdx); // TODO: This clobbers EAX and EDX did we tell the regalloc? // ARM ptr for address-monitoring code.umonitor(ptr); @@ -49,6 +47,9 @@ void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 code.umwait(Xbyak::util::ebx); // CF == 1 if we hit the OS-timeout in IA32_UMWAIT_CONTROL without a write // CF == 0 if we exited the wait for any other reason + code.pop(Xbyak::util::rdx); + code.pop(Xbyak::util::rbx); + code.pop(Xbyak::util::rax); } else { code.pause(); } @@ -57,11 +58,6 @@ void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 /*code.lock();*/ code.xchg(code.dword[ptr], tmp); code.test(tmp, tmp); code.jnz(loop, code.T_NEAR); - if (waitpkg) { - code.pop(Xbyak::util::edx); - code.pop(Xbyak::util::ebx); - code.pop(Xbyak::util::eax); - } } void EmitSpinLockUnlock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp) {