Exemple #1
0
//
// 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);
}
Exemple #2
0
//
// 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
}