Sync to trunk r38250
[reactos.git] / reactos / include / reactos / libs / pseh / pseh2.h
index 71dca37..378c2a0 100644 (file)
@@ -19,6 +19,9 @@
        FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
        DEALINGS IN THE SOFTWARE.
 */
+#ifdef _M_AMD64
+#include "pseh2_64.h"
+#else
 
 #ifndef KJK_PSEH2_H_
 #define KJK_PSEH2_H_
@@ -46,8 +49,7 @@ typedef struct __SEH2Frame
 {
        _SEH2Registration_t SF_Registration;
        volatile struct __SEH2TryLevel * volatile SF_TopTryLevel;
-       void * volatile SF_FramePointer;
-       void * volatile SF_StackPointer;
+       struct _EXCEPTION_POINTERS * volatile SF_ExceptionInformation;
        volatile unsigned long SF_Code;
 }
 _SEH2Frame_t;
@@ -57,6 +59,8 @@ typedef struct __SEH2TryLevel
        volatile struct __SEH2TryLevel * ST_Next;
        void * ST_Filter;
        void * ST_Body;
+       void * volatile ST_Ebp;
+       void * volatile ST_Esp;
 }
 _SEH2TryLevel_t;
 
@@ -65,7 +69,7 @@ extern "C"
 {
 #endif
 
-extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
+extern __attribute__((returns_twice)) void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
 extern void __cdecl _SEH2LeaveFrame(void);
 extern void __cdecl _SEH2Return(void);
 
@@ -130,29 +134,18 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
 /* GCC doesn't know that this equals zero */
 #define __SEH_VOLATILE_ZERO ({ int zero = 0; __asm__ __volatile__("#" : "+g" (zero)); zero; })
 
-/* GCC believes this is setjmp */
-#define __SEH_PRETEND_SETJMP() (_SEH2PretendSetjmp(), __SEH_VOLATILE_FALSE)
-
 #define __SEH_VOLATILE_FALSE __builtin_expect(__SEH_VOLATILE_ZERO, 0)
 #define __SEH_VOLATILE_TRUE  __builtin_expect(!__SEH_VOLATILE_ZERO, 1)
 
 #define ___SEH_STRINGIFY(X_) # X_
 #define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
 
-static
-__inline__
-__attribute__((returns_twice))
-__attribute__((always_inline))
-void _SEH2PretendSetjmp(void)
-{
-}
-
 #define __SEH_FORCE_NEST \
        __asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
 
-#define __SEH_DECLARE_EXCEPT_PFN(NAME_) int (__cdecl * NAME_)(void *)
-#define __SEH_DECLARE_EXCEPT(NAME_) int __cdecl NAME_(void *)
-#define __SEH_DEFINE_EXCEPT(NAME_) int __cdecl NAME_(void * _SEHExceptionPointers)
+#define __SEH_DECLARE_EXCEPT_PFN(NAME_) int (__cdecl * NAME_)(void)
+#define __SEH_DECLARE_EXCEPT(NAME_) int __cdecl NAME_(void)
+#define __SEH_DEFINE_EXCEPT(NAME_) int __cdecl NAME_(void)
 
 #define __SEH_DECLARE_FINALLY_PFN(NAME_) void (__cdecl * NAME_)(void)
 #define __SEH_DECLARE_FINALLY(NAME_) void __cdecl NAME_(void)
@@ -162,7 +155,6 @@ void _SEH2PretendSetjmp(void)
 #define __SEH_RETURN_FINALLY() return
 
 #define __SEH_BEGIN_TRY \
-       if(!__SEH_PRETEND_SETJMP()) \
        { \
                __label__ _SEHEndTry; \
  \
@@ -196,6 +188,7 @@ void _SEH2PretendSetjmp(void)
                const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
                _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
                volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
+               __attribute__((unused)) int _SEHAbnormalTermination; \
  \
         (void)_SEHTopTryLevel; \
         (void)_SEHCurFrameP; \
@@ -258,9 +251,13 @@ void _SEH2PretendSetjmp(void)
  \
                _SEHTryLevel.ST_Filter = 0; \
                _SEHTryLevel.ST_Body = &_SEHFinally; \
+ \
+               _SEHAbnormalTermination = 1; \
  \
                goto _SEHDoTry; \
                _SEHAfterTry:; \
+ \
+               _SEHAbnormalTermination = 0; \
  \
                if(_SEHTopTryLevel) \
                        _SEH2LeaveFrame(); \
@@ -330,8 +327,8 @@ void _SEH2PretendSetjmp(void)
                ( \
                        "mov %%ebp, %0\n" \
                        "mov %%esp, %1" : \
-                       "=m" (_SEH2FrameP->SF_FramePointer), \
-                       "=m" (_SEH2FrameP->SF_StackPointer) \
+                       "=m" (_SEHTryLevel.ST_Ebp), \
+                       "=m" (_SEHTryLevel.ST_Esp) \
                ); \
  \
                __SEH_BARRIER; \
@@ -366,9 +363,9 @@ void _SEH2PretendSetjmp(void)
        } \
        __SEH_END_SCOPE;
 
-#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
+#define _SEH2_GetExceptionInformation() ((_SEH2FrameP)->SF_ExceptionInformation)
 #define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
-#define _SEH2_AbnormalTermination() (!!_SEH2_GetExceptionCode())
+#define _SEH2_AbnormalTermination() (_SEHAbnormalTermination)
 
 #define _SEH2_YIELD(STMT_) \
        for(;;) \
@@ -403,4 +400,5 @@ __SEH_END_SCOPE_CHAIN;
 
 #endif
 
+#endif
 /* EOF */