Module: wine Branch: master Commit: 8e3b5183cc79b99ac74e2cb3f665f8e46a076495 URL: https://source.winehq.org/git/wine.git/?a=commit;h=8e3b5183cc79b99ac74e2cb3f...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Jul 28 13:00:50 2020 +0200
winebuild: Store the syscall frame in the thread data on i386.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/signal_i386.c | 14 +++++++++++++- tools/winebuild/import.c | 15 +++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index a258c5d8dc..519c1a76d9 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -473,6 +473,17 @@ enum i386_trap_code #endif };
+struct syscall_frame +{ + struct syscall_frame *prev_frame; + DWORD edi; + DWORD esi; + DWORD ebx; + DWORD ebp; + DWORD thunk_addr; + DWORD ret_addr; +}; + struct x86_thread_data { DWORD fs; /* 1d4 TEB selector */ @@ -484,12 +495,13 @@ struct x86_thread_data DWORD dr6; /* 1ec */ DWORD dr7; /* 1f0 */ void *exit_frame; /* 1f4 exit frame pointer */ - /* the ntdll_thread_data structure follows here */ + struct syscall_frame *syscall_frame; /* 1f8 frame pointer on syscall entry */ };
C_ASSERT( sizeof(struct x86_thread_data) <= sizeof(((struct ntdll_thread_data *)0)->cpu_data) ); C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct x86_thread_data, gs ) == 0x1d8 ); C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct x86_thread_data, exit_frame ) == 0x1f4 ); +C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct x86_thread_data, syscall_frame ) == 0x1f8 );
static inline struct x86_thread_data *x86_thread_data(void) { diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 278de20522..cb0b80a6f7 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -1446,10 +1446,14 @@ void output_syscalls( DLLSPEC *spec ) output_cfi( ".cfi_rel_offset %%ebp,0\n" ); output( "\tmovl %%esp,%%ebp\n" ); output_cfi( ".cfi_def_cfa_register %%ebp\n" ); + output( "\tpushl %%ebx\n" ); + output_cfi( ".cfi_rel_offset %%ebx,-4\n" ); output( "\tpushl %%esi\n" ); - output_cfi( ".cfi_rel_offset %%esi,-4\n" ); + output_cfi( ".cfi_rel_offset %%esi,-8\n" ); output( "\tpushl %%edi\n" ); - output_cfi( ".cfi_rel_offset %%edi,-8\n" ); + output_cfi( ".cfi_rel_offset %%edi,-12\n" ); + output( "\tpushl %%fs:0x1f8\n" ); /* x86_thread_data()->syscall_frame */ + output( "\tmovl %%esp,%%fs:0x1f8\n" ); output( "\tcmpl $%u,%%eax\n", count ); output( "\tjae 3f\n" ); if (UsePIC) @@ -1471,11 +1475,14 @@ void output_syscalls( DLLSPEC *spec ) output( "\tcall *.Lsyscall_table-1b(%%eax,%%edx,4)\n" ); else output( "\tcall *.Lsyscall_table(,%%eax,4)\n" ); - output( "\tleal -8(%%ebp),%%esp\n" ); - output( "2:\tpopl %%edi\n" ); + output( "\tleal -16(%%ebp),%%esp\n" ); + output( "2:\tpopl %%fs:0x1f8\n" ); + output( "\tpopl %%edi\n" ); output_cfi( ".cfi_same_value %%edi\n" ); output( "\tpopl %%esi\n" ); output_cfi( ".cfi_same_value %%esi\n" ); + output( "\tpopl %%ebx\n" ); + output_cfi( ".cfi_same_value %%ebx\n" ); output( "\tpopl %%ebp\n" ); output_cfi( ".cfi_def_cfa %%esp,4\n" ); output_cfi( ".cfi_same_value %%ebp\n" );