diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 270a23ad717..175e86168a4 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 8c03357b768..52f00323a02 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 c70b3815473..b9cc3ee46e9 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 734c6b92a5c..79b69cccc57 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; }