Alexandre Julliard : ntdll: Always restore the %gs register from the saved value in thread data.

Alexandre Julliard julliard at winehq.org
Tue Jul 8 14:35:28 CDT 2008


Module: wine
Branch: master
Commit: 13fbba6847713cc1a8d43051f998323fee9865af
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=13fbba6847713cc1a8d43051f998323fee9865af

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jul  8 20:54:40 2008 +0200

ntdll: Always restore the %gs register from the saved value in thread data.

---

 dlls/ntdll/signal_i386.c |   25 ++++++-------------------
 1 files changed, 6 insertions(+), 19 deletions(-)

diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 4351844..4e0c5fa 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -582,10 +582,10 @@ typedef void (WINAPI *raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context );
  *           init_handler
  *
  * Handler initialization when the full context is not needed.
+ * Return the stack pointer to use for pushing the exception data.
  */
 static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD *gs )
 {
-    void *stack = (void *)(ESP_sig(sigcontext) & ~3);
     TEB *teb = get_current_teb();
     struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SystemReserved2;
 
@@ -602,8 +602,8 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD *
 #endif
 
     wine_set_fs( thread_data->fs );
+    wine_set_gs( thread_data->gs );
 
-    /* now restore a proper %gs for the fault handler */
     if (!wine_ldt_is_system(CS_sig(sigcontext)) ||
         !wine_ldt_is_system(SS_sig(sigcontext)))  /* 16-bit mode */
     {
@@ -614,24 +614,9 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD *
          * SS is still non-system segment. This is why both CS and SS
          * are checked.
          */
-        wine_set_gs( thread_data->gs );
-        stack = teb->WOW32Reserved;
+        return teb->WOW32Reserved;
     }
-#ifdef __HAVE_VM86
-    else if ((void *)EIP_sig(sigcontext) == vm86_return)  /* vm86 mode */
-    {
-        unsigned int *int_stack = stack;
-        /* fetch the saved %gs from the stack */
-        wine_set_gs( int_stack[0] );
-    }
-#endif
-    else  /* 32-bit mode */
-    {
-#ifdef GS_sig
-        wine_set_gs( GS_sig(sigcontext) );
-#endif
-    }
-    return stack;
+    return (void *)(ESP_sig(sigcontext) & ~3);
 }
 
 
@@ -1553,6 +1538,8 @@ void signal_init_thread(void)
     ss.ss_flags = 0;
     if (sigaltstack(&ss, NULL) == -1) perror( "sigaltstack" );
 #endif  /* HAVE_SIGALTSTACK */
+
+    ntdll_get_thread_data()->gs = wine_get_gs();
 }
 
 /**********************************************************************




More information about the wine-cvs mailing list