summaryrefslogtreecommitdiff
path: root/src/vm/arm/exceparm.cpp
diff options
context:
space:
mode:
authorchunseoklee <chunseoklee@naver.com>2016-06-24 21:56:55 +0900
committerJan Kotas <jkotas@microsoft.com>2016-06-24 05:56:55 -0700
commit27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5 (patch)
treebd93f1f84215299a6ca041c3cc7e6b63c61c277d /src/vm/arm/exceparm.cpp
parent99c0410601955552920079a7465c64e725814c2c (diff)
downloadcoreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.tar.gz
coreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.tar.bz2
coreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.zip
Fix Issue #5542 (#5827)
On arm32, NullReference exception for interface call is not handled properly. Especially, when callsite is a virtualstub(dispatch/resolve), AV exception occurs on indirect cell. Since this stub is not a part of managed or markedjithelper, exception handler considers this is a native seg fault. I added : (1) FaultingExceptionFrame construction routine for virtualstub (2) Checking and IP-adjusting routine for VirtualStub
Diffstat (limited to 'src/vm/arm/exceparm.cpp')
-rw-r--r--src/vm/arm/exceparm.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/vm/arm/exceparm.cpp b/src/vm/arm/exceparm.cpp
index 9b14d41c83..6852adcc33 100644
--- a/src/vm/arm/exceparm.cpp
+++ b/src/vm/arm/exceparm.cpp
@@ -54,6 +54,38 @@ FaultingExceptionFrame *GetFrameFromRedirectedStubStackFrame (T_DISPATCHER_CONTE
return (FaultingExceptionFrame*)((TADDR)pDispatcherContext->ContextRecord->R4);
}
+//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);
+
+ if (sk == VirtualCallStubManager::SK_DISPATCH)
+ {
+ return TRUE;
+ }
+ else if (sk == VirtualCallStubManager::SK_RESOLVE)
+ {
+ return TRUE;
+ }
+
+ else {
+ return FALSE;
+ }
+}
+
+
// Returns TRUE if caller should resume execution.
BOOL
AdjustContextForVirtualStub(