Alexandre Julliard : ntdll: Always set the thread context through NtSetContextThread().

Alexandre Julliard julliard at winehq.org
Thu Jun 25 16:14:24 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun 25 10:33:31 2020 +0200

ntdll: Always set the thread context through NtSetContextThread().

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

---

 dlls/ntdll/signal_arm.c    |  21 ---------
 dlls/ntdll/signal_arm64.c  |  28 +-----------
 dlls/ntdll/signal_x86_64.c | 106 +--------------------------------------------
 3 files changed, 2 insertions(+), 153 deletions(-)

diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index adac496525..77c6676cce 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -85,27 +85,6 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 4,
                     )
 
 
-/***********************************************************************
- *           set_cpu_context
- *
- * Set the new CPU context.
- */
-void DECLSPEC_HIDDEN set_cpu_context( const CONTEXT *context );
-__ASM_GLOBAL_FUNC( set_cpu_context,
-                   ".arm\n\t"
-                   "ldr r2, [r0, #0x44]\n\t"  /* context->Cpsr */
-                   "tst r2, #0x20\n\t"        /* thumb? */
-                   "ldr r1, [r0, #0x40]\n\t"  /* context->Pc */
-                   "orrne r1, r1, #1\n\t"     /* Adjust PC according to thumb */
-                   "biceq r1, r1, #1\n\t"     /* Adjust PC according to arm */
-                   "msr CPSR_f, r2\n\t"
-                   "ldr lr, [r0, #0x3c]\n\t"  /* context->Lr */
-                   "ldr sp, [r0, #0x38]\n\t"  /* context->Sp */
-                   "push {r1}\n\t"
-                   "ldmib r0, {r0-r12}\n\t"   /* context->R0..R12 */
-                   "pop {pc}" )
-
-
 /**********************************************************************
  *           call_stack_handlers
  *
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index f396504ae6..798ebe3013 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -68,20 +68,6 @@ struct MSVCRT_JUMP_BUFFER
     double D[8];
 };
 
-struct arm64_thread_data
-{
-    void     *exit_frame;    /* exit frame pointer */
-    CONTEXT  *context;       /* context to set with SIGUSR2 */
-};
-
-C_ASSERT( sizeof(struct arm64_thread_data) <= sizeof(((TEB *)0)->SystemReserved2) );
-C_ASSERT( offsetof( TEB, SystemReserved2 ) + offsetof( struct arm64_thread_data, exit_frame ) == 0x300 );
-
-static inline struct arm64_thread_data *arm64_thread_data(void)
-{
-    return (struct arm64_thread_data *)NtCurrentTeb()->SystemReserved2;
-}
-
 
 /*******************************************************************
  *         is_valid_frame
@@ -122,18 +108,6 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 8,
                     "str w1, [x0, #0x4]\n\t"         /* context->Cpsr */
                     "ret" )
 
-/***********************************************************************
- *           set_cpu_context
- *
- * Set the new CPU context.
- */
-static void set_cpu_context( const CONTEXT *context )
-{
-    InterlockedExchangePointer( (void **)&arm64_thread_data()->context, (void *)context );
-    raise( SIGUSR2 );
-}
-
-
 
 /**********************************************************************
  *           virtual_unwind
@@ -1039,7 +1013,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
     }
 
     TRACE( "returning to %lx stack %lx\n", context->Pc, context->Sp );
-    set_cpu_context( context );
+    NtSetContextThread( GetCurrentThread(), context );
 }
 
 /*******************************************************************
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 1f97fbcedb..ec1c0f2d0b 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -222,25 +222,6 @@ struct MSVCRT_JUMP_BUFFER
 #error You must define the signal context functions for your platform
 #endif
 
-struct amd64_thread_data
-{
-    DWORD_PTR dr0;           /* debug registers */
-    DWORD_PTR dr1;
-    DWORD_PTR dr2;
-    DWORD_PTR dr3;
-    DWORD_PTR dr6;
-    DWORD_PTR dr7;
-    void     *exit_frame;    /* exit frame pointer */
-};
-
-C_ASSERT( sizeof(struct amd64_thread_data) <= sizeof(((TEB *)0)->SystemReserved2) );
-C_ASSERT( offsetof( TEB, SystemReserved2 ) + offsetof( struct amd64_thread_data, exit_frame ) == 0x330 );
-
-static inline struct amd64_thread_data *amd64_thread_data(void)
-{
-    return (struct amd64_thread_data *)NtCurrentTeb()->SystemReserved2;
-}
-
 
 /***********************************************************************
  * Definitions for Win32 unwind tables
@@ -525,91 +506,6 @@ __ASM_GLOBAL_FUNC( RtlCaptureContext,
                    "movdqa %xmm15,0x290(%rcx)\n\t"  /* context->Xmm15 */
                    "ret" );
 
-/***********************************************************************
- *           set_full_cpu_context
- *
- * Set the new CPU context.
- */
-extern void set_full_cpu_context( const CONTEXT *context );
-__ASM_GLOBAL_FUNC( set_full_cpu_context,
-                   "subq $40,%rsp\n\t"
-                   __ASM_SEH(".seh_stackalloc 0x40\n\t")
-                   __ASM_SEH(".seh_endprologue\n\t")
-                   __ASM_CFI(".cfi_adjust_cfa_offset 40\n\t")
-                   "ldmxcsr 0x34(%rdi)\n\t"         /* context->MxCsr */
-                   "movw 0x38(%rdi),%ax\n\t"        /* context->SegCs */
-                   "movq %rax,8(%rsp)\n\t"
-                   "movw 0x42(%rdi),%ax\n\t"        /* context->SegSs */
-                   "movq %rax,32(%rsp)\n\t"
-                   "movq 0x44(%rdi),%rax\n\t"       /* context->Eflags */
-                   "movq %rax,16(%rsp)\n\t"
-                   "movq 0x80(%rdi),%rcx\n\t"       /* context->Rcx */
-                   "movq 0x88(%rdi),%rdx\n\t"       /* context->Rdx */
-                   "movq 0x90(%rdi),%rbx\n\t"       /* context->Rbx */
-                   "movq 0x98(%rdi),%rax\n\t"       /* context->Rsp */
-                   "movq %rax,24(%rsp)\n\t"
-                   "movq 0xa0(%rdi),%rbp\n\t"       /* context->Rbp */
-                   "movq 0xa8(%rdi),%rsi\n\t"       /* context->Rsi */
-                   "movq 0xb8(%rdi),%r8\n\t"        /* context->R8 */
-                   "movq 0xc0(%rdi),%r9\n\t"        /* context->R9 */
-                   "movq 0xc8(%rdi),%r10\n\t"       /* context->R10 */
-                   "movq 0xd0(%rdi),%r11\n\t"       /* context->R11 */
-                   "movq 0xd8(%rdi),%r12\n\t"       /* context->R12 */
-                   "movq 0xe0(%rdi),%r13\n\t"       /* context->R13 */
-                   "movq 0xe8(%rdi),%r14\n\t"       /* context->R14 */
-                   "movq 0xf0(%rdi),%r15\n\t"       /* context->R15 */
-                   "movq 0xf8(%rdi),%rax\n\t"       /* context->Rip */
-                   "movq %rax,(%rsp)\n\t"
-                   "fxrstor 0x100(%rdi)\n\t"        /* context->FtlSave */
-                   "movdqa 0x1a0(%rdi),%xmm0\n\t"   /* context->Xmm0 */
-                   "movdqa 0x1b0(%rdi),%xmm1\n\t"   /* context->Xmm1 */
-                   "movdqa 0x1c0(%rdi),%xmm2\n\t"   /* context->Xmm2 */
-                   "movdqa 0x1d0(%rdi),%xmm3\n\t"   /* context->Xmm3 */
-                   "movdqa 0x1e0(%rdi),%xmm4\n\t"   /* context->Xmm4 */
-                   "movdqa 0x1f0(%rdi),%xmm5\n\t"   /* context->Xmm5 */
-                   "movdqa 0x200(%rdi),%xmm6\n\t"   /* context->Xmm6 */
-                   "movdqa 0x210(%rdi),%xmm7\n\t"   /* context->Xmm7 */
-                   "movdqa 0x220(%rdi),%xmm8\n\t"   /* context->Xmm8 */
-                   "movdqa 0x230(%rdi),%xmm9\n\t"   /* context->Xmm9 */
-                   "movdqa 0x240(%rdi),%xmm10\n\t"  /* context->Xmm10 */
-                   "movdqa 0x250(%rdi),%xmm11\n\t"  /* context->Xmm11 */
-                   "movdqa 0x260(%rdi),%xmm12\n\t"  /* context->Xmm12 */
-                   "movdqa 0x270(%rdi),%xmm13\n\t"  /* context->Xmm13 */
-                   "movdqa 0x280(%rdi),%xmm14\n\t"  /* context->Xmm14 */
-                   "movdqa 0x290(%rdi),%xmm15\n\t"  /* context->Xmm15 */
-                   "movq 0x78(%rdi),%rax\n\t"       /* context->Rax */
-                   "movq 0xb0(%rdi),%rdi\n\t"       /* context->Rdi */
-                   "iretq" );
-
-
-/***********************************************************************
- *           set_cpu_context
- *
- * Set the new CPU context. Used by NtSetContextThread.
- */
-void DECLSPEC_HIDDEN set_cpu_context( const CONTEXT *context )
-{
-    DWORD flags = context->ContextFlags & ~CONTEXT_AMD64;
-
-    if (flags & CONTEXT_DEBUG_REGISTERS)
-    {
-        amd64_thread_data()->dr0 = context->Dr0;
-        amd64_thread_data()->dr1 = context->Dr1;
-        amd64_thread_data()->dr2 = context->Dr2;
-        amd64_thread_data()->dr3 = context->Dr3;
-        amd64_thread_data()->dr6 = context->Dr6;
-        amd64_thread_data()->dr7 = context->Dr7;
-    }
-    if (flags & CONTEXT_FULL)
-    {
-        if (!(flags & CONTEXT_CONTROL))
-            FIXME( "setting partial context (%x) not supported\n", flags );
-        else
-            set_full_cpu_context( context );
-    }
-}
-
-
 /******************************************************************************
  *              RtlWow64GetThreadContext  (NTDLL.@)
  */
@@ -1320,7 +1216,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
     }
 
     TRACE( "returning to %lx stack %lx\n", context->Rip, context->Rsp );
-    set_cpu_context( context );
+    NtSetContextThread( GetCurrentThread(), context );
 }
 
 




More information about the wine-cvs mailing list