Module: wine Branch: refs/heads/master Commit: 4ce433d82630b38d9f6d44c0fb377dbb88f4c16d URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4ce433d82630b38d9f6d44c0...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Jan 20 16:54:11 2006 +0100
ntdll: Move the %gs register to the ntdll_thread_regs structure.
---
dlls/ntdll/ntdll_misc.h | 17 +++++++++-------- dlls/ntdll/signal_i386.c | 2 +- include/thread.h | 9 ++++----- tools/winebuild/relay.c | 9 ++++++--- 4 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 992df1d..7932b50 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -136,14 +136,15 @@ static inline struct ntdll_thread_data * /* thread registers, stored in NtCurrentTeb()->SpareBytes1 */ struct ntdll_thread_regs { - DWORD fs; /* TEB selector */ - DWORD dr0; /* debug registers */ - DWORD dr1; - DWORD dr2; - DWORD dr3; - DWORD dr6; - DWORD dr7; - DWORD spare[3]; /* change this if you add fields! */ + DWORD fs; /* 00 TEB selector */ + DWORD gs; /* 04 libc selector; update winebuild if you move this! */ + DWORD dr0; /* 08 debug registers */ + DWORD dr1; /* 0c */ + DWORD dr2; /* 10 */ + DWORD dr3; /* 14 */ + DWORD dr6; /* 18 */ + DWORD dr7; /* 1c */ + DWORD spare[2]; /* 20 change this if you add fields! */ };
static inline struct ntdll_thread_regs *ntdll_get_thread_regs(void) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 11e9dc9..fcdccfd 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -675,7 +675,7 @@ inline static void *init_handler( const * SS is still non-system segment. This is why both CS and SS * are checked. */ - wine_set_gs( teb->gs_sel ); + wine_set_gs( thread_regs->gs ); stack = teb->WOW32Reserved; } #ifdef __HAVE_VM86 diff --git a/include/thread.h b/include/thread.h index d5f1914..13e87b8 100644 --- a/include/thread.h +++ b/include/thread.h @@ -53,12 +53,11 @@ typedef struct _TEB PVOID SystemReserved2[10]; /* 1d4 */
/* The following are Wine-specific fields (NT: GdiTebBatch) */ - DWORD gs_sel; /* 1fc %gs selector for this thread */ - ULONG_PTR num_async_io; /* 200 number of pending async I/O in the server */ - DWORD dpmi_vif; /* 204 protected mode virtual interrupt flag */ - DWORD vm86_pending; /* 208 data for vm86 mode */ + DWORD num_async_io; /* 1fc number of pending async I/O in the server */ + ULONG_PTR dpmi_vif; /* 200 protected mode virtual interrupt flag */ + DWORD vm86_pending; /* 204 data for vm86 mode */ /* here is plenty space for wine specific fields (don't forget to change pad6!!) */ - DWORD pad6[308]; /* 20c */ + DWORD pad6[309]; /* 208 */
ULONG gdiRgn; /* 6dc */ ULONG gdiPen; /* 6e0 */ diff --git a/tools/winebuild/relay.c b/tools/winebuild/relay.c index 60ed6cc..5dbbe83 100644 --- a/tools/winebuild/relay.c +++ b/tools/winebuild/relay.c @@ -32,6 +32,9 @@
#include "build.h"
+/* fix this if the ntdll_thread_regs structure is changed */ +#define GS_OFFSET 0x1b0 /* STRUCTOFFSET(TEB,SpareBytes1) + STRUCTOFFSET(ntdll_thread_regs,gs) */ + static void function_header( FILE *outfile, const char *name ) { fprintf( outfile, "\n\t.align %d\n", get_alignment(4) ); @@ -150,7 +153,7 @@ static void BuildCallFrom16Core( FILE *o else fprintf( outfile, "\tmovw %s, %%fs\n", asm_name("CallTo16_TebSelector") );
- fprintf( outfile, "\t.byte 0x64\n\tmov (%d),%%gs\n", STRUCTOFFSET(TEB,gs_sel) ); + fprintf( outfile, "\t.byte 0x64\n\tmov (%d),%%gs\n", GS_OFFSET );
/* Translate STACK16FRAME base to flat offset in %edx */ fprintf( outfile, "\tmovw %%ss, %%dx\n" ); @@ -393,7 +396,7 @@ static void BuildCallTo16Core( FILE *out fprintf( outfile, "\tpushl %%ebx\n" ); fprintf( outfile, "\tpushl %%esi\n" ); fprintf( outfile, "\tpushl %%edi\n" ); - fprintf( outfile, "\t.byte 0x64\n\tmov %%gs,(%d)\n", STRUCTOFFSET(TEB,gs_sel) ); + fprintf( outfile, "\t.byte 0x64\n\tmov %%gs,(%d)\n", GS_OFFSET );
/* Setup exception frame */ fprintf( outfile, "\t.byte 0x64\n\tpushl (%d)\n", STACKOFFSET ); @@ -542,7 +545,7 @@ static void BuildRet16Func( FILE *outfil fprintf( outfile, "\t.byte 0x2e\n\tmov %s", asm_name("CallTo16_TebSelector") ); fprintf( outfile, "-%s,%%fs\n", asm_name("__wine_call16_start") );
- fprintf( outfile, "\t.byte 0x64\n\tmov (%d),%%gs\n", STRUCTOFFSET(TEB,gs_sel) ); + fprintf( outfile, "\t.byte 0x64\n\tmov (%d),%%gs\n", GS_OFFSET );
/* Restore the 32-bit stack */