void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pException);
VOID DECLSPEC_NORETURN UnwindAndContinueRethrowHelperAfterCatch(Frame* pEntryFrame, Exception* pException);
-#if defined(FEATURE_PAL) && defined(WIN64EXCEPTIONS)
+#ifdef FEATURE_PAL
VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHardwareException);
#define INSTALL_MANAGED_EXCEPTION_DISPATCHER \
UNREACHABLE(); \
}
-#else // FEATURE_PAL && WIN64EXCEPTIONS
+#else // FEATURE_PAL
#define INSTALL_MANAGED_EXCEPTION_DISPATCHER
#define UNINSTALL_MANAGED_EXCEPTION_DISPATCHER
#define INSTALL_UNHANDLED_MANAGED_EXCEPTION_TRAP
#define UNINSTALL_UNHANDLED_MANAGED_EXCEPTION_TRAP
-#endif // FEATURE_PAL && WIN64EXCEPTIONS
+#endif // FEATURE_PAL
#define INSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE \
{ \
// Actually, the handler getting set is properly registered
#endif
+#ifdef FEATURE_PAL
+
+extern VOID SetSEHRecord(PEXCEPTION_REGISTRATION_RECORD record);
+extern VOID ResetSEHRecord(PEXCEPTION_REGISTRATION_RECORD record);
+
+#define INSTALL_SEH_RECORD(record) \
+ SetSEHRecord(record); \
+
+#define UNINSTALL_SEH_RECORD(record) \
+ ResetSEHRecord(record);
+
+#else // FEATURE_PAL
+
+#define INSTALL_SEH_RECORD(record) \
+ { \
+ (record)->Next = (PEXCEPTION_REGISTRATION_RECORD)__readfsdword(0); \
+ __writefsdword(0, (DWORD) (record)); \
+ }
+
+#define UNINSTALL_SEH_RECORD(record) \
+ { \
+ __writefsdword(0, (DWORD) ((record)->Next)); \
+ }
+
+#endif // FEATURE_PAL
+
#define INSTALL_EXCEPTION_HANDLING_RECORD(record) \
{ \
PEXCEPTION_REGISTRATION_RECORD __record = (record); \
_ASSERTE(__record < GetCurrentSEHRecord()); \
- __record->Next = (PEXCEPTION_REGISTRATION_RECORD)__readfsdword(0); \
- __writefsdword(0, (DWORD)__record); \
+ INSTALL_SEH_RECORD(record); \
}
//
{ \
PEXCEPTION_REGISTRATION_RECORD __record = (record); \
_ASSERTE(__record == GetCurrentSEHRecord()); \
- __writefsdword(0, (DWORD)__record->Next); \
+ UNINSTALL_SEH_RECORD(record); \
}
// stackOverwriteBarrier is used to detect overwriting of stack which will mess up handler registration
}
#if !defined(DACCESS_COMPILE)
+#ifdef FEATURE_PAL
+static PEXCEPTION_REGISTRATION_RECORD CurrentSEHRecord = EXCEPTION_CHAIN_END;
+#endif
PEXCEPTION_REGISTRATION_RECORD GetCurrentSEHRecord()
{
WRAPPER_NO_CONTRACT;
+#ifdef FEATURE_PAL
+ LPVOID fs0 = CurrentSEHRecord;
+#else // FEATURE_PAL
LPVOID fs0 = (LPVOID)__readfsdword(0);
#if 0 // This walk is too expensive considering we hit it every time we a CONTRACT(NOTHROW)
pEHR = pEHR->Next;
}
#endif
-#endif
+#endif // 0
+#endif // FEATURE_PAL
return (EXCEPTION_REGISTRATION_RECORD*) fs0;
}
+#ifdef FEATURE_PAL
+VOID SetSEHRecord(PEXCEPTION_REGISTRATION_RECORD record)
+{
+ WRAPPER_NO_CONTRACT;
+ record->Next = CurrentSEHRecord;
+ CurrentSEHRecord = record;
+}
+
+VOID ResetSEHRecord(PEXCEPTION_REGISTRATION_RECORD record)
+{
+ CurrentSEHRecord = record->Next;
+}
+#endif // FEATURE_PAL
+
PEXCEPTION_REGISTRATION_RECORD GetFirstCOMPlusSEHRecord(Thread *pThread) {
WRAPPER_NO_CONTRACT;
#ifndef FEATURE_PAL
return TRUE;
}
+#ifdef FEATURE_PAL
+VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHardwareException)
+{
+ UNREACHABLE();
+}
+#endif
#endif // !DACCESS_COMPILE