// // CopyThreadContext() does an intelligent copy from pSrc to pDst, // respecting the ContextFlags of both contexts. // void CORDbgCopyThreadContext(DT_CONTEXT* pDst, const DT_CONTEXT* pSrc) { DWORD dstFlags = pDst->ContextFlags; DWORD srcFlags = pSrc->ContextFlags; LOG((LF_CORDB, LL_INFO1000000, "CP::CTC: pDst=0x%08x dstFlags=0x%x, pSrc=0x%08x srcFlags=0x%x\n", pDst, dstFlags, pSrc, srcFlags)); if ((dstFlags & srcFlags & DT_CONTEXT_CONTROL) == DT_CONTEXT_CONTROL) { CopyContextChunk(&(pDst->Fp), &(pSrc->Fp), &(pDst->V), DT_CONTEXT_CONTROL); CopyContextChunk(&(pDst->Cpsr), &(pSrc->Cpsr), &(pDst->X), DT_CONTEXT_CONTROL); } if ((dstFlags & srcFlags & DT_CONTEXT_INTEGER) == DT_CONTEXT_INTEGER) CopyContextChunk(&(pDst->X[0]), &(pSrc->X[0]), &(pDst->Fp), DT_CONTEXT_INTEGER); if ((dstFlags & srcFlags & DT_CONTEXT_FLOATING_POINT) == DT_CONTEXT_FLOATING_POINT) CopyContextChunk(&(pDst->V[0]), &(pSrc->V[0]), &(pDst->Bcr[0]), DT_CONTEXT_FLOATING_POINT); if ((dstFlags & srcFlags & DT_CONTEXT_DEBUG_REGISTERS) == DT_CONTEXT_DEBUG_REGISTERS) CopyContextChunk(&(pDst->Bcr[0]), &(pSrc->Bcr[0]), &(pDst->Wvr[ARM64_MAX_WATCHPOINTS]), DT_CONTEXT_DEBUG_REGISTERS); }
// // CopyThreadContext does an intelligent copy from c2 to c1, // respecting the ContextFlags of both contexts. // void _CopyThreadContext(CONTEXT *c1, CONTEXT *c2) { DWORD c1Flags = c1->ContextFlags; DWORD c2Flags = c2->ContextFlags; LOG((LF_CORDB, LL_INFO1000000, "CP::CTC: c1=0x%08x c1Flags=0x%x, c2=0x%08x c2Flags=0x%x\n", c1, c1Flags, c2, c2Flags)); #define CopyContextChunk(_t, _f, _e, _c) {\ LOG((LF_CORDB, LL_INFO1000000, \ "CP::CTC: copying " #_c ": 0x%08x <--- 0x%08x (%d)\n", \ (_t), (_f), ((UINT_PTR)(_e) - (UINT_PTR)_t))); \ memcpy((_t), (_f), ((UINT_PTR)(_e) - (UINT_PTR)_t)); \ } #ifdef _X86_ // Reliance on contexts registers if ((c1Flags & c2Flags & CONTEXT_CONTROL) == CONTEXT_CONTROL) CopyContextChunk(&(c1->Ebp), &(c2->Ebp), c1->ExtendedRegisters, CONTEXT_CONTROL); if ((c1Flags & c2Flags & CONTEXT_INTEGER) == CONTEXT_INTEGER) CopyContextChunk(&(c1->Edi), &(c2->Edi), &(c1->Ebp), CONTEXT_INTEGER); if ((c1Flags & c2Flags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT) CopyContextChunk(&(c1->FloatSave), &(c2->FloatSave), (&c1->FloatSave)+1, CONTEXT_FLOATING_POINT); #elif defined(_PPC_) if ((c1Flags & c2Flags & CONTEXT_CONTROL) == CONTEXT_CONTROL) CopyContextChunk(&(c1->Msr), &(c2->Msr), &c1->ContextFlags, CONTEXT_CONTROL); if ((c1Flags & c2Flags & CONTEXT_INTEGER) == CONTEXT_INTEGER) CopyContextChunk(&(c1->Gpr0), &(c2->Gpr0), &(c1->Msr), CONTEXT_INTEGER); if ((c1Flags & c2Flags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT) CopyContextChunk(&(c1->Fpr0), &(c2->Fpr0), &(c1->Gpr0), CONTEXT_FLOATING_POINT); #else PORTABILITY_ASSERT("CopyThreadContext (common.cpp) is not implemented on this platform."); #endif }