From: Jacek Caban Subject: [PATCH 1/3] ntdll: Use syscall frame in x86_64 call_raise_user_exception_dispatcher implementation. Message-Id: <0751ac17-3e99-668a-6566-236f1c5b6b28@codeweavers.com> Date: Tue, 23 Feb 2021 17:54:54 +0100 Signed-off-by: Jacek Caban --- dlls/ntdll/unix/signal_x86_64.c | 18 ++++-------------- dlls/ntdll/unix/unix_private.h | 2 +- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index df83094750e..cd0d0a2c1b0 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2148,20 +2148,10 @@ __ASM_GLOBAL_FUNC( call_user_apc_dispatcher, /*********************************************************************** * call_raise_user_exception_dispatcher */ -__ASM_GLOBAL_FUNC( call_raise_user_exception_dispatcher, - "movq %gs:0x30,%rdx\n\t" - "movq 0x328(%rdx),%rax\n\t" /* amd64_thread_data()->syscall_frame */ - "leaq -0x340(%rax),%r8\n\t" - "andq $~63,%r8\n\t" - "fxrstor64 (%r8)\n\t" - "movq 0x8(%rax),%rbx\n\t" /* frame->rbx */ - "movq 0x20(%rax),%rsi\n\t" /* frame->rsi */ - "movq 0x28(%rax),%rdi\n\t" /* frame->rdi */ - "movq 0x50(%rax),%r12\n\t" /* frame->r12 */ - "movq 0x98(%rax),%rbp\n\t" /* frame->rbp */ - "movq $0,0x328(%rdx)\n\t" - "leaq 0xa8(%rax),%rsp\n\t" - "jmpq *%rcx" ) +void WINAPI call_raise_user_exception_dispatcher( NTSTATUS (WINAPI *dispatcher)(void) ) +{ + amd64_thread_data()->syscall_frame->rip = (UINT64)dispatcher; +} /*********************************************************************** diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index c98b11701e4..cf680218849 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -246,7 +246,7 @@ extern void WINAPI DECLSPEC_NORETURN call_user_apc_dispatcher( CONTEXT *context_ void (WINAPI *dispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) ) DECLSPEC_HIDDEN; extern void WINAPI DECLSPEC_NORETURN call_user_exception_dispatcher( EXCEPTION_RECORD *rec, CONTEXT *context, NTSTATUS (WINAPI *dispatcher)(EXCEPTION_RECORD*,CONTEXT*) ) DECLSPEC_HIDDEN; -extern void WINAPI DECLSPEC_NORETURN call_raise_user_exception_dispatcher( NTSTATUS (WINAPI *dispatcher)(void) ) DECLSPEC_HIDDEN; +extern void WINAPI call_raise_user_exception_dispatcher( NTSTATUS (WINAPI *dispatcher)(void) ) DECLSPEC_HIDDEN; extern void *get_syscall_frame(void) DECLSPEC_HIDDEN; extern void set_syscall_frame(void *frame) DECLSPEC_HIDDEN;