Module: wine Branch: master Commit: 77fbf3a9fde517ecb4d23e0bc121668206fec2f3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=77fbf3a9fde517ecb4d23e0bc...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Aug 20 18:23:24 2020 +0200
ntdll: Unwind the syscall frame in NtSetContextThread().
Signed-off-by: Alexandre Julliard julliard@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; }