[PATCH 1/3] kernel32: Align stack in get_proc_address_wrapper().

Paul Gofman pgofman at codeweavers.com
Tue Oct 27 06:01:55 CDT 2020


Fixes crash on start in Nier Automata after switching
kernel32 to PE.

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
    The game calls GetProcAddress from its (probably DRM related) code
    with unaligned stack. Previously in ELF build all the stdcall functions
    had stack force aligned by gcc, but mingw build doesn't have that.

 dlls/kernel32/module.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 12100c1fe23..9b3a3952307 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -320,18 +320,18 @@ __ASM_GLOBAL_FUNC( get_proc_address_wrapper,
                    "movq %rsp,%rbp\n\t"
                    __ASM_SEH(".seh_setframe %rbp,0\n\t")
                    __ASM_CFI(".cfi_def_cfa_register %rbp\n\t")
-                   "subq $0x40,%rsp\n\t"
-                   __ASM_SEH(".seh_stackalloc 0x40\n\t")
                    __ASM_SEH(".seh_endprologue\n\t")
-                   "movaps %xmm0,-0x10(%rbp)\n\t"
-                   "movaps %xmm1,-0x20(%rbp)\n\t"
-                   "movaps %xmm2,-0x30(%rbp)\n\t"
-                   "movaps %xmm3,-0x40(%rbp)\n\t"
+                   "subq $0x60,%rsp\n\t"
+                   "andq $~15,%rsp\n\t"
+                   "movaps %xmm0,0x20(%rsp)\n\t"
+                   "movaps %xmm1,0x30(%rsp)\n\t"
+                   "movaps %xmm2,0x40(%rsp)\n\t"
+                   "movaps %xmm3,0x50(%rsp)\n\t"
                    "call " __ASM_NAME("get_proc_address") "\n\t"
-                   "movaps -0x40(%rbp), %xmm3\n\t"
-                   "movaps -0x30(%rbp), %xmm2\n\t"
-                   "movaps -0x20(%rbp), %xmm1\n\t"
-                   "movaps -0x10(%rbp), %xmm0\n\t"
+                   "movaps 0x50(%rsp), %xmm3\n\t"
+                   "movaps 0x40(%rsp), %xmm2\n\t"
+                   "movaps 0x30(%rsp), %xmm1\n\t"
+                   "movaps 0x20(%rsp), %xmm0\n\t"
                    "leaq 0(%rbp),%rsp\n\t"
                    __ASM_CFI(".cfi_def_cfa_register %rsp\n\t")
                    "popq %rbp\n\t"
-- 
2.26.2




More information about the wine-devel mailing list