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