From ead3045fa6e4a43fc16f59a627bc8040df039511 Mon Sep 17 00:00:00 2001 From: Jonghyun Park Date: Tue, 14 Feb 2017 07:19:14 +0900 Subject: [x86/Linux] Fix incorrect update in HijackFrame::UpdateRegDisplay (#9448) * [x86/Linux] Fix incorrect update in HijackFrame::UpdateRegDisplay * Use ENUM_XXX_REGISTERS macro --- src/vm/i386/cgenx86.cpp | 29 ++++++++++++++--------------- 1 file 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)); -- cgit v1.2.3