VirtualBox

Changeset 32239 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 3, 2010 5:01:38 PM (14 years ago)
Author:
vboxsync
Message:

VMM/DBGFCoreWrite: bits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/DBGFCoreWrite.cpp

    r32236 r32239  
    121121    ElfHdr.e_shentsize       = sizeof(Elf64_Shdr);
    122122
    123     int rc = RTFileWrite(hFile, &ElfHdr, sizeof(ElfHdr), NULL /* full write */);
     123    int rc = RTFileWrite(hFile, &ElfHdr, sizeof(ElfHdr), NULL /* all */);
    124124    if (RT_SUCCESS(rc) && pcbElfHdr)
    125125        *pcbElfHdr = sizeof(ElfHdr);
     
    155155    ProgHdr.p_paddr         = Phys;
    156156
    157     int rc = RTFileWrite(hFile, &ProgHdr, sizeof(ProgHdr), NULL /* full write */);
     157    int rc = RTFileWrite(hFile, &ProgHdr, sizeof(ProgHdr), NULL /* all */);
    158158    if (RT_SUCCESS(rc) && pcbProgHdr)
    159159        *pcbProgHdr = sizeof(ProgHdr);
     
    221221     * Write note header.
    222222     */
    223     int rc = RTFileWrite(hFile, &ElfNoteHdr, sizeof(ElfNoteHdr), NULL /* full write */);
     223    int rc = RTFileWrite(hFile, &ElfNoteHdr, sizeof(ElfNoteHdr), NULL /* all */);
    224224    if (RT_SUCCESS(rc))
    225225    {
     
    227227         * Write note name.
    228228         */
    229         rc = RTFileWrite(hFile, szNoteName, cbName, NULL /* full write */);
     229        rc = RTFileWrite(hFile, szNoteName, cbName, NULL /* all */);
    230230        if (RT_SUCCESS(rc))
    231231        {
     
    241241                 * Write note data.
    242242                 */
    243                 rc = RTFileWrite(hFile, pcvData, cbData, NULL /* full write */);
     243                rc = RTFileWrite(hFile, pcvData, cbData, NULL /* all */);
    244244                if (RT_SUCCESS(rc))
    245245                {
     
    248248                     */
    249249                    if (cbDataAlign > cbData)
    250                         rc = RTFileWrite(hFile, s_achPad, cbDataAlign - cbData, NULL /* full write*/);
     250                        rc = RTFileWrite(hFile, s_achPad, cbDataAlign - cbData, NULL /* all*/);
    251251                }
    252252            }
     
    387387                if (RT_SUCCESS(rc))
    388388                {
    389                     for (uint32_t i = 0; i < pVM->cCpus; i++)
     389                    for (uint32_t iCpu = 0; iCpu < pVM->cCpus; iCpu++)
    390390                    {
    391                         PCPUMCTX pCpuCtx = &pVM->aCpus[i].cpum.s.Guest;
     391                        PCPUMCTX pCpuCtx = &pVM->aCpus[iCpu].cpum.s.Guest;
    392392                        rc = Elf64WriteNoteHdr(hFile, NT_VBOXCPU, s_pcszCoreVBoxCpu, pCpuCtx, sizeof(CPUMCTX), NULL /* pcbNoteHdr */);
    393393                        if (RT_FAILURE(rc))
    394394                        {
    395                             LogRel((DBGFLOG_NAME ":Elf64WriteNoteHdr failed for vCPU[%u] rc=%Rrc\n", i, rc));
     395                            LogRel((DBGFLOG_NAME ":Elf64WriteNoteHdr failed for vCPU[%u] rc=%Rrc\n", iCpu, rc));
    396396                            break;
    397397                        }
     398                    }
     399                }
     400
     401                /*
     402                 * Write memory ranges.
     403                 */
     404                if (RT_SUCCESS(rc))
     405                {
     406                    for (uint16_t iRange = 0; iRange < cMemRanges; iRange++)
     407                    {
     408                        RTGCPHYS GCPhysStart;
     409                        RTGCPHYS GCPhysEnd;
     410                        bool fIsMmio;
     411                        rc = PGMR3PhysGetRange(pVM, iRange, &GCPhysStart, &GCPhysEnd, NULL /* pszDesc */, &fIsMmio);
     412                        if (RT_FAILURE(rc))
     413                        {
     414                            LogRel((DBGFLOG_NAME ":PGMR3PhysGetRange(2) failed for iRange(%u) rc=%Rrc\n", iRange, rc));
     415                            break;
     416                        }
     417
     418                        if (fIsMmio)
     419                            continue;
     420
     421                        /*
     422                         * Write page-by-page of this memory range.
     423                         */
     424                        uint64_t cbMemRange  = GCPhysEnd - GCPhysStart + 1;
     425                        uint64_t cbFileRange = fIsMmio ? 0 : cbMemRange;
     426                        uint64_t cPages = cbMemRange >> PAGE_SHIFT;
     427                        for (uint64_t iPage = 0; iPage < cPages; iPage++)
     428                        {
     429                            const int cbBuf = PAGE_SIZE;
     430                            void *pvBuf     = MMR3HeapAlloc(pVM, MM_TAG_DBGF_CORE_WRITE, cbBuf);
     431                            if (RT_UNLIKELY(!pvBuf))
     432                            {
     433                                LogRel((DBGFLOG_NAME ":MMR3HeapAlloc failed. iRange=%u iPage=%u\n", iRange, iPage));
     434                                break;
     435                            }
     436
     437                            rc = PGMPhysRead(pVM, GCPhysStart, pvBuf, cbBuf);
     438                            if (RT_FAILURE(rc))
     439                            {
     440                                /*
     441                                 * For some reason this failed, write out a zero page instead.
     442                                 */
     443                                LogRel((DBGFLOG_NAME ":PGMPhysRead failed for iRange=%u iPage=%u. rc=%Rrc. Ignoring...\n", iRange,
     444                                        iPage, rc));
     445                                memset(pvBuf, 0, cbBuf);
     446                            }
     447
     448                            rc = RTFileWrite(hFile, pvBuf, cbBuf, NULL /* all */);
     449                            if (RT_FAILURE(rc))
     450                            {
     451                                LogRel((DBGFLOG_NAME ":RTFileWrite failed. iRange=%u iPage=%u rc=%Rrc\n", iRange, iPage, rc));
     452                                MMR3HeapFree(pvBuf);
     453                                break;
     454                            }
     455
     456                            MMR3HeapFree(pvBuf);
     457                        }
     458
     459                        if (RT_FAILURE(rc))
     460                            break;
    398461                    }
    399462                }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette