Jacek Caban : ntdll: Use syscall frame in x86_64 call_raise_user_exception_dispatcher implementation.

Alexandre Julliard julliard at winehq.org
Wed Feb 24 15:45:41 CST 2021


Module: wine
Branch: master
Commit: 43900dd621cd0564fec3fdd3896fec84f4377e17
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=43900dd621cd0564fec3fdd3896fec84f4377e17

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 24 18:25:49 2021 +0100

ntdll: Use syscall frame in x86_64 call_raise_user_exception_dispatcher implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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;




More information about the wine-cvs mailing list