diff --git a/src/coreclr/dlls/mscoree/unixinterface.cpp b/src/coreclr/dlls/mscoree/unixinterface.cpp index f425fb44488ef5..7a5524a939c6de 100644 --- a/src/coreclr/dlls/mscoree/unixinterface.cpp +++ b/src/coreclr/dlls/mscoree/unixinterface.cpp @@ -23,20 +23,20 @@ #define ASSERTE_ALL_BUILDS(expr) _ASSERTE_ALL_BUILDS(__FILE__, (expr)) #ifdef TARGET_UNIX -#define NO_HOSTING_API_FRAME_ADDRESS ((void*)ULONG_PTR_MAX) -void* g_hostingApiFrameAddress = NO_HOSTING_API_FRAME_ADDRESS; +#define NO_HOSTING_API_RETURN_ADDRESS ((void*)ULONG_PTR_MAX) +void* g_hostingApiReturnAddress = NO_HOSTING_API_RETURN_ADDRESS; class HostingApiFrameHolder { public: - HostingApiFrameHolder(void* frameAddress) + HostingApiFrameHolder(void* returnAddress) { - g_hostingApiFrameAddress = frameAddress; + g_hostingApiReturnAddress = returnAddress; } ~HostingApiFrameHolder() { - g_hostingApiFrameAddress = NO_HOSTING_API_FRAME_ADDRESS; + g_hostingApiReturnAddress = NO_HOSTING_API_RETURN_ADDRESS; } }; #endif // TARGET_UNIX @@ -198,6 +198,7 @@ extern "C" int coreclr_create_delegate(void*, unsigned int, const char*, const c // HRESULT indicating status of the operation. S_OK if the assembly was successfully executed // extern "C" +NOINLINE DLLEXPORT int coreclr_initialize( const char* exePath, @@ -217,7 +218,7 @@ int coreclr_initialize( PInvokeOverrideFn* pinvokeOverride = nullptr; #ifdef TARGET_UNIX - HostingApiFrameHolder apiFrameHolder(__builtin_frame_address(0)); + HostingApiFrameHolder apiFrameHolder(_ReturnAddress()); #endif ConvertConfigPropertiesToUnicode( @@ -444,6 +445,7 @@ int coreclr_create_delegate( // HRESULT indicating status of the operation. S_OK if the assembly was successfully executed // extern "C" +NOINLINE DLLEXPORT int coreclr_execute_assembly( void* hostHandle, @@ -460,7 +462,7 @@ int coreclr_execute_assembly( *exitCode = -1; #ifdef TARGET_UNIX - HostingApiFrameHolder apiFrameHolder(__builtin_frame_address(0)); + HostingApiFrameHolder apiFrameHolder(_ReturnAddress()); #endif ICLRRuntimeHost4* host = reinterpret_cast(hostHandle); diff --git a/src/coreclr/vm/exceptionhandling.cpp b/src/coreclr/vm/exceptionhandling.cpp index ec455b5deff2fe..5905a5311d1604 100644 --- a/src/coreclr/vm/exceptionhandling.cpp +++ b/src/coreclr/vm/exceptionhandling.cpp @@ -4518,7 +4518,7 @@ VOID UnwindManagedExceptionPass2(PAL_SEHException& ex, CONTEXT* unwindStartConte EEPOLICY_HANDLE_FATAL_ERROR(COR_E_EXECUTIONENGINE); } -extern void* g_hostingApiFrameAddress; +extern void* g_hostingApiReturnAddress; //--------------------------------------------------------------------------------------- // @@ -4716,7 +4716,7 @@ VOID DECLSPEC_NORETURN UnwindManagedExceptionPass1(PAL_SEHException& ex, CONTEXT STRESS_LOG2(LF_EH, LL_INFO100, "Processing exception at native frame: IP = %p, SP = %p \n", controlPc, sp); // Consider the exception unhandled if the unwinding cannot proceed further or if it went past the coreclr_initialize or coreclr_execute_assembly - if ((controlPc == 0) || (sp > (UINT_PTR)g_hostingApiFrameAddress)) + if ((controlPc == 0) || (controlPc == (UINT_PTR)g_hostingApiReturnAddress)) { if (!GetThread()->HasThreadStateNC(Thread::TSNC_ProcessedUnhandledException)) { diff --git a/src/coreclr/vm/stackwalk.cpp b/src/coreclr/vm/stackwalk.cpp index e61802b9849508..fc4a9642e530b1 100644 --- a/src/coreclr/vm/stackwalk.cpp +++ b/src/coreclr/vm/stackwalk.cpp @@ -697,6 +697,8 @@ PCODE Thread::VirtualUnwindNonLeafCallFrame(T_CONTEXT* pContext, KNONVOLATILE_CO return uControlPc; } +extern void* g_hostingApiReturnAddress; + // static UINT_PTR Thread::VirtualUnwindToFirstManagedCallFrame(T_CONTEXT* pContext) { @@ -739,8 +741,9 @@ UINT_PTR Thread::VirtualUnwindToFirstManagedCallFrame(T_CONTEXT* pContext) uControlPc = GetIP(pContext); - if (uControlPc == 0) + if ((uControlPc == 0) || (uControlPc == (PCODE)g_hostingApiReturnAddress)) { + uControlPc = 0; break; } #endif // !TARGET_UNIX