wine/dlls/ntdll signal_i386.c exception.c

Robert Shearman rob at codeweavers.com
Mon Oct 31 11:00:30 CST 2005


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)
>  
>


-- 
Rob Shearman




More information about the wine-devel mailing list