VirtualBox

Changeset 16634 in vbox for trunk


Ignore:
Timestamp:
Feb 10, 2009 2:54:02 PM (16 years ago)
Author:
vboxsync
Message:

VBOX_WITH_PGMPOOL_PAGING_ONLY: fixed invalidation of pae/32 bit pds

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r16628 r16634  
    383383                if (iShwPdpt == pPage->enmKind - PGMPOOLKIND_PAE_PD0_FOR_32BIT_PD)
    384384                {
    385                     if ((uShw.pPDPae->a[iShw].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
     385                    for (unsigned i=0;i<2;i++)
    386386                    {
    387                         Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
    388                         VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    389                         LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw=%#x!\n", iShwPdpt, iShw));
    390                     }
    391                     else
    392                     if (uShw.pPDPae->a[iShw].n.u1Present)
    393                     {
    394                         LogFlow(("pgmPoolMonitorChainChanging: pae pd iShw=%#x: %RX64 -> freeing it!\n", iShw, uShw.pPDPae->a[iShw].u));
    395                         pgmPoolFree(pPool->CTX_SUFF(pVM),
    396                                     uShw.pPDPae->a[iShw].u & X86_PDE_PAE_PG_MASK,
    397                                     pPage->idx,
    398                                     iShw);
    399                         uShw.pPDPae->a[iShw].u = 0;
    400                     }
    401 
    402                     /* paranoia / a bit assumptive. */
    403                     if (   pCpu
    404                         && (off & 3)
    405                         && (off & 3) + cbWrite > 4)
    406                     {
    407                         const unsigned iShw2 = iShw + 2;
    408                         if (iShw2 < RT_ELEMENTS(uShw.pPDPae->a))
     387                        if ((uShw.pPDPae->a[iShw + i].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
    409388                        {
    410                             if ((uShw.pPDPae->a[iShw2].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
     389                            Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
     390                            VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
     391                            LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw=%#x!\n", iShwPdpt, iShw+i));
     392                        }
     393                        else
     394                        if (uShw.pPDPae->a[iShw+i].n.u1Present)
     395                        {
     396                            LogFlow(("pgmPoolMonitorChainChanging: pae pd iShw=%#x: %RX64 -> freeing it!\n", iShw+i, uShw.pPDPae->a[iShw+i].u));
     397                            pgmPoolFree(pPool->CTX_SUFF(pVM),
     398                                        uShw.pPDPae->a[iShw+i].u & X86_PDE_PAE_PG_MASK,
     399                                        pPage->idx,
     400                                        iShw + i);
     401                            uShw.pPDPae->a[iShw+i].u = 0;
     402                        }
     403
     404                        /* paranoia / a bit assumptive. */
     405                        if (   pCpu
     406                            && (off & 3)
     407                            && (off & 3) + cbWrite > 4)
     408                        {
     409                            const unsigned iShw2 = iShw + 2 + i;
     410                            if (iShw2 < RT_ELEMENTS(uShw.pPDPae->a))
    411411                            {
    412                                 Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
    413                                 VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    414                                 LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw2=%#x!\n", iShwPdpt, iShw2));
    415                             }
    416                             else
    417                             if (uShw.pPDPae->a[iShw2].n.u1Present)
    418                             {
    419                                 LogFlow(("pgmPoolMonitorChainChanging: pae pd iShw=%#x: %RX64 -> freeing it!\n", iShw2, uShw.pPDPae->a[iShw2].u));
    420                                 pgmPoolFree(pPool->CTX_SUFF(pVM),
    421                                             uShw.pPDPae->a[iShw2].u & X86_PDE_PAE_PG_MASK,
    422                                             pPage->idx,
    423                                             iShw2);
    424                                 uShw.pPDPae->a[iShw2].u = 0;
     412                                if ((uShw.pPDPae->a[iShw2].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
     413                                {
     414                                    Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
     415                                    VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
     416                                    LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw2=%#x!\n", iShwPdpt, iShw2));
     417                                }
     418                                else
     419                                if (uShw.pPDPae->a[iShw2].n.u1Present)
     420                                {
     421                                    LogFlow(("pgmPoolMonitorChainChanging: pae pd iShw=%#x: %RX64 -> freeing it!\n", iShw2, uShw.pPDPae->a[iShw2].u));
     422                                    pgmPoolFree(pPool->CTX_SUFF(pVM),
     423                                                uShw.pPDPae->a[iShw2].u & X86_PDE_PAE_PG_MASK,
     424                                                pPage->idx,
     425                                                iShw2);
     426                                    uShw.pPDPae->a[iShw2].u = 0;
     427                                }
    425428                            }
    426429                        }
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