summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-02-14 07:19:14 +0900
committerJan Vorlicek <janvorli@microsoft.com>2017-02-13 23:19:14 +0100
commitead3045fa6e4a43fc16f59a627bc8040df039511 (patch)
tree41925fe8aaf64391a00455b43c53c49f5efdf5d3
parent645f0ad659dda3e356330c36e5c4702040acfb32 (diff)
downloadcoreclr-ead3045fa6e4a43fc16f59a627bc8040df039511.tar.gz
coreclr-ead3045fa6e4a43fc16f59a627bc8040df039511.tar.bz2
coreclr-ead3045fa6e4a43fc16f59a627bc8040df039511.zip
[x86/Linux] Fix incorrect update in HijackFrame::UpdateRegDisplay (#9448)
* [x86/Linux] Fix incorrect update in HijackFrame::UpdateRegDisplay * Use ENUM_XXX_REGISTERS macro
-rw-r--r--src/vm/i386/cgenx86.cpp29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp
index 528629c3a2..105b05823e 100644
--- a/src/vm/i386/cgenx86.cpp
+++ b/src/vm/i386/cgenx86.cpp
@@ -802,6 +802,7 @@ void ResumableFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
}
// The HijackFrame has to know the registers that are pushed by OnHijackTripThread
+// -> HijackFrame::UpdateRegDisplay should restore all the registers pushed by OnHijackTripThread
void HijackFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
{
CONTRACTL {
@@ -822,19 +823,15 @@ void HijackFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
pRD->pCurrentContext->Eip = *PTR_PCODE(pRD->PCTAddr);
pRD->pCurrentContext->Esp = (DWORD)(pRD->PCTAddr + sizeof(TADDR));
-#define CALLEE_SAVED_REGISTER(reg) pRD->pCurrentContext->reg = m_Args->reg;
+#define RESTORE_REG(reg) { pRD->pCurrentContext->reg = m_Args->reg; pRD->pCurrentContextPointers->reg = &m_Args->reg; }
+#define CALLEE_SAVED_REGISTER(reg) RESTORE_REG(reg)
ENUM_CALLEE_SAVED_REGISTERS();
#undef CALLEE_SAVED_REGISTER
-#define CALLEE_SAVED_REGISTER(reg) pRD->pCurrentContextPointers->reg = NULL;
- ENUM_CALLEE_SAVED_REGISTERS();
-#undef CALLEE_SAVED_REGISTER
-
-#define ARGUMENT_AND_SCRATCH_REGISTER(reg) pRD->pCurrentContextPointers->reg = NULL;
+#define ARGUMENT_AND_SCRATCH_REGISTER(reg) RESTORE_REG(reg)
ENUM_ARGUMENT_AND_SCRATCH_REGISTERS();
#undef ARGUMENT_AND_SCRATCH_REGISTER
-
- pRD->pCurrentContextPointers->Eax = (PDWORD) &m_Args->Eax;
+#undef RESTORE_REG
SyncRegDisplayToCurrentContext(pRD);
@@ -843,14 +840,16 @@ void HijackFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
// This only describes the top-most frame
pRD->pContext = NULL;
- pRD->pEdi = &m_Args->Edi;
- pRD->pEsi = &m_Args->Esi;
- pRD->pEbx = &m_Args->Ebx;
- pRD->pEdx = &m_Args->Edx;
- pRD->pEcx = &m_Args->Ecx;
- pRD->pEax = &m_Args->Eax;
+#define RESTORE_REG(reg) { pRD->p##reg = &m_Args->reg; }
+#define CALLEE_SAVED_REGISTER(reg) RESTORE_REG(reg)
+ ENUM_CALLEE_SAVED_REGISTERS();
+#undef CALLEE_SAVED_REGISTER
+
+#define ARGUMENT_AND_SCRATCH_REGISTER(reg) RESTORE_REG(reg)
+ ENUM_ARGUMENT_AND_SCRATCH_REGISTERS();
+#undef ARGUMENT_AND_SCRATCH_REGISTER
+#undef RESTORE_REG
- pRD->pEbp = &m_Args->Ebp;
pRD->ControlPC = *PTR_PCODE(pRD->PCTAddr);
pRD->SP = (DWORD)(pRD->PCTAddr + sizeof(TADDR));