Author: tkreuzer Date: Tue Jan 25 01:28:41 2011 New Revision: 50482
URL: http://svn.reactos.org/svn/reactos?rev=50482&view=rev Log: [CRT] Implement ms compatible __SEH_prolog
Added: branches/cmake-bringup/lib/sdk/crt/except/i386/seh_prolog.s (with props) Modified: branches/cmake-bringup/lib/sdk/crt/CMakeLists.txt
Modified: branches/cmake-bringup/lib/sdk/crt/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/sdk/crt/CMakeL... ============================================================================== --- branches/cmake-bringup/lib/sdk/crt/CMakeLists.txt [iso-8859-1] (original) +++ branches/cmake-bringup/lib/sdk/crt/CMakeLists.txt [iso-8859-1] Tue Jan 25 01:28:41 2011 @@ -279,15 +279,12 @@ wine/heap.c wine/undname.c)
-if(NOT ARCH MATCHES arm) - list(APPEND CRT_SOURCE - except/${ARCH}/seh.s) -endif() - if(ARCH MATCHES i386) list(APPEND CRT_SOURCE except/i386/chkstk_asm.s except/i386/prolog.s + except/i386/seh.s + except/i386/seh_prolog.s except/i386/unwind.c float/i386/clearfp.c float/i386/cntrlfp.c @@ -298,6 +295,7 @@ elseif(ARCH MATCHES amd64) list(APPEND CRT_SOURCE except/amd64/chkstk_asm.s + except/amd64/seh.s float/i386/clearfp.c float/i386/cntrlfp.c float/i386/fpreset.c @@ -470,15 +468,12 @@ wstring/wcsspn.c wstring/wcsstr.c)
-if(NOT ARCH MATCHES arm) - list(APPEND LIBCNTPR_SOURCE - except/${ARCH}/chkstk_asm.s - except/${ARCH}/seh.s - setjmp/${ARCH}/setjmp.s) -endif() - if(ARCH MATCHES i386) list(APPEND LIBCNTPR_SOURCE + except/i386/chkstk_asm.s + except/i386/seh.s + except/i386/seh_prolog.s + setjmp/i386/setjmp.s math/i386/alldiv_asm.s math/i386/alldvrm_asm.s math/i386/allmul_asm.s @@ -505,6 +500,9 @@ misc/i386/readcr4.S) elseif(ARCH MATCHES amd64) list(APPEND LIBCNTPR_SOURCE + except/amd64/chkstk_asm.s + except/amd64/seh.s + setjmp/amd64/setjmp.s math/cos.c math/sin.c math/amd64/alldiv.S
Added: branches/cmake-bringup/lib/sdk/crt/except/i386/seh_prolog.s URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/sdk/crt/except... ============================================================================== --- branches/cmake-bringup/lib/sdk/crt/except/i386/seh_prolog.s (added) +++ branches/cmake-bringup/lib/sdk/crt/except/i386/seh_prolog.s [iso-8859-1] Tue Jan 25 01:28:41 2011 @@ -1,0 +1,123 @@ +/* + * COPYRIGHT: GNU GPL, see COPYING in the top level directory + * PROJECT: ReactOS CRT + * FILE: lib/crt/misc/i386/seh_prolog.S + * PURPOSE: SEH Support for MSVC + * PROGRAMMERS: Timo Kreuzer + */ + +/* INCLUDES ******************************************************************/ + +#include <asm.inc> + +EXTERN __except_handler3:PROC + +/* The very first thing a function compiled with MSVC containing SEH + * will do is call __SEH_prolog like this: + * + * push <Number of stackbytes> + * push <Address of exception handler> + * call __SEH_prolog + * + * When entering the function the stack layout is like this: + * + * esp + 08: OLDFRAME.StackBytes + * esp + 04: OLDFRAME.SEHTable + * esp + 00: OLDFRAME.ReturnAddress + * + * __SEH_prolog will now setup the stack to the following layout: + * + * esp + N + 24: SEH_FRAME.OriginalEbp OLDFRAME.StackBytes + * esp + N + 20: SEH_FRAME.Disable OLDFRAME.SEHTable + * esp + N + 1C: SEH_FRAME.SEHTable OLDFRAME.ReturnAddress + * esp + N + 18: SEH_FRAME.Handler + * esp + N + 14: SEH_FRAME.PreviousRecord + * esp + N + 10: SEH_FRAME.unused + * esp + N + 0c: SEH_FRAME.NewEsp + * + * N bytes local variables + * ... + * esp + 08: SAFE_AREA.Ebx + * esp + 04: SAFE_AREA.Esi + * esp + 00: SAFE_AREA.Edi + * + * all this is documented here (with some minor errors): + * http://reactos-blog.blogspot.com/2009/08/inside-mind-of-reactos-developer.ht... + */ + +OLDFRAME_ReturnAddress = 0 /* 0x00 */ +OLDFRAME_SEHTable = 4 /* 0x04 */ +OLDFRAME_StackBytes = 8 /* 0x08 */ +OLDFRAME_Size = 12 /* 0x0c */ + +SEH_FRAME_NewEsp = 0 /* 0x00 */ +SEH_FRAME_unused = 4 /* 0x04 */ +SEH_FRAME_PreviousRecord = 8 /* 0x08 */ +SEH_FRAME_Handler = 12 /* 0x0c */ +SEH_FRAME_SEHTable = 16 /* 0x10 */ +SEH_FRAME_Disable = 20 /* 0x14 */ +SEH_FRAME_OriginalEbp = 24 /* 0x18 */ +SEH_FRAME_Size = 28 /* 0x1c */ + +SAFE_AREA_Edi = 0 /* 0x00 */ +SAFE_AREA_Esi = 4 /* 0x04 */ +SAFE_AREA_Ebx = 8 /* 0x08 */ +SAFE_AREA_Size = 12 /* 0x0c */ + + +.code + +PUBLIC __SEH_prolog +__SEH_prolog: + + /* Get the number of stack bytes to reserve */ + mov eax, [esp + OLDFRAME_StackBytes] + + /* Push address of __except_handler3 on the stack */ + push offset __except_handler3 + + /* Push the old exception record on the stack */ + push dword ptr fs:0 + + /* Adjust stack allocation, add size of the stack frame minus 2 pushes */ + add eax, SEH_FRAME_Size + SAFE_AREA_Size - OLDFRAME_Size - 8 + + /* Save old ebp, overwriting OLDFRAME.StackBytes */ + mov [esp + 8 + OLDFRAME_StackBytes], ebp + + /* Load new ebp, pointing to OLDFRAME.StackBytes */ + lea ebp, [esp + 8 + OLDFRAME_StackBytes] + + /* Allocate stack space */ + sub esp, eax + + /* Push the return address on the stack */ + push dword ptr [ebp - OLDFRAME_StackBytes + OLDFRAME_ReturnAddress] + + /* Get address of the SEH table */ + mov eax, [ebp + OLDFRAME_SEHTable] + + /* Save new esp */ + mov [ebp - SEH_FRAME_OriginalEbp + SEH_FRAME_NewEsp], esp + + /* Safe SEH table, overwriting OLDFRAME.ReturnAddress */ + mov [ebp - SEH_FRAME_OriginalEbp + SEH_FRAME_SEHTable], eax + + /* Save registers */ + mov [esp + SAFE_AREA_Edi], edi + mov [esp + SAFE_AREA_Esi], esi + mov [esp + SAFE_AREA_Ebx], ebx + + /* Load the address of the new registration record */ + lea eax, [ebp - SEH_FRAME_OriginalEbp + SEH_FRAME_PreviousRecord] + + /* Safe the disable value, overwriting OLDFRAME.SEHTable */ + mov dword ptr [ebp - SEH_FRAME_OriginalEbp + SEH_FRAME_Disable], -1 + + /* Enqueue the new record */ + mov fs:[0], eax + + /* Return to the caller */ + ret + +END
Propchange: branches/cmake-bringup/lib/sdk/crt/except/i386/seh_prolog.s ------------------------------------------------------------------------------ svn:eol-style = native