Commit 98ed5585 authored by Marcus Meissner's avatar Marcus Meissner Committed by Alexandre Julliard

Added assembly implementation of EXC_CallHandler.

parent 3e6f31bf
...@@ -116,7 +116,10 @@ static DWORD EXC_UnwindHandler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RE ...@@ -116,7 +116,10 @@ static DWORD EXC_UnwindHandler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RE
* happening during the handler execution. * happening during the handler execution.
* Please do not change the first 4 parameters order in any way - some exceptions handlers * 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 * 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.
*/ */
#ifndef __i386__
static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame,
CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher, CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher,
PEXCEPTION_HANDLER handler, PEXCEPTION_HANDLER nested_handler) PEXCEPTION_HANDLER handler, PEXCEPTION_HANDLER nested_handler)
...@@ -134,7 +137,12 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_R ...@@ -134,7 +137,12 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_R
__wine_pop_frame( &newframe.frame ); __wine_pop_frame( &newframe.frame );
return ret; return ret;
} }
#else
/* in signal_i386.c */
extern DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame,
CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher,
PEXCEPTION_HANDLER handler, PEXCEPTION_HANDLER nested_handler);
#endif
/********************************************************************** /**********************************************************************
* send_debug_event * send_debug_event
......
...@@ -1384,4 +1384,36 @@ __ASM_GLOBAL_FUNC( DbgBreakPoint, "int $3; ret"); ...@@ -1384,4 +1384,36 @@ __ASM_GLOBAL_FUNC( DbgBreakPoint, "int $3; ret");
*/ */
__ASM_GLOBAL_FUNC( DbgUserBreakPoint, "int $3; ret"); __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"
" movl %ecx,(%eax)\n"
" .byte 0x64\n"
" movl %eax,(0)\n"
" movl 20(%ebp), %eax\n"
" pushl %eax\n"
" 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__ */ #endif /* __i386__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment