ntdll: Unwind the syscall frame in NtSetContextThread().
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a686759f1d
commit
77fbf3a9fd
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -1708,8 +1708,12 @@ 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue