From ffeb16fe1ec7a6a62ac317270dab20197b060ef9 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Fri, 19 Sep 2025 11:46:39 +0300 Subject: [PATCH] Win32: Respect home space / shadow space on the stack frame (#17514) Previous code did not respect the 32-byte long area on the stack frame called the home space - area on the stack frame area that is specific to Microsoft's x64 calling convention, leading to corrupted values after a callback. Bug noticed by @capriots Co-Authored-By: capriots <29807355+capriots@users.noreply.github.com> --- rpcs3/Emu/Cell/PPUThread.cpp | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index ad5545ba62..dbc2f04c0b 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -195,17 +195,17 @@ const auto ppu_gateway = build_function_asm("ppu_gateway", c.push(x86::rdi); c.push(x86::rbp); c.push(x86::rbx); - c.sub(x86::rsp, 0xa8); - c.movaps(x86::oword_ptr(x86::rsp, 0x90), x86::xmm15); - c.movaps(x86::oword_ptr(x86::rsp, 0x80), x86::xmm14); - c.movaps(x86::oword_ptr(x86::rsp, 0x70), x86::xmm13); - c.movaps(x86::oword_ptr(x86::rsp, 0x60), x86::xmm12); - c.movaps(x86::oword_ptr(x86::rsp, 0x50), x86::xmm11); - c.movaps(x86::oword_ptr(x86::rsp, 0x40), x86::xmm10); - c.movaps(x86::oword_ptr(x86::rsp, 0x30), x86::xmm9); - c.movaps(x86::oword_ptr(x86::rsp, 0x20), x86::xmm8); - c.movaps(x86::oword_ptr(x86::rsp, 0x10), x86::xmm7); - c.movaps(x86::oword_ptr(x86::rsp, 0), x86::xmm6); + c.sub(x86::rsp, 0xc8); + c.movaps(x86::oword_ptr(x86::rsp, 0xb0), x86::xmm15); + c.movaps(x86::oword_ptr(x86::rsp, 0xa0), x86::xmm14); + c.movaps(x86::oword_ptr(x86::rsp, 0x90), x86::xmm13); + c.movaps(x86::oword_ptr(x86::rsp, 0x80), x86::xmm12); + c.movaps(x86::oword_ptr(x86::rsp, 0x70), x86::xmm11); + c.movaps(x86::oword_ptr(x86::rsp, 0x60), x86::xmm10); + c.movaps(x86::oword_ptr(x86::rsp, 0x50), x86::xmm9); + c.movaps(x86::oword_ptr(x86::rsp, 0x40), x86::xmm8); + c.movaps(x86::oword_ptr(x86::rsp, 0x30), x86::xmm7); + c.movaps(x86::oword_ptr(x86::rsp, 0x20), x86::xmm6); #else c.push(x86::rbp); c.push(x86::r15); @@ -252,17 +252,17 @@ const auto ppu_gateway = build_function_asm("ppu_gateway", } #ifdef _WIN32 - c.movaps(x86::xmm6, x86::oword_ptr(x86::rsp, 0)); - c.movaps(x86::xmm7, x86::oword_ptr(x86::rsp, 0x10)); - c.movaps(x86::xmm8, x86::oword_ptr(x86::rsp, 0x20)); - c.movaps(x86::xmm9, x86::oword_ptr(x86::rsp, 0x30)); - c.movaps(x86::xmm10, x86::oword_ptr(x86::rsp, 0x40)); - c.movaps(x86::xmm11, x86::oword_ptr(x86::rsp, 0x50)); - c.movaps(x86::xmm12, x86::oword_ptr(x86::rsp, 0x60)); - c.movaps(x86::xmm13, x86::oword_ptr(x86::rsp, 0x70)); - c.movaps(x86::xmm14, x86::oword_ptr(x86::rsp, 0x80)); - c.movaps(x86::xmm15, x86::oword_ptr(x86::rsp, 0x90)); - c.add(x86::rsp, 0xa8); + c.movaps(x86::xmm6, x86::oword_ptr(x86::rsp, 0x20)); + c.movaps(x86::xmm7, x86::oword_ptr(x86::rsp, 0x30)); + c.movaps(x86::xmm8, x86::oword_ptr(x86::rsp, 0x40)); + c.movaps(x86::xmm9, x86::oword_ptr(x86::rsp, 0x50)); + c.movaps(x86::xmm10, x86::oword_ptr(x86::rsp, 0x60)); + c.movaps(x86::xmm11, x86::oword_ptr(x86::rsp, 0x70)); + c.movaps(x86::xmm12, x86::oword_ptr(x86::rsp, 0x80)); + c.movaps(x86::xmm13, x86::oword_ptr(x86::rsp, 0x90)); + c.movaps(x86::xmm14, x86::oword_ptr(x86::rsp, 0xa0)); + c.movaps(x86::xmm15, x86::oword_ptr(x86::rsp, 0xb0)); + c.add(x86::rsp, 0xc8); c.pop(x86::rbx); c.pop(x86::rbp); c.pop(x86::rdi);