blob: 2b522ca8b03e9887fa846854ebeeff67b3e2a20e [file] [log] [blame]
/*
* Win32 exception assembly functions
*
* Copyright (c) 1996 Onno Hovers, (onno@stack.urc.tue.nl)
*
*/
#if defined(__svr4__) || defined(_SCO_DS)
#define __ELF__ 1
#endif
#ifndef __ELF__
.globl _EXC_CallUnhandledExceptionFilter
_EXC_CallUnhandledExceptionFilter:
#else /* __ELF__ */
.globl EXC_CallUnhandledExceptionFilter
EXC_CallUnhandledExceptionFilter:
#endif /* __ELF__ */
leal 4(%esp),%eax
pushl %eax
#ifndef __ELF__
call *_pTopExcHandler
#else /* __ELF__ */
call *pTopExcHandler
#endif /* __ELF__ */
movl %ebp,%esp
ret
/*******************************************************************
*
* RaiseException (KERNEL32. 418 )
* RtlUnwind (KERNEL32. 443 )
*
* we need to save our context before a call to
*
* -RaiseException
* -RtlUnwind
*
* after these functions we need to restore that context structure as
* the actual context so changes made to the context structure in an
* exception-handler will be reflected in the context after these
* functions return. Fortunately both functions have 4 DWORD params.
* we pass the function to be called as a fifth parameter to ContextCall
*
*/
#define CONTEXT_SegSs -4
#define CONTEXT_Esp -8
#define CONTEXT_EFlags -12
#define CONTEXT_SegCs -16
#define CONTEXT_Eip -20
#define CONTEXT_Ebp -24
#define CONTEXT_Eax -28
#define CONTEXT_Ecx -32
#define CONTEXT_Edx -36
#define CONTEXT_Ebx -40
#define CONTEXT_Esi -44
#define CONTEXT_Edi -48
#define CONTEXT_SegDs -52
#define CONTEXT_SegEs -56
#define CONTEXT_SegFs -60
#define CONTEXT_SegGs -64
#define FLOAT_Cr0NpxState -68
#define FLOAT_RegisterArea -148
#define FLOAT_DataSelector -152
#define FLOAT_DataOffset -156
#define FLOAT_ErrorSelector -160
#define FLOAT_ErrorOffset -164
#define FLOAT_TagWord -168
#define FLOAT_StatusWord -172
#define FLOAT_ControlWord -176
#define CONTEXT_FloatSave -176
#define CONTEXT_Dr7 -180
#define CONTEXT_Dr6 -184
#define CONTEXT_Dr3 -188
#define CONTEXT_Dr2 -192
#define CONTEXT_Dr1 -196
#define CONTEXT_Dr0 -200
#define CONTEXT_ContextFlags -204
#define CONTEXT -204
#define CONTEXTSIZE 204
#define CONTEXTFLAGS 0x10007
#define ORIG_ESP 16 /** cdecl !!! **/
#define PARM_ARG4 28
#define PARM_ARG3 24
#define PARM_ARG2 20
#define PARM_ARG1 16
#define PARM_RETURN 12
#define PARM_CALLFUNC 8
#define PARM_EBP 4
#define PARM_EFLAGS 0
#ifndef __ELF__
.globl _RaiseException
_RaiseException:
push $_EXC_RaiseException
jmp ContextCall
.globl _RtlUnwind
_RtlUnwind:
push $_EXC_RtlUnwind
#else /* __ELF__ */
.globl RaiseException
RaiseException:
push $EXC_RaiseException
jmp ContextCall
.globl RtlUnwind
RtlUnwind:
push $EXC_RtlUnwind
#endif /* __ELF__ */
ContextCall:
pushl %ebp
pushfl
movl %esp, %ebp
subl $CONTEXTSIZE, %esp
movl %eax, CONTEXT_Eax(%ebp)
leal ORIG_ESP(%ebp), %eax
movl %eax, CONTEXT_Esp(%ebp)
movl PARM_EFLAGS(%ebp), %eax
movl %eax, CONTEXT_EFlags(%ebp)
movl PARM_EBP(%ebp), %eax
movl %eax, CONTEXT_Ebp(%ebp)
movl PARM_RETURN(%ebp), %eax
movl %eax, CONTEXT_Eip(%ebp)
movl %edi, CONTEXT_Edi(%ebp)
movl %esi, CONTEXT_Esi(%ebp)
movl %ebx, CONTEXT_Ebx(%ebp)
movl %edx, CONTEXT_Edx(%ebp)
movl %ecx, CONTEXT_Ecx(%ebp)
xorl %eax, %eax
movw %ss, %ax
movl %eax, CONTEXT_SegSs(%ebp)
movw %cs, %ax
movl %eax, CONTEXT_SegCs(%ebp)
movw %gs, %ax
movl %eax, CONTEXT_SegGs(%ebp)
movw %fs, %ax
movl %eax, CONTEXT_SegFs(%ebp)
movw %es, %ax
movl %eax, CONTEXT_SegEs(%ebp)
movw %ds, %ax
movl %eax, CONTEXT_SegDs(%ebp)
fsave CONTEXT_FloatSave(%ebp)
movl $CONTEXTFLAGS, %eax
movl %eax, CONTEXT_ContextFlags(%ebp)
pushl %ebp
leal CONTEXT(%ebp), %eax
pushl %eax
pushl PARM_ARG4(%ebp)
pushl PARM_ARG3(%ebp)
pushl PARM_ARG2(%ebp)
pushl PARM_ARG1(%ebp)
call *PARM_CALLFUNC(%ebp)
addl $20,%esp
popl %ebp
lds CONTEXT_Esp(%ebp),%edi
movl CONTEXT_Eip(%ebp),%eax
movl %eax,-4(%edi)
movl CONTEXT_EFlags(%ebp),%eax
movl %eax,-8(%edi)
movl CONTEXT_Edi(%ebp),%eax
movl %eax,-12(%edi)
movl CONTEXT_SegDs(%ebp),%eax
movw %ax,%ds
movl CONTEXT_SegEs(%ebp),%eax
movw %ax,%es
movl CONTEXT_SegFs(%ebp),%eax
movw %ax,%fs
movl CONTEXT_SegGs(%ebp),%eax
movw %ax,%gs
frstor CONTEXT_FloatSave(%ebp)
movl CONTEXT_Ecx(%ebp),%ecx
movl CONTEXT_Edx(%ebp),%edx
movl CONTEXT_Ebx(%ebp),%ebx
movl CONTEXT_Esi(%ebp),%esi
movl CONTEXT_Eax(%ebp),%eax
movl CONTEXT_Ebp(%ebp),%ebp
lea -12(%edi),%esp
popl %edi
popfl
ret