VirtualBox

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


Ignore:
Timestamp:
Jun 7, 2011 3:05:32 PM (14 years ago)
Author:
vboxsync
Message:

PGM: Fixed locking issues in PGMR3PhysMMIORegister and PGMR3PhysMMIODeregister. Also addressed a harmless on in PGMR3PhysRomRegister (only used at init time, so no races). Fortified the code with assertions more lock assertion, replacing the incorrect PGMIsLocked() checks (we only care if the current thread is the lock owner). Cleaned up some ReturnStmt macros and adding more of them.

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

Legend:

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

    r36893 r37354  
    13271327
    13281328    PGMR3PhysChunkInvalidateTLB(pVM);
    1329     PGMPhysInvalidatePageMapTLB(pVM);
     1329    pgmPhysInvalidatePageMapTLB(pVM);
    13301330
    13311331    /*
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r37137 r37354  
    884884static int pgmR3PhysFreePageRange(PVM pVM, PPGMRAMRANGE pRam, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast, uint8_t uType)
    885885{
    886     Assert(PGMIsLockOwner(pVM));
     886    PGM_LOCK_ASSERT_OWNER(pVM);
    887887    uint32_t            cPendingPages = 0;
    888888    PGMMFREEPAGESREQ    pReq;
     
    898898        AssertLogRelRCReturn(rc, rc); /* We're done for if this goes wrong. */
    899899
    900         PGM_PAGE_SET_TYPE(pPageDst, uType);
     900        PGM_PAGE_SET_TYPE(pVM, pPageDst, uType);
    901901
    902902        GCPhys += PAGE_SIZE;
     
    977977            }
    978978            Assert(PGM_PAGE_IS_ZERO(pPage));
    979             PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_BALLOONED);
     979            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_BALLOONED);
    980980        }
    981981
     
    10051005
    10061006            /* Change back to zero page. */
    1007             PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
     1007            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
    10081008        }
    10091009
     
    11531153                        if (PGM_PAGE_IS_WRITTEN_TO(pPage))
    11541154                        {
    1155                             PGM_PAGE_CLEAR_WRITTEN_TO(pPage);
     1155                            PGM_PAGE_CLEAR_WRITTEN_TO(pVM, pPage);
    11561156                            /* Remember this dirty page for the next (memory) sync. */
    11571157                            PGM_PAGE_SET_FT_DIRTY(pPage);
     
    17151715        pgmR3PhysInitAndLinkRamRange(pVM, pNew, GCPhys, GCPhysLast, NIL_RTRCPTR, NIL_RTR0PTR, pszDesc, pPrev);
    17161716    }
    1717     PGMPhysInvalidatePageMapTLB(pVM);
     1717    pgmPhysInvalidatePageMapTLB(pVM);
    17181718    pgmUnlock(pVM);
    17191719
     
    18061806int pgmR3PhysRamReset(PVM pVM)
    18071807{
    1808     Assert(PGMIsLockOwner(pVM));
     1808    PGM_LOCK_ASSERT_OWNER(pVM);
    18091809
    18101810    /* Reset the memory balloon. */
     
    18601860                        {
    18611861                            /* Turn into a zero page; the balloon status is lost when the VM reboots. */
    1862                             PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
     1862                            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
    18631863                        }
    18641864                        else if (!PGM_PAGE_IS_ZERO(pPage))
     
    19001900                            case PGM_PAGE_STATE_BALLOONED:
    19011901                                /* Turn into a zero page; the balloon status is lost when the VM reboots. */
    1902                                 PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
     1902                                PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
    19031903                                break;
    19041904
     
    19621962int pgmR3PhysRamTerm(PVM pVM)
    19631963{
    1964     Assert(PGMIsLockOwner(pVM));
     1964    PGM_LOCK_ASSERT_OWNER(pVM);
    19651965
    19661966    /* Reset the memory balloon. */
     
    20652065    AssertReturn(*pszDesc, VERR_INVALID_PARAMETER);
    20662066
     2067    int rc = pgmLock(pVM);
     2068    AssertRCReturn(rc, rc);
     2069
    20672070    /*
    20682071     * Make sure there's a RAM range structure for the region.
    20692072     */
    2070     int rc;
    20712073    RTGCPHYS GCPhysLast = GCPhys + (cb - 1);
    20722074    bool fRamExists = false;
     
    20792081        {
    20802082            /* Simplification: all within the same range. */
    2081             AssertLogRelMsgReturn(   GCPhys     >= pRam->GCPhys
    2082                                   && GCPhysLast <= pRam->GCPhysLast,
    2083                                   ("%RGp-%RGp (MMIO/%s) falls partly outside %RGp-%RGp (%s)\n",
    2084                                    GCPhys, GCPhysLast, pszDesc,
    2085                                    pRam->GCPhys, pRam->GCPhysLast, pRam->pszDesc),
    2086                                   VERR_PGM_RAM_CONFLICT);
     2083            AssertLogRelMsgReturnStmt(   GCPhys     >= pRam->GCPhys
     2084                                      && GCPhysLast <= pRam->GCPhysLast,
     2085                                      ("%RGp-%RGp (MMIO/%s) falls partly outside %RGp-%RGp (%s)\n",
     2086                                       GCPhys, GCPhysLast, pszDesc,
     2087                                       pRam->GCPhys, pRam->GCPhysLast, pRam->pszDesc),
     2088                                      pgmUnlock(pVM),
     2089                                      VERR_PGM_RAM_CONFLICT);
    20872090
    20882091            /* Check that it's all RAM or MMIO pages. */
     
    20912094            while (cLeft-- > 0)
    20922095            {
    2093                 AssertLogRelMsgReturn(   PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM
    2094                                       || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO,
    2095                                       ("%RGp-%RGp (MMIO/%s): %RGp is not a RAM or MMIO page - type=%d desc=%s\n",
    2096                                        GCPhys, GCPhysLast, pszDesc, PGM_PAGE_GET_TYPE(pPage), pRam->pszDesc),
    2097                                       VERR_PGM_RAM_CONFLICT);
     2096                AssertLogRelMsgReturnStmt(   PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM
     2097                                          || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO,
     2098                                          ("%RGp-%RGp (MMIO/%s): %RGp is not a RAM or MMIO page - type=%d desc=%s\n",
     2099                                           GCPhys, GCPhysLast, pszDesc, PGM_PAGE_GET_TYPE(pPage), pRam->pszDesc),
     2100                                          pgmUnlock(pVM),
     2101                                          VERR_PGM_RAM_CONFLICT);
    20982102                pPage++;
    20992103            }
     
    21182122         * for PCI memory, but we're doing the same thing for MMIO2 pages.
    21192123         */
    2120         rc = pgmLock(pVM);
    2121         if (RT_SUCCESS(rc))
    2122         {
    2123             rc = pgmR3PhysFreePageRange(pVM, pRam, GCPhys, GCPhysLast, PGMPAGETYPE_MMIO);
    2124             pgmUnlock(pVM);
    2125         }
    2126         AssertRCReturn(rc, rc);
     2124        rc = pgmR3PhysFreePageRange(pVM, pRam, GCPhys, GCPhysLast, PGMPAGETYPE_MMIO);
     2125        AssertRCReturnStmt(rc, pgmUnlock(pVM), rc);
    21272126
    21282127        /* Force a PGM pool flush as guest ram references have been changed. */
    2129         /** todo; not entirely SMP safe; assuming for now the guest takes care of this internally (not touch mapped mmio while changing the mapping). */
     2128        /** @todo not entirely SMP safe; assuming for now the guest takes
     2129         *   care of this internally (not touch mapped mmio while changing the
     2130         *   mapping). */
    21302131        PVMCPU pVCpu = VMMGetCpu(pVM);
    21312132        pVCpu->pgm.s.fSyncFlags |= PGM_SYNC_CLEAR_PGM_POOL;
     
    21342135    else
    21352136    {
    2136         pgmLock(pVM);
    21372137
    21382138        /*
     
    21472147        const size_t cbRamRange = RT_OFFSETOF(PGMRAMRANGE, aPages[cPages]);
    21482148        rc = MMHyperAlloc(pVM, RT_OFFSETOF(PGMRAMRANGE, aPages[cPages]), 16, MM_TAG_PGM_PHYS, (void **)&pNew);
    2149         AssertLogRelMsgRCReturn(rc, ("cbRamRange=%zu\n", cbRamRange), rc);
     2149        AssertLogRelMsgRCReturnStmt(rc, ("cbRamRange=%zu\n", cbRamRange), pgmUnlock(pVM), rc);
    21502150
    21512151        /* Initialize the range. */
     
    21712171        /* link it */
    21722172        pgmR3PhysLinkRamRange(pVM, pNew, pRamPrev);
    2173 
    2174         pgmUnlock(pVM);
    21752173    }
    21762174
     
    21932191        MMHyperFree(pVM, pRam);
    21942192    }
    2195     PGMPhysInvalidatePageMapTLB(pVM);
    2196 
     2193    pgmPhysInvalidatePageMapTLB(pVM);
     2194
     2195    pgmUnlock(pVM);
    21972196    return rc;
    21982197}
     
    22142213    VM_ASSERT_EMT(pVM);
    22152214
    2216 /** @todo this needs to own the PGM lock! */
     2215    int rc = pgmLock(pVM);
     2216    AssertRCReturn(rc, rc);
     2217
    22172218    /*
    22182219     * First deregister the handler, then check if we should remove the ram range.
    22192220     */
    2220     int rc = PGMHandlerPhysicalDeregister(pVM, GCPhys);
     2221    rc = PGMHandlerPhysicalDeregister(pVM, GCPhys);
    22212222    if (RT_SUCCESS(rc))
    22222223    {
     
    22912292                    AssertMsg(PGM_PAGE_IS_ZERO(pPage), ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage));
    22922293                    if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO)
    2293                         PGM_PAGE_SET_TYPE(pPage, PGMPAGETYPE_RAM);
     2294                        PGM_PAGE_SET_TYPE(pVM, pPage, PGMPAGETYPE_RAM);
    22942295                }
    22952296                break;
     
    23082309    VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    23092310
    2310     PGMPhysInvalidatePageMapTLB(pVM);
     2311    pgmPhysInvalidatePageMapTLB(pVM);
    23112312    pgmPhysInvalidRamRangeTlbs(pVM);
     2313    pgmUnlock(pVM);
    23122314    return rc;
    23132315}
     
    24592461                *ppv = pvPages;
    24602462                RTMemTmpFree(paPages);
    2461                 PGMPhysInvalidatePageMapTLB(pVM);
     2463                pgmPhysInvalidatePageMapTLB(pVM);
    24622464                return VINF_SUCCESS;
    24632465            }
     
    25712573        }
    25722574    }
    2573     PGMPhysInvalidatePageMapTLB(pVM);
     2575    pgmPhysInvalidatePageMapTLB(pVM);
    25742576    pgmUnlock(pVM);
    25752577    return !cFound && iRegion != UINT32_MAX ? VERR_NOT_FOUND : rc;
     
    26812683
    26822684            RTHCPHYS const HCPhys = PGM_PAGE_GET_HCPHYS(pPageSrc);
    2683             PGM_PAGE_SET_HCPHYS(pPageDst, HCPhys);
    2684             PGM_PAGE_SET_TYPE(pPageDst, PGMPAGETYPE_MMIO2);
    2685             PGM_PAGE_SET_STATE(pPageDst, PGM_PAGE_STATE_ALLOCATED);
    2686             PGM_PAGE_SET_PDE_TYPE(pPageDst, PGM_PAGE_PDE_TYPE_DONTCARE);
    2687             PGM_PAGE_SET_PTE_INDEX(pPageDst, 0);
    2688             PGM_PAGE_SET_TRACKING(pPageDst, 0);
     2685            PGM_PAGE_SET_HCPHYS(pVM, pPageDst, HCPhys);
     2686            PGM_PAGE_SET_TYPE(pVM, pPageDst, PGMPAGETYPE_MMIO2);
     2687            PGM_PAGE_SET_STATE(pVM, pPageDst, PGM_PAGE_STATE_ALLOCATED);
     2688            PGM_PAGE_SET_PDE_TYPE(pVM, pPageDst, PGM_PAGE_PDE_TYPE_DONTCARE);
     2689            PGM_PAGE_SET_PTE_INDEX(pVM, pPageDst, 0);
     2690            PGM_PAGE_SET_TRACKING(pVM, pPageDst, 0);
    26892691
    26902692            pVM->pgm.s.cZeroPages--;
     
    26952697
    26962698        /* Flush physical page map TLB. */
    2697         PGMPhysInvalidatePageMapTLB(pVM);
     2699        pgmPhysInvalidatePageMapTLB(pVM);
    26982700
    26992701        if (cPendingPages)
     
    27212723        while (cPagesLeft-- > 0)
    27222724        {
    2723             PGM_PAGE_SET_TRACKING(pPageSrc, 0);
    2724             PGM_PAGE_SET_PTE_INDEX(pPageSrc, 0);
     2725            PGM_PAGE_SET_TRACKING(pVM, pPageSrc, 0);
     2726            PGM_PAGE_SET_PTE_INDEX(pVM, pPageSrc, 0);
    27252727            pPageSrc++;
    27262728        }
     
    27332735    }
    27342736
    2735     PGMPhysInvalidatePageMapTLB(pVM);
     2737    pgmPhysInvalidatePageMapTLB(pVM);
    27362738    return VINF_SUCCESS;
    27372739}
     
    27912793
    27922794        /* Flush physical page map TLB. */
    2793         PGMPhysInvalidatePageMapTLB(pVM);
     2795        pgmPhysInvalidatePageMapTLB(pVM);
    27942796
    27952797        GCPhysRangeREM = NIL_RTGCPHYS;  /* shuts up gcc */
     
    28172819    VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    28182820
    2819     PGMPhysInvalidatePageMapTLB(pVM);
     2821    pgmPhysInvalidatePageMapTLB(pVM);
    28202822    pgmPhysInvalidRamRangeTlbs(pVM);
    28212823    pgmUnlock(pVM);
     
    29392941
    29402942/**
    2941  * Registers a ROM image.
    2942  *
    2943  * Shadowed ROM images requires double the amount of backing memory, so,
    2944  * don't use that unless you have to. Shadowing of ROM images is process
    2945  * where we can select where the reads go and where the writes go. On real
    2946  * hardware the chipset provides means to configure this. We provide
    2947  * PGMR3PhysProtectROM() for this purpose.
    2948  *
    2949  * A read-only copy of the ROM image will always be kept around while we
    2950  * will allocate RAM pages for the changes on demand (unless all memory
    2951  * is configured to be preallocated).
     2943 * Worker for PGMR3PhysRomRegister.
     2944 *
     2945 * This is here to simplify lock management, i.e. the caller does all the
     2946 * locking and we can simply return without needing to remember to unlock
     2947 * anything first.
    29522948 *
    29532949 * @returns VBox status.
     
    29642960 *                              and/or PGMPHYS_ROM_FLAGS_PERMANENT_BINARY.
    29652961 * @param   pszDesc             Pointer to description string. This must not be freed.
    2966  *
    2967  * @remark  There is no way to remove the rom, automatically on device cleanup or
    2968  *          manually from the device yet. This isn't difficult in any way, it's
    2969  *          just not something we expect to be necessary for a while.
    2970  */
    2971 VMMR3DECL(int) PGMR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPHYS cb,
    2972                                     const void *pvBinary, uint32_t cbBinary, uint32_t fFlags, const char *pszDesc)
    2973 {
    2974     Log(("PGMR3PhysRomRegister: pDevIns=%p GCPhys=%RGp(-%RGp) cb=%RGp pvBinary=%p cbBinary=%#x fFlags=%#x pszDesc=%s\n",
    2975          pDevIns, GCPhys, GCPhys + cb, cb, pvBinary, cbBinary, fFlags, pszDesc));
    2976 
     2962 */
     2963static int pgmR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPHYS cb,
     2964                                const void *pvBinary, uint32_t cbBinary, uint32_t fFlags, const char *pszDesc)
     2965{
    29772966    /*
    29782967     * Validate input.
     
    30823071    }
    30833072
    3084     pgmLock(pVM);
    30853073    rc = GMMR3AllocatePagesPerform(pVM, pReq);
    3086     pgmUnlock(pVM);
    30873074    if (RT_FAILURE(rc))
    30883075    {
     
    31033090        if (RT_SUCCESS(rc))
    31043091        {
    3105             pgmLock(pVM);
    3106 
    31073092            /*
    31083093             * Initialize and insert the RAM range (if required).
     
    31413126                for (uint32_t iPage = 0; iPage < cPages; iPage++, pPage++, pRomPage++)
    31423127                {
    3143                     PGM_PAGE_SET_TYPE(pPage,   PGMPAGETYPE_ROM);
    3144                     PGM_PAGE_SET_HCPHYS(pPage, pReq->aPages[iPage].HCPhysGCPhys);
    3145                     PGM_PAGE_SET_STATE(pPage,  PGM_PAGE_STATE_ALLOCATED);
    3146                     PGM_PAGE_SET_PAGEID(pPage, pReq->aPages[iPage].idPage);
    3147                     PGM_PAGE_SET_PDE_TYPE(pPage, PGM_PAGE_PDE_TYPE_DONTCARE);
    3148                     PGM_PAGE_SET_PTE_INDEX(pPage, 0);
    3149                     PGM_PAGE_SET_TRACKING(pPage, 0);
     3128                    PGM_PAGE_SET_TYPE(pVM, pPage,   PGMPAGETYPE_ROM);
     3129                    PGM_PAGE_SET_HCPHYS(pVM, pPage, pReq->aPages[iPage].HCPhysGCPhys);
     3130                    PGM_PAGE_SET_STATE(pVM, pPage,  PGM_PAGE_STATE_ALLOCATED);
     3131                    PGM_PAGE_SET_PAGEID(pVM, pPage, pReq->aPages[iPage].idPage);
     3132                    PGM_PAGE_SET_PDE_TYPE(pVM, pPage, PGM_PAGE_PDE_TYPE_DONTCARE);
     3133                    PGM_PAGE_SET_PTE_INDEX(pVM, pPage, 0);
     3134                    PGM_PAGE_SET_TRACKING(pVM, pPage, 0);
    31503135
    31513136                    pRomPage->Virgin = *pPage;
     
    31593144
    31603145            /* Flush physical page map TLB. */
    3161             PGMPhysInvalidatePageMapTLB(pVM);
    3162 
    3163             pgmUnlock(pVM);
     3146            pgmPhysInvalidatePageMapTLB(pVM);
    31643147
    31653148
     
    31993182            if (RT_SUCCESS(rc))
    32003183            {
    3201                 pgmLock(pVM);
    3202 
    32033184                /*
    32043185                 * Copy the image over to the virgin pages.
     
    32853266                    }
    32863267
    3287                     PGMPhysInvalidatePageMapTLB(pVM);
     3268                    pgmPhysInvalidatePageMapTLB(pVM);
    32883269                    GMMR3AllocatePagesCleanup(pReq);
    3289                     pgmUnlock(pVM);
    32903270                    return VINF_SUCCESS;
    32913271                }
     
    32933273                /* bail out */
    32943274
    3295                 pgmUnlock(pVM);
    32963275                int rc2 = PGMHandlerPhysicalDeregister(pVM, GCPhys);
    32973276                AssertRC(rc2);
    3298                 pgmLock(pVM);
    32993277            }
    33003278
     
    33113289    GMMR3FreeAllocatedPages(pVM, pReq);
    33123290    GMMR3AllocatePagesCleanup(pReq);
     3291    return rc;
     3292}
     3293
     3294
     3295/**
     3296 * Registers a ROM image.
     3297 *
     3298 * Shadowed ROM images requires double the amount of backing memory, so,
     3299 * don't use that unless you have to. Shadowing of ROM images is process
     3300 * where we can select where the reads go and where the writes go. On real
     3301 * hardware the chipset provides means to configure this. We provide
     3302 * PGMR3PhysProtectROM() for this purpose.
     3303 *
     3304 * A read-only copy of the ROM image will always be kept around while we
     3305 * will allocate RAM pages for the changes on demand (unless all memory
     3306 * is configured to be preallocated).
     3307 *
     3308 * @returns VBox status.
     3309 * @param   pVM                 VM Handle.
     3310 * @param   pDevIns             The device instance owning the ROM.
     3311 * @param   GCPhys              First physical address in the range.
     3312 *                              Must be page aligned!
     3313 * @param   cb                  The size of the range (in bytes).
     3314 *                              Must be page aligned!
     3315 * @param   pvBinary            Pointer to the binary data backing the ROM image.
     3316 * @param   cbBinary            The size of the binary data pvBinary points to.
     3317 *                              This must be less or equal to @a cb.
     3318 * @param   fFlags              Mask of flags. PGMPHYS_ROM_FLAGS_SHADOWED
     3319 *                              and/or PGMPHYS_ROM_FLAGS_PERMANENT_BINARY.
     3320 * @param   pszDesc             Pointer to description string. This must not be freed.
     3321 *
     3322 * @remark  There is no way to remove the rom, automatically on device cleanup or
     3323 *          manually from the device yet. This isn't difficult in any way, it's
     3324 *          just not something we expect to be necessary for a while.
     3325 */
     3326VMMR3DECL(int) PGMR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPHYS cb,
     3327                                    const void *pvBinary, uint32_t cbBinary, uint32_t fFlags, const char *pszDesc)
     3328{
     3329    Log(("PGMR3PhysRomRegister: pDevIns=%p GCPhys=%RGp(-%RGp) cb=%RGp pvBinary=%p cbBinary=%#x fFlags=%#x pszDesc=%s\n",
     3330         pDevIns, GCPhys, GCPhys + cb, cb, pvBinary, cbBinary, fFlags, pszDesc));
     3331    pgmLock(pVM);
     3332    int rc = pgmR3PhysRomRegister(pVM, pDevIns, GCPhys, cb, pvBinary, cbBinary, fFlags, pszDesc);
    33133333    pgmUnlock(pVM);
    33143334    return rc;
     
    34283448int pgmR3PhysRomReset(PVM pVM)
    34293449{
    3430     Assert(PGMIsLockOwner(pVM));
     3450    PGM_LOCK_ASSERT_OWNER(pVM);
    34313451    for (PPGMROMRANGE pRom = pVM->pgm.s.pRomRangesR3; pRom; pRom = pRom->pNextR3)
    34323452    {
     
    36713691static DECLCALLBACK(int) pgmR3PhysChunkAgeingRolloverCallback(PAVLU32NODECORE pNode, void *pvUser)
    36723692{
    3673     Assert(PGMIsLockOwner((PVM)pvUser));
     3693    PGM_LOCK_ASSERT_OWNER(pVM);
     3694
    36743695    /* Age compression - ASSUMES iNow == 4. */
    36753696    PPGMCHUNKR3MAP pChunk = (PPGMCHUNKR3MAP)pNode;
     
    37853806static int32_t pgmR3PhysChunkFindUnmapCandidate(PVM pVM)
    37863807{
    3787     Assert(PGMIsLockOwner(pVM));
     3808    PGM_LOCK_ASSERT_OWNER(pVM);
    37883809
    37893810    /*
     
    39353956    int rc;
    39363957
    3937     Assert(PGMIsLockOwner(pVM));
     3958    PGM_LOCK_ASSERT_OWNER(pVM);
     3959
    39383960    /*
    39393961     * Allocate a new tracking structure first.
     
    40374059    }
    40384060    /* The page map TLB references chunks, so invalidate that one too. */
    4039     PGMPhysInvalidatePageMapTLB(pVM);
     4061    pgmPhysInvalidatePageMapTLB(pVM);
    40404062    pgmUnlock(pVM);
    40414063}
     
    41064128                 */
    41074129                pVM->pgm.s.cPrivatePages++;
    4108                 PGM_PAGE_SET_HCPHYS(pPage, HCPhys);
    4109                 PGM_PAGE_SET_PAGEID(pPage, idPage);
    4110                 PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ALLOCATED);
    4111                 PGM_PAGE_SET_PDE_TYPE(pPage, PGM_PAGE_PDE_TYPE_PDE);
    4112                 PGM_PAGE_SET_PTE_INDEX(pPage, 0);
    4113                 PGM_PAGE_SET_TRACKING(pPage, 0);
     4130                PGM_PAGE_SET_HCPHYS(pVM, pPage, HCPhys);
     4131                PGM_PAGE_SET_PAGEID(pVM, pPage, idPage);
     4132                PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED);
     4133                PGM_PAGE_SET_PDE_TYPE(pVM, pPage, PGM_PAGE_PDE_TYPE_PDE);
     4134                PGM_PAGE_SET_PTE_INDEX(pVM, pPage, 0);
     4135                PGM_PAGE_SET_TRACKING(pVM, pPage, 0);
    41144136
    41154137                /* Somewhat dirty assumption that page ids are increasing. */
     
    41274149            /* Flush all TLBs. */
    41284150            PGM_INVL_ALL_VCPU_TLBS(pVM);
    4129             PGMPhysInvalidatePageMapTLB(pVM);
     4151            pgmPhysInvalidatePageMapTLB(pVM);
    41304152        }
    41314153        pVM->pgm.s.cLargeHandyPages = 0;
     
    43234345     * Assert sanity.
    43244346     */
    4325     Assert(PGMIsLockOwner(pVM));
     4347    PGM_LOCK_ASSERT_OWNER(pVM);
    43264348    if (RT_UNLIKELY(    PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_RAM
    43274349                    &&  PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_ROM_SHADOW))
     
    43594381    if (PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_WRITE_MONITORED)
    43604382    {
    4361         PGM_PAGE_SET_WRITTEN_TO(pPage);
     4383        PGM_PAGE_SET_WRITTEN_TO(pVM, pPage);
    43624384        pVM->pgm.s.cWrittenToPages++;
    43634385    }
     
    43664388     * pPage = ZERO page.
    43674389     */
    4368     PGM_PAGE_SET_HCPHYS(pPage, pVM->pgm.s.HCPhysZeroPg);
    4369     PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
    4370     PGM_PAGE_SET_PAGEID(pPage, NIL_GMM_PAGEID);
    4371     PGM_PAGE_SET_PDE_TYPE(pPage, PGM_PAGE_PDE_TYPE_DONTCARE);
    4372     PGM_PAGE_SET_PTE_INDEX(pPage, 0);
    4373     PGM_PAGE_SET_TRACKING(pPage, 0);
     4390    PGM_PAGE_SET_HCPHYS(pVM, pPage, pVM->pgm.s.HCPhysZeroPg);
     4391    PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
     4392    PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID);
     4393    PGM_PAGE_SET_PDE_TYPE(pVM, pPage, PGM_PAGE_PDE_TYPE_DONTCARE);
     4394    PGM_PAGE_SET_PTE_INDEX(pVM, pPage, 0);
     4395    PGM_PAGE_SET_TRACKING(pVM, pPage, 0);
    43744396
    43754397    /* Flush physical page map TLB entry. */
    4376     PGMPhysInvalidatePageMapTLBEntry(pVM, GCPhys);
     4398    pgmPhysInvalidatePageMapTLBEntry(pVM, GCPhys);
    43774399
    43784400    /*
  • trunk/src/VBox/VMM/VMMR3/PGMPool.cpp

    r36960 r37354  
    809809        iPage = pRam->cb >> PAGE_SHIFT;
    810810        while (iPage-- > 0)
    811             PGM_PAGE_SET_TRACKING(&pRam->aPages[iPage], 0);
     811            PGM_PAGE_SET_TRACKING(pVM, &pRam->aPages[iPage], 0);
    812812    }
    813813
     
    906906void pgmR3PoolWriteProtectPages(PVM pVM)
    907907{
    908     Assert(PGMIsLockOwner(pVM));
     908    PGM_LOCK_ASSERT_OWNER(pVM);
    909909    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    910910    unsigned cLeft = pPool->cUsedPages;
  • trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp

    r37110 r37354  
    282282static int pgmR3LoadRomRanges(PVM pVM, PSSMHANDLE pSSM)
    283283{
    284     Assert(PGMIsLockOwner(pVM));
     284    PGM_LOCK_ASSERT_OWNER(pVM);
    285285
    286286    for (PPGMROMRANGE pRom = pVM->pgm.s.pRomRangesR3; pRom; pRom = pRom->pNextR3)
     
    673673static int pgmR3LoadMmio2Ranges(PVM pVM, PSSMHANDLE pSSM)
    674674{
    675     Assert(PGMIsLockOwner(pVM));
     675    PGM_LOCK_ASSERT_OWNER(pVM);
    676676
    677677    for (PPGMMMIO2RANGE pMmio2 = pVM->pgm.s.pMmio2RangesR3; pMmio2; pMmio2 = pMmio2->pNextR3)
     
    13441344                                {
    13451345                                    Assert(paLSPages[iPage].fWriteMonitored);
    1346                                     PGM_PAGE_CLEAR_WRITTEN_TO(&pCur->aPages[iPage]);
     1346                                    PGM_PAGE_CLEAR_WRITTEN_TO(pVM, &pCur->aPages[iPage]);
    13471347                                    Assert(pVM->pgm.s.cWrittenToPages > 0);
    13481348                                    pVM->pgm.s.cWrittenToPages--;
     
    14721472                            {
    14731473                                AssertMsgFailed(("%R[pgmpage]", &pCur->aPages[iPage])); /* shouldn't happen. */
    1474                                 PGM_PAGE_SET_STATE(&pCur->aPages[iPage], PGM_PAGE_STATE_ALLOCATED);
     1474                                PGM_PAGE_SET_STATE(pVM, &pCur->aPages[iPage], PGM_PAGE_STATE_ALLOCATED);
    14751475                                Assert(pVM->pgm.s.cMonitoredPages > 0);
    14761476                                pVM->pgm.s.cMonitoredPages--;
     
    14781478                            if (PGM_PAGE_IS_WRITTEN_TO(&pCur->aPages[iPage]))
    14791479                            {
    1480                                 PGM_PAGE_CLEAR_WRITTEN_TO(&pCur->aPages[iPage]);
     1480                                PGM_PAGE_CLEAR_WRITTEN_TO(pVM, &pCur->aPages[iPage]);
    14811481                                Assert(pVM->pgm.s.cWrittenToPages > 0);
    14821482                                pVM->pgm.s.cWrittenToPages--;
     
    16391639                                    }
    16401640                                    rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
    1641                                     PGM_PAGE_CLEAR_WRITTEN_TO(pCurPage);
     1641                                    PGM_PAGE_CLEAR_WRITTEN_TO(pVM, pCurPage);
    16421642                                    PGM_PAGE_CLEAR_FT_DIRTY(pCurPage);
    16431643                                }
     
    17681768                {
    17691769                    PPGMPAGE pPage = &pCur->aPages[iPage];
    1770                     PGM_PAGE_CLEAR_WRITTEN_TO(pPage);
     1770                    PGM_PAGE_CLEAR_WRITTEN_TO(pVM, pPage);
    17711771                    if (PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_WRITE_MONITORED)
    17721772                    {
    1773                         PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ALLOCATED);
     1773                        PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED);
    17741774                        cMonitoredPages++;
    17751775                    }
     
    26672667                            if (uVersion == PGM_SAVED_STATE_VERSION_BALLOON_BROKEN)
    26682668                                break;
    2669                             PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO);
     2669                            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
    26702670                            break;
    26712671                        }
     
    27142714                        }
    27152715                        Assert(PGM_PAGE_IS_ZERO(pPage));
    2716                         PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_BALLOONED);
     2716                        PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_BALLOONED);
    27172717                        break;
    27182718                    }
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