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