VirtualBox

Changeset 58781 in vbox


Ignore:
Timestamp:
Nov 19, 2015 10:33:00 PM (9 years ago)
Author:
vboxsync
Message:

PGM: Must always make a copy of the ROM pages, no just in RT_STRICT builds. Added pgmR3LoadDone to set the flag so that it's set for all saved state versions (and won't interfer during loading). Renamed fRestoreVirginRomPagesDuringReset to fRestoreRomPagesAtReset since 'virgin ROM pages' turned out to be a little bit confusing, see PGMROMPAGE (we always switch a ROM page back to the 'virgin' version, resetting any shadowing).

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PGM.cpp

    r58779 r58781  
    12531253    pVM->pgm.s.offVM       = RT_OFFSETOF(VM, pgm.s);
    12541254    pVM->pgm.s.offVCpuPGM  = RT_OFFSETOF(VMCPU, pgm.s);
     1255    /*pVM->pgm.s.fRestoreRomPagesAtReset = false;*/
    12551256
    12561257    for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.aHandyPages); i++)
     
    13121313    pVM->pgm.s.GCPhys4MBPSEMask = RT_BIT_64(32) - 1; /* default; checked later */
    13131314    pVM->pgm.s.GCPtrPrevRamRangeMapping = MM_HYPER_AREA_ADDRESS;
    1314     pVM->pgm.s.fRestoreVirginRomPagesDuringReset = false;
    13151315
    13161316    rc = CFGMR3QueryBoolDef(CFGMR3GetRoot(pVM), "RamPreAlloc", &pVM->pgm.s.fRamPreAlloc,
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r58779 r58781  
    33873387                    pRomNew->idSavedState = UINT8_MAX;
    33883388                    pRomNew->cbOriginal = cbBinary;
    3389 #ifdef VBOX_STRICT
     3389                    pRomNew->pszDesc    = pszDesc;
    33903390                    pRomNew->pvOriginal = fFlags & PGMPHYS_ROM_FLAGS_PERMANENT_BINARY
    33913391                                        ? pvBinary : RTMemDup(pvBinary, cbBinary);
    3392 #else
    3393                     pRomNew->pvOriginal = fFlags & PGMPHYS_ROM_FLAGS_PERMANENT_BINARY ? pvBinary : NULL;
    3394 #endif
    3395                     pRomNew->pszDesc    = pszDesc;
    3396 
    3397                     for (unsigned iPage = 0; iPage < cPages; iPage++)
     3392                    if (pRomNew->pvOriginal)
    33983393                    {
    3399                         PPGMROMPAGE pPage = &pRomNew->aPages[iPage];
    3400                         pPage->enmProt = PGMROMPROT_READ_ROM_WRITE_IGNORE;
    3401                         PGM_PAGE_INIT_ZERO(&pPage->Shadow, pVM, PGMPAGETYPE_ROM_SHADOW);
     3394                        for (unsigned iPage = 0; iPage < cPages; iPage++)
     3395                        {
     3396                            PPGMROMPAGE pPage = &pRomNew->aPages[iPage];
     3397                            pPage->enmProt = PGMROMPROT_READ_ROM_WRITE_IGNORE;
     3398                            PGM_PAGE_INIT_ZERO(&pPage->Shadow, pVM, PGMPAGETYPE_ROM_SHADOW);
     3399                        }
     3400
     3401                        /* update the page count stats for the shadow pages. */
     3402                        if (fFlags & PGMPHYS_ROM_FLAGS_SHADOWED)
     3403                        {
     3404                            pVM->pgm.s.cZeroPages += cPages;
     3405                            pVM->pgm.s.cAllPages  += cPages;
     3406                        }
     3407
     3408                        /*
     3409                         * Insert the ROM range, tell REM and return successfully.
     3410                         */
     3411                        pRomNew->pNextR3 = pRom;
     3412                        pRomNew->pNextR0 = pRom ? MMHyperCCToR0(pVM, pRom) : NIL_RTR0PTR;
     3413                        pRomNew->pNextRC = pRom ? MMHyperCCToRC(pVM, pRom) : NIL_RTRCPTR;
     3414
     3415                        if (pRomPrev)
     3416                        {
     3417                            pRomPrev->pNextR3 = pRomNew;
     3418                            pRomPrev->pNextR0 = MMHyperCCToR0(pVM, pRomNew);
     3419                            pRomPrev->pNextRC = MMHyperCCToRC(pVM, pRomNew);
     3420                        }
     3421                        else
     3422                        {
     3423                            pVM->pgm.s.pRomRangesR3 = pRomNew;
     3424                            pVM->pgm.s.pRomRangesR0 = MMHyperCCToR0(pVM, pRomNew);
     3425                            pVM->pgm.s.pRomRangesRC = MMHyperCCToRC(pVM, pRomNew);
     3426                        }
     3427
     3428                        pgmPhysInvalidatePageMapTLB(pVM);
     3429                        GMMR3AllocatePagesCleanup(pReq);
     3430                        return VINF_SUCCESS;
    34023431                    }
    34033432
    3404                     /* update the page count stats for the shadow pages. */
    3405                     if (fFlags & PGMPHYS_ROM_FLAGS_SHADOWED)
    3406                     {
    3407                         pVM->pgm.s.cZeroPages += cPages;
    3408                         pVM->pgm.s.cAllPages  += cPages;
    3409                     }
    3410 
    3411                     /*
    3412                      * Insert the ROM range, tell REM and return successfully.
    3413                      */
    3414                     pRomNew->pNextR3 = pRom;
    3415                     pRomNew->pNextR0 = pRom ? MMHyperCCToR0(pVM, pRom) : NIL_RTR0PTR;
    3416                     pRomNew->pNextRC = pRom ? MMHyperCCToRC(pVM, pRom) : NIL_RTRCPTR;
    3417 
    3418                     if (pRomPrev)
    3419                     {
    3420                         pRomPrev->pNextR3 = pRomNew;
    3421                         pRomPrev->pNextR0 = MMHyperCCToR0(pVM, pRomNew);
    3422                         pRomPrev->pNextRC = MMHyperCCToRC(pVM, pRomNew);
    3423                     }
    3424                     else
    3425                     {
    3426                         pVM->pgm.s.pRomRangesR3 = pRomNew;
    3427                         pVM->pgm.s.pRomRangesR0 = MMHyperCCToR0(pVM, pRomNew);
    3428                         pVM->pgm.s.pRomRangesRC = MMHyperCCToRC(pVM, pRomNew);
    3429                     }
    3430 
    3431                     pgmPhysInvalidatePageMapTLB(pVM);
    3432                     GMMR3AllocatePagesCleanup(pReq);
    3433                     return VINF_SUCCESS;
     3433                    /* bail out */
     3434                    rc = VERR_NO_MEMORY;
    34343435                }
    3435 
    3436                 /* bail out */
    34373436
    34383437                int rc2 = PGMHandlerPhysicalDeregister(pVM, GCPhys);
     
    35743573
    35753574        /*
    3576          * Restore virgin ROM pages after a saved state load or check that the
    3577          * virgin pages are unchanged if possible.
     3575         * Restore the original ROM pages after a saved state load.
     3576         * Also, in strict builds check that ROM pages remain unmodified.
    35783577         */
    3579         if (pRom->pvOriginal)
     3578        if (   pRom->pvOriginal
     3579#ifndef VBOX_STRICT
     3580            && pVM->pgm.s.fRestoreRomPagesAtReset
     3581#endif
     3582            )
    35803583        {
    35813584            size_t         cbSrcLeft = pRom->cbOriginal;
    35823585            uint8_t const *pbSrcPage = (uint8_t const *)pRom->pvOriginal;
    3583             bool           fChanged = false;
     3586            uint32_t       cRestored = 0;
    35843587            for (uint32_t iPage = 0; iPage < cPages && cbSrcLeft > 0; iPage++, pbSrcPage += PAGE_SIZE)
    35853588            {
     
    35923595                if (memcmp(pvDstPage, pbSrcPage, RT_MIN(cbSrcLeft, PAGE_SIZE)))
    35933596                {
    3594                     if (pVM->pgm.s.fRestoreVirginRomPagesDuringReset)
     3597                    if (pVM->pgm.s.fRestoreRomPagesAtReset)
    35953598                    {
    35963599                        void *pvDstPageW;
     
    35983601                        AssertLogRelRCReturn(rc, rc);
    35993602                        memcpy(pvDstPageW, pbSrcPage, RT_MIN(cbSrcLeft, PAGE_SIZE));
    3600                         fChanged = true;
     3603                        cRestored++;
    36013604                    }
    36023605                    else
    3603                     {
    3604 #ifdef VBOX_STRICT
    3605                         LogRel(("pgmR3PhysRomReset: %RGp rom page changed (%s)?\n", GCPhys, pRom->pszDesc));
    3606 #endif
    3607                     }
     3606                        LogRel(("pgmR3PhysRomReset: %RGp: ROM page changed (%s)\n", GCPhys, pRom->pszDesc));
    36083607                }
    36093608                cbSrcLeft -= RT_MIN(cbSrcLeft, PAGE_SIZE);
    36103609            }
    3611             if (fChanged)
    3612                 LogRel(("PGM: ROM \"%s\" changed - restored original\n", pRom->pszDesc));
    3613         }
    3614     }
    3615 
    3616     pVM->pgm.s.fRestoreVirginRomPagesDuringReset = false;
     3610            if (cRestored > 0)
     3611                LogRel(("PGM: ROM \"%s\": Reloaded %u of %u pages.\n", pRom->pszDesc, cRestored, cPages));
     3612        }
     3613    }
     3614
     3615    /* Clear the ROM restore flag now as we only need to do this once after
     3616       loading saved state. */
     3617    pVM->pgm.s.fRestoreRomPagesAtReset = false;
     3618
    36173619    return VINF_SUCCESS;
    36183620}
     
    36283630void pgmR3PhysRomTerm(PVM pVM)
    36293631{
    3630 #ifdef RT_STRICT
    36313632    /*
    36323633     * Free the heap copy of the original bits.
     
    36413642        }
    36423643    }
    3643 #endif
    36443644}
    36453645
  • trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp

    r58779 r58781  
    336336                                ("The \"%s\" ROM was not found in the saved state. Probably due to some misconfiguration\n",
    337337                                 pRom->pszDesc));
    338 
    339             pVM->pgm.s.fRestoreVirginRomPagesDuringReset = true;
    340338            return VINF_SUCCESS;        /* the end */
    341339        }
     
    32993297
    33003298/**
     3299 * @callback_method_impl{FNSSMINTLOADDONE}
     3300 */
     3301static DECLCALLBACK(int) pgmR3LoadDone(PVM pVM, PSSMHANDLE pSSM)
     3302{
     3303    pVM->pgm.s.fRestoreRomPagesAtReset = true;
     3304    NOREF(pSSM);
     3305    return VINF_SUCCESS;
     3306}
     3307
     3308
     3309/**
    33013310 * Registers the saved state callbacks with SSM.
    33023311 *
     
    33103319                                 pgmR3LivePrep, pgmR3LiveExec, pgmR3LiveVote,
    33113320                                 NULL,          pgmR3SaveExec, pgmR3SaveDone,
    3312                                  pgmR3LoadPrep, pgmR3Load,     NULL);
    3313 }
    3314 
     3321                                 pgmR3LoadPrep, pgmR3Load,     pgmR3LoadDone);
     3322}
     3323
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r58779 r58781  
    32453245    /** The number of MMIO2 regions (serves as the next MMIO2 ID). */
    32463246    uint8_t                         cMmio2Regions;
    3247     /** Flag indicating that ROM pages should be restored to their original
    3248      * during reset. Primary use is for getting firmware updates when the
    3249      * VM is reset after a saved state was loaded. */
    3250     bool                            fRestoreVirginRomPagesDuringReset;
     3247    /** Restore original ROM page content when resetting after loading state.
     3248     * The flag is set by pgmR3LoadRomRanges and cleared at reset.  This
     3249     * enables the VM to start using an updated ROM without requiring powering
     3250     * down the VM, just rebooting or resetting it. */
     3251    bool                            fRestoreRomPagesAtReset;
    32513252
    32523253    /** Indicates that PGMR3FinalizeMappings has been called and that further
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r58779 r58781  
    674674    GEN_CHECK_OFF(PGM, paDynPageMapPaePTEsGC);
    675675    GEN_CHECK_OFF(PGM, enmHostMode);
    676     GEN_CHECK_OFF(PGM, fRestoreVirginRomPagesDuringReset);
     676    GEN_CHECK_OFF(PGM, fRestoreRomPagesAtReset);
    677677    GEN_CHECK_OFF(PGM, GCPhys4MBPSEMask);
    678678    GEN_CHECK_OFF(PGM, pRamRangesXR3);
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