Alexandre Julliard : ntdll: Unwind the syscall frame in NtSetContextThread().

Alexandre Julliard julliard at winehq.org
Thu Aug 20 16:03:35 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Aug 20 18:23:24 2020 +0200

ntdll: Unwind the syscall frame in NtSetContextThread().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_arm.c    | 7 ++++++-
 dlls/ntdll/unix/signal_arm64.c  | 2 ++
 dlls/ntdll/unix/signal_i386.c   | 3 +++
 dlls/ntdll/unix/signal_x86_64.c | 4 ++++
 4 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index 270a23ad71..175e86168a 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -461,7 +461,12 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
 
     context_to_server( &server_context, context );
     ret = set_thread_context( handle, &server_context, &self );
-    if (self && ret == STATUS_SUCCESS) set_cpu_context( context );
+    if (self && ret == STATUS_SUCCESS)
+    {
+        struct syscall_frame *frame = arm_thread_data()->syscall_frame;
+        arm_thread_data()->syscall_frame = frame->prev_frame;
+        set_cpu_context( context );
+    }
     return ret;
 }
 
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 8c03357b76..52f00323a0 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -520,6 +520,8 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
     }
     if (self && ret == STATUS_SUCCESS)
     {
+        struct syscall_frame *frame = arm64_thread_data()->syscall_frame;
+        arm64_thread_data()->syscall_frame = frame->prev_frame;
         InterlockedExchangePointer( (void **)&arm64_thread_data()->context, (void *)context );
         raise( SIGUSR2 );
     }
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index c70b381547..b9cc3ee46e 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -870,6 +870,9 @@ static inline void restore_context( const CONTEXT *context, ucontext_t *sigconte
  */
 extern void set_full_cpu_context( const CONTEXT *context );
 __ASM_GLOBAL_FUNC( set_full_cpu_context,
+                   "movl %fs:0x1f8,%eax\n\t"     /* x86_thread_data()->syscall_frame */
+                   "movl (%eax),%eax\n\t"        /* frame->prev_frame */
+                   "movl %eax,%fs:0x1f8\n\t"
                    "movl 4(%esp),%ecx\n\t"
                    "movw 0x8c(%ecx),%gs\n\t"  /* SegGs */
                    "movw 0x90(%ecx),%fs\n\t"  /* SegFs */
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 734c6b92a5..79b69cccc5 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1708,7 +1708,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
         if (!(flags & CONTEXT_CONTROL))
             FIXME( "setting partial context (%x) not supported\n", flags );
         else
+        {
+            struct syscall_frame *frame = amd64_thread_data()->syscall_frame;
+            amd64_thread_data()->syscall_frame = frame->prev_frame;
             set_full_cpu_context( context );
+        }
     }
     return ret;
 }




More information about the wine-cvs mailing list