PCODE callsite = GetAdjustedCallAddress(GetLR(pContext));
// Lr must already have been saved before calling so it should not be necessary to restore Lr
-
- pExceptionRecord->ExceptionAddress = (PVOID)callsite;
+ if (pExceptionRecord != NULL)
+ {
+ pExceptionRecord->ExceptionAddress = (PVOID)callsite;
+ }
SetIP(pContext, callsite);
return TRUE;
EXTERN_C void FCallMemcpy_End();
#endif
+#ifdef VSD_STUB_CAN_THROW_AV
+//Return TRUE if pContext->Pc is in VirtualStub
+BOOL IsIPinVirtualStub(PCODE f_IP)
+{
+ LIMITED_METHOD_CONTRACT;
+
+ Thread * pThread = GetThread();
+
+ // We may not have a managed thread object. Example is an AV on the helper thread.
+ // (perhaps during StubManager::IsStub)
+ if (pThread == NULL)
+ {
+ return FALSE;
+ }
+
+ VirtualCallStubManager::StubKind sk;
+ VirtualCallStubManager::FindStubManager(f_IP, &sk, FALSE /* usePredictStubKind */);
+
+ if (sk == VirtualCallStubManager::SK_DISPATCH)
+ {
+ return TRUE;
+ }
+ else if (sk == VirtualCallStubManager::SK_RESOLVE)
+ {
+ return TRUE;
+ }
+
+ else {
+ return FALSE;
+ }
+}
+#endif // VSD_STUB_CAN_THROW_AV
+
// Check if the passed in instruction pointer is in one of the
// JIT helper functions.
bool IsIPInMarkedJitHelper(UINT_PTR uControlPc)
#include <excepcpu.h>
#include "interoputil.h"
+#if defined(_TARGET_ARM_) || defined(_TARGET_X86_)
+#define VSD_STUB_CAN_THROW_AV
+#endif // _TARGET_ARM_ || _TARGET_X86_
+
BOOL IsExceptionFromManagedCode(const EXCEPTION_RECORD * pExceptionRecord);
+#ifdef VSD_STUB_CAN_THROW_AV
+BOOL IsIPinVirtualStub(PCODE f_IP);
+#endif // VSD_STUB_CAN_THROW_AV
bool IsIPInMarkedJitHelper(UINT_PTR uControlPc);
#if defined(FEATURE_HIJACK) && (!defined(_TARGET_X86_) || defined(FEATURE_PAL))
#define USE_CURRENT_CONTEXT_IN_FILTER
#endif // _TARGET_X86_
-#if defined(_TARGET_ARM_) || defined(_TARGET_X86_)
-#define VSD_STUB_CAN_THROW_AV
-#endif // _TARGET_ARM_ || _TARGET_X86_
-
#if defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
// ARM/ARM64 uses Caller-SP to locate PSPSym in the funclet frame.
#define USE_CALLER_SP_IN_FUNCLET
// Check whether we are crossing managed-to-native boundary
while (!ExecutionManager::IsManagedCode(controlPc))
{
+#ifdef VSD_STUB_CAN_THROW_AV
+ if (IsIPinVirtualStub(controlPc))
+ {
+ AdjustContextForVirtualStub(NULL, frameContext);
+ controlPc = GetIP(frameContext);
+ break;
+ }
+#endif // VSD_STUB_CAN_THROW_AV
+
UINT_PTR sp = GetSP(frameContext);
BOOL success = PAL_VirtualUnwind(frameContext, NULL);
GCStress<cfg_instr_ngen>::IsEnabled();
}
-#ifdef VSD_STUB_CAN_THROW_AV
-//Return TRUE if pContext->Pc is in VirtualStub
-static BOOL IsIPinVirtualStub(PCODE f_IP)
-{
- LIMITED_METHOD_CONTRACT;
-
- Thread * pThread = GetThread();
-
- // We may not have a managed thread object. Example is an AV on the helper thread.
- // (perhaps during StubManager::IsStub)
- if (pThread == NULL)
- {
- return FALSE;
- }
-
- VirtualCallStubManager::StubKind sk;
- VirtualCallStubManager::FindStubManager(f_IP, &sk, FALSE /* usePredictStubKind */);
-
- if (sk == VirtualCallStubManager::SK_DISPATCH)
- {
- return TRUE;
- }
- else if (sk == VirtualCallStubManager::SK_RESOLVE)
- {
- return TRUE;
- }
-
- else {
- return FALSE;
- }
-}
-#endif // VSD_STUB_CAN_THROW_AV
-
BOOL IsSafeToHandleHardwareException(PCONTEXT contextRecord, PEXCEPTION_RECORD exceptionRecord)
{
PCODE controlPc = GetIP(contextRecord);
}
PCODE callsite = GetAdjustedCallAddress(*dac_cast<PTR_PCODE>(GetSP(pContext)));
- pExceptionRecord->ExceptionAddress = (PVOID)callsite;
+ if (pExceptionRecord != NULL)
+ {
+ pExceptionRecord->ExceptionAddress = (PVOID)callsite;
+ }
SetIP(pContext, callsite);
#if defined(GCCOVER_TOLERATE_SPURIOUS_AV)
#ifndef FEATURE_PAL
uControlPc = VirtualUnwindCallFrame(pContext);
#else // !FEATURE_PAL
+
+#ifdef VSD_STUB_CAN_THROW_AV
+ if (IsIPinVirtualStub(uControlPc))
+ {
+ AdjustContextForVirtualStub(NULL, pContext);
+ uControlPc = GetIP(pContext);
+ break;
+ }
+#endif // VSD_STUB_CAN_THROW_AV
+
BOOL success = PAL_VirtualUnwind(pContext, NULL);
if (!success)
{