diff options
author | Jonghyun Park <parjong@gmail.com> | 2017-02-14 07:19:14 +0900 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2017-02-13 23:19:14 +0100 |
commit | ead3045fa6e4a43fc16f59a627bc8040df039511 (patch) | |
tree | 41925fe8aaf64391a00455b43c53c49f5efdf5d3 | |
parent | 645f0ad659dda3e356330c36e5c4702040acfb32 (diff) | |
download | coreclr-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.cpp | 29 |
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)); |