mirror of
https://github.com/reactos/reactos.git
synced 2025-07-24 07:14:04 +00:00
[SHELL-EXPERIMENTS]
* Sync up to trunk head (r64124). svn path=/branches/shell-experiments/; revision=64126
This commit is contained in:
commit
18a81d5d1e
480 changed files with 54949 additions and 9004 deletions
31
lib/pseh/arm/seh_prolog.s
Normal file
31
lib/pseh/arm/seh_prolog.s
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* COPYRIGHT: GNU GPL, see COPYING in the top level directory
|
||||
* PROJECT: ReactOS CRT
|
||||
* FILE: lib/pseh/arm/seh_prolog.S
|
||||
* PURPOSE: SEH Support for MSVC / ARM
|
||||
* PROGRAMMERS: Timo Kreuzer
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include "ksarm.h"
|
||||
|
||||
TEXTAREA
|
||||
|
||||
IMPORT __except_handler
|
||||
|
||||
LEAF_ENTRY _SEH_prolog
|
||||
|
||||
|
||||
LEAF_END _SEH_prolog
|
||||
|
||||
|
||||
|
||||
LEAF_ENTRY _SEH_epilog
|
||||
|
||||
|
||||
LEAF_END _SEH_epilog
|
||||
|
||||
|
||||
|
||||
END
|
|
@ -45,8 +45,18 @@ C_ASSERT(SEH3_REGISTRATION_FRAME_Handler == FIELD_OFFSET(SEH3$_REGISTRATION_FRAM
|
|||
C_ASSERT(SEH3_REGISTRATION_FRAME_EndOfChain == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, EndOfChain));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_ScopeTable == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, ScopeTable));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_ExceptionPointers == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, ExceptionPointers));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_ExceptionCode == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, ExceptionCode));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_Esp == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, Esp));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_Ebp == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, Ebp));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_AllocaFrame == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, AllocaFrame));
|
||||
#ifdef _SEH3$_FRAME_ALL_NONVOLATILES
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_Ebx == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, Ebx));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_Esi == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, Esi));
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_Edi == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, Edi));
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
C_ASSERT(SEH3_REGISTRATION_FRAME_ReturnAddress == FIELD_OFFSET(SEH3$_REGISTRATION_FRAME, ReturnAddress));
|
||||
#endif
|
||||
C_ASSERT(SEH3_SCOPE_TABLE_Filter == FIELD_OFFSET(SEH3$_SCOPE_TABLE, Filter));
|
||||
C_ASSERT(SEH3_SCOPE_TABLE_Target == FIELD_OFFSET(SEH3$_SCOPE_TABLE, Target));
|
||||
|
||||
|
@ -64,7 +74,7 @@ _SEH3$_Unregister(
|
|||
static inline
|
||||
LONG
|
||||
_SEH3$_InvokeNestedFunctionFilter(
|
||||
PSEH3$_REGISTRATION_FRAME RegistrationFrame,
|
||||
volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame,
|
||||
PVOID Filter)
|
||||
{
|
||||
LONG FilterResult;
|
||||
|
@ -93,17 +103,17 @@ _SEH3$_InvokeNestedFunctionFilter(
|
|||
long
|
||||
__attribute__((regparm(1)))
|
||||
_SEH3$_InvokeEmbeddedFilter(
|
||||
PSEH3$_REGISTRATION_FRAME RegistrationFrame);
|
||||
volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame);
|
||||
|
||||
long
|
||||
__attribute__((regparm(1)))
|
||||
_SEH3$_InvokeEmbeddedFilterFromRegistration(
|
||||
PSEH3$_REGISTRATION_FRAME RegistrationFrame);
|
||||
volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame);
|
||||
|
||||
static inline
|
||||
LONG
|
||||
_SEH3$_InvokeFilter(
|
||||
PSEH3$_REGISTRATION_FRAME RegistrationFrame,
|
||||
volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame,
|
||||
PVOID Filter)
|
||||
{
|
||||
LONG FilterResult;
|
||||
|
@ -133,7 +143,7 @@ _SEH3$_InvokeFilter(
|
|||
void
|
||||
__attribute__((regparm(1)))
|
||||
_SEH3$_AutoCleanup(
|
||||
SEH3$_REGISTRATION_FRAME *Frame)
|
||||
volatile SEH3$_REGISTRATION_FRAME *Frame)
|
||||
{
|
||||
/* Check for __finally frames */
|
||||
if (Frame->ScopeTable->Target == NULL)
|
||||
|
@ -197,8 +207,8 @@ _SEH3$_JumpToTarget(
|
|||
{
|
||||
asm volatile (
|
||||
/* Load the registers */
|
||||
"movl 20(%%ecx), %%esp\n\t"
|
||||
"movl 24(%%ecx), %%ebp\n\t"
|
||||
"movl 24(%%ecx), %%esp\n\t"
|
||||
"movl 28(%%ecx), %%ebp\n\t"
|
||||
|
||||
/* Stack pointer is 4 off from the call to __SEH3$_RegisterFrame */
|
||||
"addl $4, %%esp\n\t"
|
||||
|
@ -215,8 +225,8 @@ _SEH3$_JumpToTarget(
|
|||
{
|
||||
asm volatile (
|
||||
/* Load the registers */
|
||||
"movl 20(%%ecx), %%esp\n\t"
|
||||
"movl 24(%%ecx), %%ebp\n\t"
|
||||
"movl 24(%%ecx), %%esp\n\t"
|
||||
"movl 28(%%ecx), %%ebp\n\t"
|
||||
|
||||
/* Stack pointer is 4 off from the call to __SEH3$_RegisterFrame */
|
||||
"addl $4, %%esp\n\t"
|
||||
|
@ -241,7 +251,9 @@ _SEH3$_CallRtlUnwind(
|
|||
|
||||
EXCEPTION_DISPOSITION
|
||||
__cdecl
|
||||
#ifndef __clang__
|
||||
__attribute__ ((__target__ ("cld")))
|
||||
#endif
|
||||
_SEH3$_except_handler(
|
||||
struct _EXCEPTION_RECORD * ExceptionRecord,
|
||||
PSEH3$_REGISTRATION_FRAME EstablisherFrame,
|
||||
|
@ -274,8 +286,9 @@ _SEH3$_except_handler(
|
|||
/* Check if we have an exception handler */
|
||||
if (CurrentFrame->ScopeTable->Target != NULL)
|
||||
{
|
||||
/* Set exception pointers for this frame */
|
||||
/* Set exception pointers and code for this frame */
|
||||
CurrentFrame->ExceptionPointers = &ExceptionPointers;
|
||||
CurrentFrame->ExceptionCode = ExceptionRecord->ExceptionCode;
|
||||
|
||||
/* Get the filter result */
|
||||
FilterResult = _SEH3$_GetFilterResult(CurrentFrame);
|
||||
|
@ -316,8 +329,9 @@ _SEH3$_except_handler(
|
|||
/* Check if this is an unwind frame */
|
||||
if (CurrentFrame->ScopeTable->Target == NULL)
|
||||
{
|
||||
/* Set exception pointers for this frame */
|
||||
/* Set exception pointers and code for this frame */
|
||||
CurrentFrame->ExceptionPointers = &ExceptionPointers;
|
||||
CurrentFrame->ExceptionCode = ExceptionRecord->ExceptionCode;
|
||||
|
||||
/* Call the finally function */
|
||||
_SEH3$_CallFinally(CurrentFrame);
|
||||
|
|
|
@ -5,12 +5,14 @@
|
|||
#define SEH3_REGISTRATION_FRAME_EndOfChain 8
|
||||
#define SEH3_REGISTRATION_FRAME_ScopeTable 12
|
||||
#define SEH3_REGISTRATION_FRAME_ExceptionPointers 16
|
||||
#define SEH3_REGISTRATION_FRAME_Esp 20
|
||||
#define SEH3_REGISTRATION_FRAME_Ebp 24
|
||||
#define SEH3_REGISTRATION_FRAME_AllocaFrame 28
|
||||
#define SEH3_REGISTRATION_FRAME_Ebx 32
|
||||
#define SEH3_REGISTRATION_FRAME_Esi 36
|
||||
#define SEH3_REGISTRATION_FRAME_Edi 40
|
||||
#define SEH3_REGISTRATION_FRAME_ExceptionCode 20
|
||||
#define SEH3_REGISTRATION_FRAME_Esp 24
|
||||
#define SEH3_REGISTRATION_FRAME_Ebp 28
|
||||
#define SEH3_REGISTRATION_FRAME_AllocaFrame 32
|
||||
#define SEH3_REGISTRATION_FRAME_Ebx 36
|
||||
#define SEH3_REGISTRATION_FRAME_Esi 40
|
||||
#define SEH3_REGISTRATION_FRAME_Edi 44
|
||||
#define SEH3_REGISTRATION_FRAME_ReturnAddress 48
|
||||
|
||||
#define SEH3_SCOPE_TABLE_Target 0
|
||||
#define SEH3_SCOPE_TABLE_Filter 4
|
||||
|
|
|
@ -30,6 +30,10 @@ __SEH3$_RegisterFrameWithNonVolatiles:
|
|||
mov [eax + SEH3_REGISTRATION_FRAME_Esi], esi
|
||||
mov [eax + SEH3_REGISTRATION_FRAME_Edi], edi
|
||||
|
||||
/* Safe the return address */
|
||||
mov ebx, [esp]
|
||||
mov [eax + SEH3_REGISTRATION_FRAME_ReturnAddress], ebx
|
||||
|
||||
.global __SEH3$_RegisterFrameWithStackLayout
|
||||
__SEH3$_RegisterFrameWithStackLayout:
|
||||
|
||||
|
@ -79,6 +83,10 @@ __SEH3$_RegisterTryLevelWithNonVolatiles:
|
|||
mov [eax + SEH3_REGISTRATION_FRAME_Esi], esi
|
||||
mov [eax + SEH3_REGISTRATION_FRAME_Edi], edi
|
||||
|
||||
/* Safe the return address */
|
||||
mov ebx, [esp]
|
||||
mov [eax + SEH3_REGISTRATION_FRAME_ReturnAddress], ebx
|
||||
|
||||
.global __SEH3$_RegisterTryLevelWithStackLayout
|
||||
__SEH3$_RegisterTryLevelWithStackLayout:
|
||||
|
||||
|
@ -128,20 +136,26 @@ __SEH3$_InvokeEmbeddedFilterFromRegistration:
|
|||
mov edi, [eax + SEH3_REGISTRATION_FRAME_Edi]
|
||||
mov ebp, [eax + SEH3_REGISTRATION_FRAME_Ebp]
|
||||
|
||||
/* Get the saved stack pointer */
|
||||
mov edx, [eax + SEH3_REGISTRATION_FRAME_Esp]
|
||||
/* Calculate the size of the temp stack frame region */
|
||||
mov ecx, [eax + SEH3_REGISTRATION_FRAME_AllocaFrame]
|
||||
sub ecx, [eax + SEH3_REGISTRATION_FRAME_Esp]
|
||||
|
||||
/* Put the return address on the stack */
|
||||
push offset __SEH3$_InvokeEmbeddedFilterReturn
|
||||
|
||||
/* Save the current stack pointer in the AllocaFrame member */
|
||||
mov [eax + SEH3_REGISTRATION_FRAME_AllocaFrame], esp
|
||||
|
||||
/* Allocate enough temp stack space on the stack */
|
||||
sub esp, ecx
|
||||
|
||||
/* Get the return address that was saved when registering the frame */
|
||||
mov edx, [eax + SEH3_REGISTRATION_FRAME_ReturnAddress]
|
||||
|
||||
/* Jump into the filter or finally function */
|
||||
xor eax, eax
|
||||
inc eax
|
||||
call [edx]
|
||||
|
||||
/* Restore the current non-volatiles */
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
pop ebp
|
||||
|
||||
ret
|
||||
jmp edx
|
||||
|
||||
|
||||
.global __SEH3$_InvokeEmbeddedFilter
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue