Alexandre Julliard wrote:
Index: wine/dlls/ntdll/signal_i386.c diff -u -p wine/dlls/ntdll/signal_i386.c:1.100 wine/dlls/ntdll/signal_i386.c:1.101 --- wine/dlls/ntdll/signal_i386.c 31 Oct 2005 14: 8: 5 -0000 +++ /dev/null 31 Oct 2005 14: 8: 5 -0000 @@ -1384,4 +1384,36 @@ __ASM_GLOBAL_FUNC( DbgBreakPoint, "int $ */ __ASM_GLOBAL_FUNC( DbgUserBreakPoint, "int $3; ret");
+/**********************************************************************
EXC_CallHandler (internal)
- */
+__ASM_GLOBAL_FUNC( EXC_CallHandler, +" pushl %ebp\n" +" movl %esp, %ebp\n" +" subl $12, %esp\n" +" movl 28(%ebp), %eax\n" +" movl 12(%ebp), %edx\n" +" movl %eax, -8(%ebp)\n" +" movl %edx, -4(%ebp)\n" +" leal -12(%ebp), %eax\n" +" .byte 0x64\n" +" movl (0),%ecx\n"
Is it not possible to use the proper %fs prefix instead of having to put a bytecode in manually?
+" movl %ecx,(%eax)\n" +" .byte 0x64\n" +" movl %eax,(0)\n" +" movl 20(%ebp), %eax\n" +" pushl %eax\n"
There is no need to move the variable into %eax before pushing, as "pushl 20(%ebp)" will work as shortens the assembly.
+" movl 16(%ebp), %eax\n" +" pushl %eax\n" +" movl 8(%ebp), %eax\n" +" pushl %edx\n" +" pushl %eax\n" +" call *24(%ebp)\n" +" movl -12(%ebp), %edx\n" +" .byte 0x64\n" +" movl %edx,(0)\n" +" leave\n" +" ret\n" +); #endif /* __i386__ */ Index: wine/dlls/ntdll/exception.c diff -u -p wine/dlls/ntdll/exception.c:1.85 wine/dlls/ntdll/exception.c:1.86 --- wine/dlls/ntdll/exception.c 31 Oct 2005 14: 8: 5 -0000 +++ /dev/null 31 Oct 2005 14: 8: 5 -0000 @@ -116,7 +116,10 @@ static DWORD EXC_UnwindHandler( EXCEPTIO
- happening during the handler execution.
- Please do not change the first 4 parameters order in any way - some exceptions handlers
- rely on Base Pointer (EBP) to have a fixed position related to the exception frame
- For i386 this function is implemented in assembler in signal_i386.c.
It seems bad to split the function's implementation up like this? We also now lose the TRACE's that were previously printed from within EXC_CallHandler. If they are superfluous to requirements we might as well delete them from the generic function too.
*/ +#ifndef __i386__ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher, PEXCEPTION_HANDLER handler, PEXCEPTION_HANDLER nested_handler)