VirtualBox

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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            /*
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