[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