Module: wine Branch: master Commit: 4934c1276232a9ac9cad1bdf750c5ac099944180 URL: https://gitlab.winehq.org/wine/wine/-/commit/4934c1276232a9ac9cad1bdf750c5ac...
Author: Martin Storsjö martin@martin.st Date: Sat Oct 1 23:49:29 2022 +0300
wow64: Use the right SEH opcode in raise_exception on arm64.
On ARM and ARM64, each SEH opcode is supposed to map to exactly one instruction; the operation of writing x29+x30 with a stack offset with writeback is called ".seh_save_fplr_x".
Using the right opcode would fix inconsistent unwinding if we would unwind from near the end of the prologue (which is implausible here).
However, clang/LLVM might also get checking for mismatches between SEH opcodes and the prolog/epilog ranges (https://reviews.llvm.org/D131394), mainly to guard against inconsistencies in the unwind info generated by the compiler, but that would trigger on this handwritten function too.
---
dlls/wow64/process.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 1d35702bf01..a810d5e5543 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -421,8 +421,7 @@ __ASM_GLOBAL_FUNC( raise_exception, #elif defined(__aarch64__) __ASM_GLOBAL_FUNC( raise_exception, "stp x29, x30, [sp, #-32]!\n\t" - __ASM_SEH(".seh_stackalloc 32\n\t") - __ASM_SEH(".seh_save_fplr 0\n\t") + __ASM_SEH(".seh_save_fplr_x 32\n\t") __ASM_SEH(".seh_endprologue\n\t") __ASM_CFI(".cfi_def_cfa x29, 32\n\t") __ASM_CFI(".cfi_offset x30, -24\n\t")