VirtualBox

Changeset 47786 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Aug 16, 2013 8:59:32 AM (11 years ago)
Author:
vboxsync
Message:

PGM: Added a new page type for the VT-x APIC access page MMIO alias instead of abusing the MMIO2 aliasing. There are important differences, we can safely access the MMIO2 page when aliased and save time doing so, while the alias created by IOMMMIOMapMMIOHCPage must not be accessed outside the VT-x execution AFAIK.

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

Legend:

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

    r46788 r47786  
    717717
    718718    case PGMPAGETYPE_MMIO2_ALIAS_MMIO:
     719    case PGMPAGETYPE_SPECIAL_ALIAS_MMIO:
    719720        AssertFailed();
    720721        break;
  • trunk/src/VBox/VMM/VMMR3/PGM.cpp

    r46420 r47786  
    39523952                    default:
    39533953                        AssertFailed();
     3954                    case PGMPAGETYPE_MMIO:
    39543955                    case PGMPAGETYPE_MMIO2_ALIAS_MMIO:
    3955                     case PGMPAGETYPE_MMIO:
     3956                    case PGMPAGETYPE_SPECIAL_ALIAS_MMIO:
    39563957                        if (fIncZeroPgs)
    39573958                        {
  • trunk/src/VBox/VMM/VMMR3/PGMDbg.cpp

    r46220 r47786  
    661661                if (   (   !PGM_PAGE_IS_ZERO(pPage)
    662662                        || fAllZero)
    663                     && !PGM_PAGE_IS_MMIO(pPage)
    664                     && PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO
     663                    && !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)
    665664                    && !PGM_PAGE_IS_BALLOONED(pPage))
    666665                {
     
    807806                && (   !PGM_PAGE_IS_ZERO(pPage)
    808807                    || fAllZero)
    809                 && !PGM_PAGE_IS_MMIO(pPage)
    810                 && PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO
     808                && !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)
    811809                && !PGM_PAGE_IS_BALLOONED(pPage))
    812810            {
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r45618 r47786  
    144144                 * delegate the job to EMT.
    145145                 */
    146                 if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
     146                if (   PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)
     147                    || PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage))
    147148                {
    148149                    pgmUnlock(pVM);
     
    151152                                                   pVM, &GCPhys, pvBuf, cbRead);
    152153                }
    153                 Assert(!PGM_PAGE_IS_MMIO(pPage));
     154                Assert(!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage));
    154155
    155156                /*
     
    282283                 */
    283284                if (    PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)
    284                     ||  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED)
     285                    ||  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
     286                    ||  PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage))
    285287                {
    286288                    if (    PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_WRITE_MONITORED
     
    295297                    }
    296298                }
    297                 Assert(!PGM_PAGE_IS_MMIO(pPage));
     299                Assert(!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage));
    298300
    299301                /*
     
    378380        AssertFatalRC(rc2);
    379381        PPGMPAGE pPage = pTlbe->pPage;
    380         if (PGM_PAGE_IS_MMIO(pPage))
     382        if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))
    381383        {
    382384            PGMPhysReleasePageMappingLock(pVM, pLock);
     
    449451    {
    450452        PPGMPAGE pPage = pTlbe->pPage;
    451         if (PGM_PAGE_IS_MMIO(pPage))
     453        if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))
    452454            rc = VERR_PGM_PHYS_PAGE_RESERVED;
    453455        else
     
    552554#if 1
    553555        /* MMIO pages doesn't have any readable backing. */
    554         if (PGM_PAGE_IS_MMIO(pPage))
     556        if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))
    555557            rc = VERR_PGM_PHYS_PAGE_RESERVED;
    556558#else
     
    19791981
    19801982                    case PGMPAGETYPE_MMIO2_ALIAS_MMIO:
     1983                    case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: /** @todo perhaps leave the special page alone?  I don't think VT-x copes with this code. */
    19811984                        pgmHandlerPhysicalResetAliasedPage(pVM, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT),
    19821985                                                           true /*fDoAccounting*/);
     
    20322035
    20332036                    case PGMPAGETYPE_MMIO2_ALIAS_MMIO:
     2037                    case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: /** @todo perhaps leave the special page alone?  I don't think VT-x copes with this code. */
    20342038                        pgmHandlerPhysicalResetAliasedPage(pVM, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT),
    20352039                                                           true /*fDoAccounting*/);
     
    21272131
    21282132                case PGMPAGETYPE_MMIO2_ALIAS_MMIO:
     2133                case PGMPAGETYPE_SPECIAL_ALIAS_MMIO:
    21292134                case PGMPAGETYPE_MMIO2:
    21302135                case PGMPAGETYPE_ROM_SHADOW: /* handled by pgmR3PhysRomReset. */
     
    21492154    return VINF_SUCCESS;
    21502155}
     2156
    21512157
    21522158/**
     
    23632369                {
    23642370                    PPGMPAGE    pPage    = &pRam->aPages[iPage];
    2365                     if (    PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO
     2371                    if (   !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)
    23662372                        /*|| not-out-of-action later */)
    23672373                    {
    23682374                        fAllMMIO = false;
    2369                         Assert(PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO);
    23702375                        AssertMsgFailed(("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage));
    23712376                        break;
    23722377                    }
    2373                     Assert(PGM_PAGE_IS_ZERO(pPage));
     2378                    Assert(   PGM_PAGE_IS_ZERO(pPage)
     2379                           || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO
     2380                           || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO);
    23742381                    pPage++;
    23752382                }
     
    24092416                {
    24102417                    PPGMPAGE pPage = &pRam->aPages[iPage];
    2411                     AssertMsg(PGM_PAGE_IS_MMIO(pPage), ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage));
    2412                     AssertMsg(PGM_PAGE_IS_ZERO(pPage), ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage));
    2413                     if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO)
     2418                    AssertMsg(   (PGM_PAGE_IS_MMIO(pPage) && PGM_PAGE_IS_ZERO(pPage))
     2419                              || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO
     2420                              || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO,
     2421                              ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage));
     2422                    if (PGM_PAGE_IS_MMIO_OR_ALIAS(pPage))
    24142423                        PGM_PAGE_SET_TYPE(pVM, pPage, PGMPAGETYPE_RAM);
    24152424                }
     
    24882497 * @param   pszDesc         The description.
    24892498 */
    2490 VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc)
     2499VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags,
     2500                                      void **ppv, const char *pszDesc)
    24912501{
    24922502    /*
     
    25062516    const uint32_t cPages = cb >> PAGE_SHIFT;
    25072517    AssertLogRelReturn(((RTGCPHYS)cPages << PAGE_SHIFT) == cb, VERR_INVALID_PARAMETER);
    2508     AssertLogRelReturn(cPages <= INT32_MAX / 2, VERR_NO_MEMORY);
     2518    AssertLogRelReturn(cPages <= PGM_MMIO2_MAX_PAGE_COUNT, VERR_NO_MEMORY);
    25092519
    25102520    /*
     
    25172527            return VERR_NO_MEMORY;
    25182528    }
     2529
     2530    /*
     2531     * Allocate an MMIO2 range ID (not freed on failure).
     2532     * The zero ID is not used as it could be confused with NIL_GMM_PAGEID.
     2533     */
     2534    pgmLock(pVM);
     2535    uint8_t idMmio2 = pVM->pgm.s.cMmio2Regions + 1;
     2536    if (idMmio2 > PGM_MMIO2_MAX_RANGES)
     2537    {
     2538        pgmUnlock(pVM);
     2539        AssertLogRelFailedReturn(VERR_PGM_TOO_MANY_MMIO2_RANGES);
     2540    }
     2541    pVM->pgm.s.cMmio2Regions = idMmio2;
     2542    pgmUnlock(pVM);
    25192543
    25202544    /*
     
    25492573                pNew->iRegion               = iRegion;
    25502574                pNew->idSavedState          = UINT8_MAX;
     2575                pNew->idMmio2               = idMmio2;
    25512576                pNew->RamRange.pSelfR0      = MMHyperCCToR0(pVM, &pNew->RamRange);
    25522577                pNew->RamRange.pSelfRC      = MMHyperCCToRC(pVM, &pNew->RamRange);
     
    25632588                {
    25642589                    PGM_PAGE_INIT(&pNew->RamRange.aPages[iPage],
    2565                                   paPages[iPage].Phys, NIL_GMM_PAGEID,
     2590                                  paPages[iPage].Phys,
     2591                                  PGM_MMIO2_PAGEID_MAKE(idMmio2, iPage),
    25662592                                  PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED);
    25672593                }
     
    25752601                 * Since there is no particular order, just push it.
    25762602                 */
     2603                /** @todo we can save us the linked list now, just search the lookup table... */
    25772604                pgmLock(pVM);
     2605                Assert(pVM->pgm.s.apMmio2RangesR3[idMmio2] == NULL);
     2606                Assert(pVM->pgm.s.apMmio2RangesR0[idMmio2] == NIL_RTR0PTR);
    25782607                pNew->pNextR3 = pVM->pgm.s.pMmio2RangesR3;
    25792608                pVM->pgm.s.pMmio2RangesR3 = pNew;
     2609                pVM->pgm.s.apMmio2RangesR3[idMmio2] = pNew;
     2610                pVM->pgm.s.apMmio2RangesR0[idMmio2] = MMHyperCCToR0(pVM, pNew);
    25802611                pgmUnlock(pVM);
    25812612
     
    26502681                pVM->pgm.s.pMmio2RangesR3 = pNext;
    26512682            pCur->pNextR3 = NULL;
     2683
     2684            uint8_t idMmio2 = pCur->idMmio2;
     2685            Assert(pVM->pgm.s.apMmio2RangesR3[idMmio2] == pCur);
     2686            pVM->pgm.s.apMmio2RangesR3[idMmio2] = NULL;
     2687            pVM->pgm.s.apMmio2RangesR0[idMmio2] = NIL_RTR0PTR;
    26522688
    26532689            /*
  • trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp

    r44528 r47786  
    103103/** The CRC-32 for a zero half page. */
    104104#define PGM_STATE_CRC32_ZERO_HALF_PAGE  UINT32_C(0xf1e8ba9e)
     105
     106
     107
     108/** @name Old Page types used in older saved states.
     109 * @{  */
     110/** Old saved state: The usual invalid zero entry. */
     111#define PGMPAGETYPE_OLD_INVALID             0
     112/** Old saved state: RAM page. (RWX) */
     113#define PGMPAGETYPE_OLD_RAM                 1
     114/** Old saved state: MMIO2 page. (RWX) */
     115#define PGMPAGETYPE_OLD_MMIO2               1
     116/** Old saved state: MMIO2 page aliased over an MMIO page. (RWX)
     117 * See PGMHandlerPhysicalPageAlias(). */
     118#define PGMPAGETYPE_OLD_MMIO2_ALIAS_MMIO    2
     119/** Old saved state: Shadowed ROM. (RWX) */
     120#define PGMPAGETYPE_OLD_ROM_SHADOW          3
     121/** Old saved state: ROM page. (R-X) */
     122#define PGMPAGETYPE_OLD_ROM                 4
     123/** Old saved state: MMIO page. (---) */
     124#define PGMPAGETYPE_OLD_MMIO                5
     125/** @}  */
    105126
    106127
     
    11561177
    11571178                        case PGMPAGETYPE_MMIO:
     1179                        case PGMPAGETYPE_SPECIAL_ALIAS_MMIO:
    11581180                            paLSPages[iPage].fZero   = 0;
    11591181                            paLSPages[iPage].fShared = 0;
     
    21722194
    21732195/**
     2196 * Compares a page with an old save type value.
     2197 *
     2198 * @returns true if equal, false if not.
     2199 * @param   pPage           The page to compare.
     2200 * @param   uOldType        The old type value from the saved state.
     2201 */
     2202DECLINLINE(bool) pgmR3CompareNewAndOldPageTypes(PPGMPAGE pPage, uint8_t uOldType)
     2203{
     2204    uint8_t uOldPageType;
     2205    switch (PGM_PAGE_GET_TYPE(pPage))
     2206    {
     2207        case PGMPAGETYPE_INVALID:               uOldPageType = PGMPAGETYPE_OLD_INVALID; break;
     2208        case PGMPAGETYPE_RAM:                   uOldPageType = PGMPAGETYPE_OLD_RAM; break;
     2209        case PGMPAGETYPE_MMIO2:                 uOldPageType = PGMPAGETYPE_OLD_MMIO2; break;
     2210        case PGMPAGETYPE_MMIO2_ALIAS_MMIO:      uOldPageType = PGMPAGETYPE_OLD_MMIO2_ALIAS_MMIO; break;
     2211        case PGMPAGETYPE_ROM_SHADOW:            uOldPageType = PGMPAGETYPE_OLD_ROM_SHADOW; break;
     2212        case PGMPAGETYPE_ROM:                   uOldPageType = PGMPAGETYPE_OLD_ROM; break;
     2213        case PGMPAGETYPE_SPECIAL_ALIAS_MMIO:    /* fall thru */
     2214        case PGMPAGETYPE_MMIO:                  uOldPageType = PGMPAGETYPE_OLD_MMIO; break;
     2215        default:
     2216            AssertFailed();
     2217            uOldPageType = PGMPAGETYPE_OLD_INVALID;
     2218            break;
     2219    }
     2220    return uOldPageType == uOldType;
     2221}
     2222
     2223
     2224/**
    21742225 * Loads a page without any bits in the saved state, i.e. making sure it's
    21752226 * really zero.
     
    21772228 * @returns VBox status code.
    21782229 * @param   pVM             Pointer to the VM.
    2179  * @param   uType           The page type or PGMPAGETYPE_INVALID (old saved
     2230 * @param   uOldType        The page type or PGMPAGETYPE_OLD_INVALID (old saved
    21802231 *                          state).
    21812232 * @param   pPage           The guest page tracking structure.
     
    21832234 * @param   pRam            The ram range (logging).
    21842235 */
    2185 static int pgmR3LoadPageZeroOld(PVM pVM, uint8_t uType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
    2186 {
    2187     if (    PGM_PAGE_GET_TYPE(pPage) != uType
    2188         &&  uType != PGMPAGETYPE_INVALID)
     2236static int pgmR3LoadPageZeroOld(PVM pVM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
     2237{
     2238    if (   uOldType != PGMPAGETYPE_OLD_INVALID
     2239        && !pgmR3CompareNewAndOldPageTypes(pPage, uOldType))
    21892240        return VERR_SSM_UNEXPECTED_DATA;
    21902241
     
    22072258 * @param   pVM             Pointer to the VM.
    22082259 * @param   pSSM            The SSM handle.
    2209  * @param   uType           The page type or PGMPAGETYEP_INVALID (old saved
     2260 * @param   uOldType        The page type or PGMPAGETYPE_OLD_INVALID (old saved
    22102261 *                          state).
    22112262 * @param   pPage           The guest page tracking structure.
     
    22132264 * @param   pRam            The ram range (logging).
    22142265 */
    2215 static int pgmR3LoadPageBitsOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
     2266static int pgmR3LoadPageBitsOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
    22162267{
    22172268    /*
    22182269     * Match up the type, dealing with MMIO2 aliases (dropped).
    22192270     */
    2220     AssertLogRelMsgReturn(   PGM_PAGE_GET_TYPE(pPage) == uType
    2221                           || uType == PGMPAGETYPE_INVALID
     2271    AssertLogRelMsgReturn(   uOldType == PGMPAGETYPE_INVALID
     2272                          || pgmR3CompareNewAndOldPageTypes(pPage, uOldType)
    22222273                          /* kudge for the expanded PXE bios (r67885) - @bugref{5687}: */
    2223                           || (   uType == PGMPAGETYPE_RAM
     2274                          || (   uOldType == PGMPAGETYPE_OLD_RAM
    22242275                              && GCPhys >= 0xed000
    22252276                              && GCPhys <= 0xeffff
     
    22512302 * @param   pVM             Pointer to the VM.
    22522303 * @param   pSSM            The SSM handle.
    2253  * @param   uType           The page type.
     2304 * @param   uOldType        The page type.
    22542305 * @param   pPage           The page.
    22552306 * @param   GCPhys          The page address.
    22562307 * @param   pRam            The RAM range (for error messages).
    22572308 */
    2258 static int pgmR3LoadPageOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
     2309static int pgmR3LoadPageOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
    22592310{
    22602311    uint8_t uState;
     
    22622313    AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] GCPhys=%#x %s rc=%Rrc\n", pPage, GCPhys, pRam->pszDesc, rc), rc);
    22632314    if (uState == 0 /* zero */)
    2264         rc = pgmR3LoadPageZeroOld(pVM, uType, pPage, GCPhys, pRam);
     2315        rc = pgmR3LoadPageZeroOld(pVM, uOldType, pPage, GCPhys, pRam);
    22652316    else if (uState == 1)
    2266         rc = pgmR3LoadPageBitsOld(pVM, pSSM, uType, pPage, GCPhys, pRam);
     2317        rc = pgmR3LoadPageBitsOld(pVM, pSSM, uOldType, pPage, GCPhys, pRam);
    22672318    else
    22682319        rc = VERR_PGM_INVALID_SAVED_PAGE_STATE;
    2269     AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] uState=%d uType=%d GCPhys=%RGp %s rc=%Rrc\n",
    2270                                  pPage, uState, uType, GCPhys, pRam->pszDesc, rc),
     2320    AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] uState=%d uOldType=%d GCPhys=%RGp %s rc=%Rrc\n",
     2321                                 pPage, uState, uOldType, GCPhys, pRam->pszDesc, rc),
    22712322                            rc);
    22722323    return VINF_SUCCESS;
     
    24402491                RTGCPHYS const  GCPhysPage = ((RTGCPHYS)iPage << PAGE_SHIFT) + pRam->GCPhys;
    24412492                PPGMPAGE        pPage      = &pRam->aPages[iPage];
    2442                 uint8_t         uType;
    2443                 rc = SSMR3GetU8(pSSM, &uType);
     2493                uint8_t         uOldType;
     2494                rc = SSMR3GetU8(pSSM, &uOldType);
    24442495                AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] iPage=%#x GCPhysPage=%#x %s\n", pPage, iPage, GCPhysPage, pRam->pszDesc), rc);
    2445                 if (uType == PGMPAGETYPE_ROM_SHADOW)
     2496                if (uOldType == PGMPAGETYPE_OLD_ROM_SHADOW)
    24462497                    rc = pgmR3LoadShadowedRomPageOld(pVM, pSSM, pPage, GCPhysPage, pRam);
    24472498                else
    2448                     rc = pgmR3LoadPageOld(pVM, pSSM, uType, pPage, GCPhysPage, pRam);
     2499                    rc = pgmR3LoadPageOld(pVM, pSSM, uOldType, pPage, GCPhysPage, pRam);
    24492500                AssertLogRelMsgRCReturn(rc, ("rc=%Rrc iPage=%#x GCPhysPage=%#x %s\n", rc, iPage, GCPhysPage, pRam->pszDesc), rc);
    24502501            }
     
    24942545                        if (fPresent)
    24952546                        {
    2496                             if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO)
     2547                            if (   PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO
     2548                                || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO)
    24972549                                rc = pgmR3LoadPageToDevNullOld(pSSM);
    24982550                            else
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