summaryrefslogtreecommitdiff
path: root/src/vm/eetwain.cpp
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-04-13 07:09:33 +0900
committerJan Vorlicek <janvorli@microsoft.com>2017-04-13 00:09:33 +0200
commit03d0d244bca38053d54eef6f4b6db51ae87f7700 (patch)
tree3f7062cd229b5b76d33b277885b25eb19b3f3b4f /src/vm/eetwain.cpp
parentcebfa42d658e9ab39f189aeb01baeb266ed1190a (diff)
downloadcoreclr-03d0d244bca38053d54eef6f4b6db51ae87f7700.tar.gz
coreclr-03d0d244bca38053d54eef6f4b6db51ae87f7700.tar.bz2
coreclr-03d0d244bca38053d54eef6f4b6db51ae87f7700.zip
[x86/Linux] Fix ResumeEsp before resume (#10749)
* [x86/Linux] Correctly unwind FCALL frames * Fix Up ResumeEsp inside ProcessCLRException * Fix Context Before PC Update
Diffstat (limited to 'src/vm/eetwain.cpp')
-rw-r--r--src/vm/eetwain.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/vm/eetwain.cpp b/src/vm/eetwain.cpp
index 2c9059bca1..2886daa8f6 100644
--- a/src/vm/eetwain.cpp
+++ b/src/vm/eetwain.cpp
@@ -4048,6 +4048,54 @@ bool UnwindStackFrame(PREGDISPLAY pContext,
#endif // _TARGET_X86_
+#ifdef WIN64EXCEPTIONS
+#ifdef _TARGET_X86_
+size_t EECodeManager::GetResumeSp( PCONTEXT pContext )
+{
+ PCODE currentPc = PCODE(pContext->Eip);
+
+ _ASSERTE(ExecutionManager::IsManagedCode(currentPc));
+
+ EECodeInfo codeInfo(currentPc);
+
+ PTR_CBYTE methodStart = PTR_CBYTE(codeInfo.GetSavedMethodCode());
+
+ GCInfoToken gcInfoToken = codeInfo.GetGCInfoToken();
+ PTR_VOID methodInfoPtr = gcInfoToken.Info;
+ DWORD curOffs = codeInfo.GetRelOffset();
+
+ CodeManStateBuf stateBuf;
+
+ stateBuf.hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken,
+ curOffs,
+ &stateBuf.hdrInfoBody);
+
+ PTR_CBYTE table = dac_cast<PTR_CBYTE>(methodInfoPtr) + stateBuf.hdrInfoSize;
+
+ hdrInfo *info = &stateBuf.hdrInfoBody;
+
+ _ASSERTE(info->epilogOffs == hdrInfo::NOT_IN_EPILOG && info->prologOffs == hdrInfo::NOT_IN_PROLOG);
+
+ bool isESPFrame = !info->ebpFrame && !info->doubleAlign;
+
+ if (codeInfo.IsFunclet())
+ {
+ // Treat funclet's frame as ESP frame
+ isESPFrame = true;
+ }
+
+ if (isESPFrame)
+ {
+ const size_t curESP = (size_t)(pContext->Esp);
+ return curESP + GetPushedArgSize(info, table, curOffs);
+ }
+
+ const size_t curEBP = (size_t)(pContext->Ebp);
+ return GetOutermostBaseFP(curEBP, info);
+}
+#endif // _TARGET_X86_
+#endif // WIN64EXCEPTIONS
+
#ifndef CROSSGEN_COMPILE
#ifndef WIN64EXCEPTIONS