From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52213 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54346 --- dlls/ntdll/unix/signal_x86_64.c | 44 +++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 525fbd03a57..1e4d43fd702 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -403,7 +403,7 @@ struct syscall_frame SYSTEM_SERVICE_TABLE *syscall_table; /* 00a8 */ DWORD syscall_flags; /* 00b0 */ DWORD restore_flags; /* 00b4 */ - DWORD align[2]; /* 00b8 */ + ULONG64 syscall_cfa; /* 00b8 */ XMM_SAVE_AREA32 xsave; /* 00c0 */ DECLSPEC_ALIGN(64) XSTATE xstate; /* 02c0 */ }; @@ -1572,9 +1572,10 @@ __ASM_GLOBAL_FUNC( call_user_mode_callback, "movq %rcx,-0x38(%rbp)\n\t" /* ret_ptr */ "movq %r8,-0x40(%rbp)\n\t" /* ret_len */ "mov 0x10(%rbp),%r11\n\t" /* teb */ - "subq $0x410,%rsp\n\t" /* sizeof(struct syscall_frame) + ebp + exception */ + "subq $0x408,%rsp\n\t" /* sizeof(struct syscall_frame) + exception */ "andq $~63,%rsp\n\t" - "movq %rbp,0x400(%rsp)\n\t" + "leaq 0x10(%rbp),%rax\n\t" + "movq %rax,0xb8(%rsp)\n\t" /* frame->syscall_cfa */ "movq 0x328(%r11),%r10\n\t" /* amd64_thread_data()->syscall_frame */ "movq (%r11),%rax\n\t" /* NtCurrentTeb()->Tib.ExceptionList */ "movq %rax,0x408(%rsp)\n\t" @@ -1608,7 +1609,8 @@ __ASM_GLOBAL_FUNC( user_mode_callback_return, "movq 0x328(%rcx),%r10\n\t" /* amd64_thread_data()->syscall_frame */ "movq 0xa0(%r10),%r11\n\t" /* frame->prev_frame */ "movq %r11,0x328(%rcx)\n\t" /* amd64_thread_data()->syscall_frame = prev_frame */ - "movq 0x400(%r10),%rbp\n\t" /* call_user_mode_callback rbp */ + "movq 0xb8(%r10),%rbp\n\t" /* frame->syscall_cfa */ + "subq $0x10,%rbp\n\t" __ASM_CFI(".cfi_def_cfa_register %rbp\n\t") __ASM_CFI(".cfi_rel_offset %rbx,-0x08\n\t") __ASM_CFI(".cfi_rel_offset %r12,-0x10\n\t") @@ -2439,6 +2441,7 @@ void DECLSPEC_HIDDEN call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, B { struct amd64_thread_data *thread_data = (struct amd64_thread_data *)&teb->GdiTebBatch; struct syscall_frame *frame = thread_data->syscall_frame; + ULONG64 syscall_cfa = frame->syscall_cfa; CONTEXT *ctx, context = { 0 }; I386_CONTEXT *wow_context;
@@ -2512,6 +2515,7 @@ void DECLSPEC_HIDDEN call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, B frame->restore_flags |= CONTEXT_INTEGER; frame->syscall_flags = syscall_flags; frame->syscall_table = KeServiceDescriptorTable; + frame->syscall_cfa = syscall_cfa;
pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); __wine_syscall_dispatcher_return( frame, 0 ); @@ -2522,20 +2526,22 @@ void DECLSPEC_HIDDEN call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, B * signal_start_thread */ __ASM_GLOBAL_FUNC( signal_start_thread, - "subq $56,%rsp\n\t" - __ASM_CFI(".cfi_adjust_cfa_offset 56\n\t") - "movq %rbp,48(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %rbp,48\n\t") - "movq %rbx,40(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %rbx,40\n\t") - "movq %r12,32(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %r12,32\n\t") - "movq %r13,24(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %r13,24\n\t") - "movq %r14,16(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %r14,16\n\t") - "movq %r15,8(%rsp)\n\t" - __ASM_CFI(".cfi_rel_offset %r15,8\n\t") + "subq $0x38,%rsp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 0x38\n\t") + "movq %rbp,0x30(%rsp)\n\t" + __ASM_CFI(".cfi_rel_offset %rbp,0x30\n\t") + "leaq 0x30(%rsp),%rbp\n\t" + __ASM_CFI(".cfi_def_cfa_register %rbp\n\t") + "movq %rbx,-0x08(%rbp)\n\t" + __ASM_CFI(".cfi_rel_offset %rbx,-0x08\n\t") + "movq %r12,-0x10(%rbp)\n\t" + __ASM_CFI(".cfi_rel_offset %r12,-0x10\n\t") + "movq %r13,-0x18(%rbp)\n\t" + __ASM_CFI(".cfi_rel_offset %r13,-0x18\n\t") + "movq %r14,-0x20(%rbp)\n\t" + __ASM_CFI(".cfi_rel_offset %r14,-0x20\n\t") + "movq %r15,-0x28(%rbp)\n\t" + __ASM_CFI(".cfi_rel_offset %r15,-0x28\n\t") /* store exit frame */ "movq %rsp,0x320(%rcx)\n\t" /* amd64_thread_data()->exit_frame */ /* set syscall frame */ @@ -2547,6 +2553,8 @@ __ASM_GLOBAL_FUNC( signal_start_thread, "movq %rax,0x328(%rcx)\n" /* amd64_thread_data()->syscall_frame */ /* switch to kernel stack */ "1:\tmovq %rax,%rsp\n\t" + "leaq 0x10(%rbp),%rax\n\t" + "movq %rax,0xb8(%rsp)\n\t" /* frame->syscall_cfa */ "call " __ASM_NAME("call_init_thunk"))