mirror of
https://github.com/reactos/reactos.git
synced 2024-08-05 02:50:55 +00:00
modified include/reactos/libs/pseh/pseh2.h
If the compiler is not GCC, assume native SEH support modified lib/pseh/framebased-gcchack.c modified lib/pseh/i386/framebased-gcchack.S Allow pseh to be compiled with Visual C++ without warnings svn path=/trunk/; revision=37663
This commit is contained in:
parent
cab11c6e20
commit
58c81ba194
|
@ -23,10 +23,6 @@
|
||||||
#ifndef KJK_PSEH2_H_
|
#ifndef KJK_PSEH2_H_
|
||||||
#define KJK_PSEH2_H_
|
#define KJK_PSEH2_H_
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#error TODO
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _EXCEPTION_RECORD;
|
struct _EXCEPTION_RECORD;
|
||||||
struct _EXCEPTION_POINTERS;
|
struct _EXCEPTION_POINTERS;
|
||||||
struct _CONTEXT;
|
struct _CONTEXT;
|
||||||
|
@ -39,6 +35,47 @@ typedef int (__cdecl * _SEH2FrameHandler_t)
|
||||||
void *
|
void *
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef struct __SEH2Registration
|
||||||
|
{
|
||||||
|
struct __SEH2Registration * SER_Prev;
|
||||||
|
_SEH2FrameHandler_t SER_Handler;
|
||||||
|
}
|
||||||
|
_SEH2Registration_t;
|
||||||
|
|
||||||
|
typedef struct __SEH2Frame
|
||||||
|
{
|
||||||
|
_SEH2Registration_t SF_Registration;
|
||||||
|
volatile struct __SEH2TryLevel * volatile SF_TopTryLevel;
|
||||||
|
void * volatile SF_FramePointer;
|
||||||
|
void * volatile SF_StackPointer;
|
||||||
|
volatile unsigned long SF_Code;
|
||||||
|
}
|
||||||
|
_SEH2Frame_t;
|
||||||
|
|
||||||
|
typedef struct __SEH2TryLevel
|
||||||
|
{
|
||||||
|
volatile struct __SEH2TryLevel * ST_Next;
|
||||||
|
void * ST_FramePointer;
|
||||||
|
void * ST_Filter;
|
||||||
|
void * ST_Body;
|
||||||
|
}
|
||||||
|
_SEH2TryLevel_t;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
|
||||||
|
extern void __cdecl _SEH2LeaveFrame(void);
|
||||||
|
extern void __cdecl _SEH2Return(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
typedef struct __SEHTrampoline
|
typedef struct __SEHTrampoline
|
||||||
{
|
{
|
||||||
|
@ -100,13 +137,6 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
#define __SEH_FALSE __builtin_expect(__SEH_ZERO, 0)
|
#define __SEH_FALSE __builtin_expect(__SEH_ZERO, 0)
|
||||||
#define __SEH_TRUE __builtin_expect(!__SEH_ZERO, 1)
|
#define __SEH_TRUE __builtin_expect(!__SEH_ZERO, 1)
|
||||||
|
|
||||||
typedef struct __SEH2Registration
|
|
||||||
{
|
|
||||||
struct __SEH2Registration * SER_Prev;
|
|
||||||
_SEH2FrameHandler_t SER_Handler;
|
|
||||||
}
|
|
||||||
_SEH2Registration_t;
|
|
||||||
|
|
||||||
#define __SEH_FORCE_NEST \
|
#define __SEH_FORCE_NEST \
|
||||||
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
|
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
|
||||||
|
|
||||||
|
@ -124,25 +154,6 @@ _SEH2Registration_t;
|
||||||
#define __SEH_RETURN_EXCEPT(R_) return (int)(R_)
|
#define __SEH_RETURN_EXCEPT(R_) return (int)(R_)
|
||||||
#define __SEH_RETURN_FINALLY() return
|
#define __SEH_RETURN_FINALLY() return
|
||||||
|
|
||||||
typedef struct __SEH2Frame
|
|
||||||
{
|
|
||||||
_SEH2Registration_t SF_Registration;
|
|
||||||
volatile struct __SEH2TryLevel * volatile SF_TopTryLevel;
|
|
||||||
void * volatile SF_FramePointer;
|
|
||||||
void * volatile SF_StackPointer;
|
|
||||||
volatile unsigned long SF_Code;
|
|
||||||
}
|
|
||||||
_SEH2Frame_t;
|
|
||||||
|
|
||||||
typedef struct __SEH2TryLevel
|
|
||||||
{
|
|
||||||
volatile struct __SEH2TryLevel * ST_Next;
|
|
||||||
void * ST_FramePointer;
|
|
||||||
void * ST_Filter;
|
|
||||||
void * ST_Body;
|
|
||||||
}
|
|
||||||
_SEH2TryLevel_t;
|
|
||||||
|
|
||||||
#define __SEH_BEGIN_TRY \
|
#define __SEH_BEGIN_TRY \
|
||||||
{ \
|
{ \
|
||||||
__label__ _SEHBeginTry; \
|
__label__ _SEHBeginTry; \
|
||||||
|
@ -347,6 +358,7 @@ _SEH2TryLevel_t;
|
||||||
|
|
||||||
#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
|
#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
|
||||||
#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
|
#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
|
||||||
|
#define _SEH2_AbnormalTermination() (!!_SEH2_GetExceptionCode())
|
||||||
|
|
||||||
#define _SEH2_YIELD(STMT_) \
|
#define _SEH2_YIELD(STMT_) \
|
||||||
for(;;) \
|
for(;;) \
|
||||||
|
@ -361,17 +373,22 @@ _SEH2TryLevel_t;
|
||||||
|
|
||||||
__SEH_END_SCOPE_CHAIN;
|
__SEH_END_SCOPE_CHAIN;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#else
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
|
#include <excpt.h>
|
||||||
extern void __cdecl _SEH2LeaveFrame(void);
|
|
||||||
extern void __cdecl _SEH2Return(void);
|
#define _SEH2_TRY __try
|
||||||
|
#define _SEH2_FINALLY __finally
|
||||||
|
#define _SEH2_EXCEPT(E_) __except((E_))
|
||||||
|
#define _SEH2_END
|
||||||
|
|
||||||
|
#define _SEH2_GetExceptionInformation() (GetExceptionInformation())
|
||||||
|
#define _SEH2_GetExceptionCode() (GetExceptionCode())
|
||||||
|
#define _SEH2_AbnormalTermination() (AbnormalTermination())
|
||||||
|
|
||||||
|
#define _SEH2_YIELD(STMT_) STMT_
|
||||||
|
#define _SEH2_LEAVE __leave
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,15 +34,31 @@ extern _SEH2Registration_t * __cdecl _SEH2CurrentRegistration(void);
|
||||||
extern int __SEH2Except(void *, void *, void *);
|
extern int __SEH2Except(void *, void *, void *);
|
||||||
extern void __SEH2Finally(void *, void *);
|
extern void __SEH2Finally(void *, void *);
|
||||||
|
|
||||||
|
extern
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
__attribute__((noreturn))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
__declspec(noreturn)
|
||||||
|
#endif
|
||||||
|
int __SEH2Handle(void *, void *, void *);
|
||||||
|
|
||||||
static
|
static
|
||||||
|
#if defined(__GNUC__)
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
__forceinline
|
||||||
|
#endif
|
||||||
int _SEH2Except(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel, EXCEPTION_POINTERS * ep)
|
int _SEH2Except(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel, EXCEPTION_POINTERS * ep)
|
||||||
{
|
{
|
||||||
return __SEH2Except(trylevel->ST_Filter, trylevel->ST_FramePointer, ep);
|
return __SEH2Except(trylevel->ST_Filter, trylevel->ST_FramePointer, ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
#if defined(__GNUC__)
|
||||||
__attribute__((noinline))
|
__attribute__((noinline))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
__declspec(noinline)
|
||||||
|
#endif
|
||||||
void _SEH2Finally(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel)
|
void _SEH2Finally(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel)
|
||||||
{
|
{
|
||||||
__SEH2Finally(trylevel->ST_Body, trylevel->ST_FramePointer);
|
__SEH2Finally(trylevel->ST_Body, trylevel->ST_FramePointer);
|
||||||
|
@ -65,22 +81,16 @@ void _SEH2LocalUnwind(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * dsttrylev
|
||||||
extern void _SEH2GlobalUnwind(void *);
|
extern void _SEH2GlobalUnwind(void *);
|
||||||
|
|
||||||
static
|
static
|
||||||
|
#if defined(__GNUC__)
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
__declspec(noreturn)
|
||||||
|
#endif
|
||||||
void _SEH2Handle(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel)
|
void _SEH2Handle(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel)
|
||||||
{
|
{
|
||||||
_SEH2GlobalUnwind(frame);
|
_SEH2GlobalUnwind(frame);
|
||||||
_SEH2LocalUnwind(frame, trylevel);
|
_SEH2LocalUnwind(frame, trylevel);
|
||||||
|
__SEH2Handle(trylevel->ST_Body, frame->SF_FramePointer, frame->SF_StackPointer);
|
||||||
__asm__ __volatile__
|
|
||||||
(
|
|
||||||
"mov %[frame], %%ebp\n"
|
|
||||||
"mov %[stack], %%esp\n"
|
|
||||||
"jmp *%[handler]\n" :
|
|
||||||
:
|
|
||||||
[frame] "m" (frame->SF_FramePointer), [stack] "m" (frame->SF_StackPointer), [handler] "r" (trylevel->ST_Body)
|
|
||||||
);
|
|
||||||
|
|
||||||
for(;;);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -94,7 +104,11 @@ int __cdecl _SEH2FrameHandler
|
||||||
{
|
{
|
||||||
_SEH2Frame_t * frame;
|
_SEH2Frame_t * frame;
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
__asm__ __volatile__("cld");
|
__asm__ __volatile__("cld");
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
__asm cld
|
||||||
|
#endif
|
||||||
|
|
||||||
frame = EstablisherFrame;
|
frame = EstablisherFrame;
|
||||||
|
|
||||||
|
@ -133,29 +147,24 @@ int __cdecl _SEH2FrameHandler
|
||||||
return ExceptionContinueSearch;
|
return ExceptionContinueSearch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern
|
||||||
|
void __cdecl __SEH2EnterFrame(_SEH2Frame_t *);
|
||||||
|
|
||||||
extern
|
extern
|
||||||
void __cdecl _SEH2EnterFrame(_SEH2Frame_t * frame)
|
void __cdecl _SEH2EnterFrame(_SEH2Frame_t * frame)
|
||||||
{
|
{
|
||||||
frame->SF_Registration.SER_Handler = _SEH2FrameHandler;
|
frame->SF_Registration.SER_Handler = _SEH2FrameHandler;
|
||||||
frame->SF_Code = 0;
|
frame->SF_Code = 0;
|
||||||
__asm__ __volatile__("movl %%fs:0, %k0\n" : "=q" (frame->SF_Registration.SER_Prev));
|
__SEH2EnterFrame(frame);
|
||||||
|
|
||||||
__SEH_BARRIER;
|
|
||||||
__asm__ __volatile__("movl %k0, %%fs:0\n" : : "q" (&frame->SF_Registration));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern
|
extern
|
||||||
void __cdecl _SEH2LeaveFrame()
|
void __cdecl __SEH2LeaveFrame(void);
|
||||||
|
|
||||||
|
extern
|
||||||
|
void __cdecl _SEH2LeaveFrame(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__
|
__SEH2LeaveFrame();
|
||||||
(
|
|
||||||
"movl %%fs:0, %%edx\n"
|
|
||||||
"movl 0(%%edx), %%edx\n"
|
|
||||||
"movl %%edx, %%fs:0\n" :
|
|
||||||
:
|
|
||||||
:
|
|
||||||
"edx"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern
|
extern
|
||||||
|
|
|
@ -26,6 +26,28 @@ __SEH2CurrentRegistration:
|
||||||
mov eax, [fs:0]
|
mov eax, [fs:0]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.globl ___SEH2EnterFrame
|
||||||
|
___SEH2EnterFrame:
|
||||||
|
mov eax, [esp+4]
|
||||||
|
mov ecx, [fs:0]
|
||||||
|
mov [eax], ecx
|
||||||
|
mov [fs:0], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl __SEH2LeaveFrame
|
||||||
|
__SEH2LeaveFrame:
|
||||||
|
mov eax, [fs:0]
|
||||||
|
mov eax, [eax]
|
||||||
|
mov [fs:0], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl ___SEH2Handle
|
||||||
|
___SEH2Handle:
|
||||||
|
mov eax, [esp+4]
|
||||||
|
mov ebp, [esp+8]
|
||||||
|
mov esp, [esp+12]
|
||||||
|
jmp eax
|
||||||
|
|
||||||
.globl ___SEH2Except
|
.globl ___SEH2Except
|
||||||
___SEH2Except:
|
___SEH2Except:
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
|
|
Loading…
Reference in a new issue