VirtualBox

Changeset 16628 in vbox for trunk/src


Ignore:
Timestamp:
Feb 10, 2009 1:07:15 PM (16 years ago)
Author:
vboxsync
Message:

VBOX_WITH_PGMPOOL_PAGING_ONLY: corrected write handler for pae/32 bits

File:
1 edited

Legend:

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

    r16626 r16628  
    389389                        LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw=%#x!\n", iShwPdpt, iShw));
    390390                    }
     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
    391402                    /* paranoia / a bit assumptive. */
    392                     else if (   pCpu
    393                              && (off & 3)
    394                              && (off & 3) + cbWrite > 4)
     403                    if (   pCpu
     404                        && (off & 3)
     405                        && (off & 3) + cbWrite > 4)
    395406                    {
    396407                        const unsigned iShw2 = iShw + 2;
    397                         if (    iShw2 < RT_ELEMENTS(uShw.pPDPae->a) /** @todo was completely wrong, it's better now after #1865 but still wrong from cross PD. */
    398                             &&  (uShw.pPDPae->a[iShw2].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
     408                        if (iShw2 < RT_ELEMENTS(uShw.pPDPae->a))
    399409                        {
    400                             Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
    401                             VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    402                             LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw2=%#x!\n", iShwPdpt, iShw2));
     410                            if ((uShw.pPDPae->a[iShw2].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
     411                            {
     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;
     425                            }
    403426                        }
    404427                    }
    405 #if 0 /* useful when running PGMAssertCR3(), a bit too troublesome for general use (TLBs). */
    406                     if (    uShw.pPDPae->a[iShw].n.u1Present
    407                         &&  !VM_FF_ISSET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3))
    408                     {
    409                         LogFlow(("pgmPoolMonitorChainChanging: iShwPdpt=%#x iShw=%#x: %RX64 -> freeing it!\n", iShwPdpt, iShw, uShw.pPDPae->a[iShw].u));
    410 # ifdef IN_RC           /* TLB load - we're pushing things a bit... */
    411                         ASMProbeReadByte(pvAddress);
    412 # endif
    413                         pgmPoolFree(pPool->CTX_SUFF(pVM), uShw.pPDPae->a[iShw].u & X86_PDE_PAE_PG_MASK, pPage->idx, iShw + iShwPdpt * X86_PG_PAE_ENTRIES);
    414                         uShw.pPDPae->a[iShw].u = 0;
    415                     }
    416 #endif
    417428                }
    418429                break;
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