VirtualBox

Changeset 16663 in vbox for trunk


Ignore:
Timestamp:
Feb 11, 2009 1:17:20 PM (16 years ago)
Author:
vboxsync
Message:

VBOX_WITH_PGMPOOL_PAGING_ONLY: updates for 32 bits root pd invalidation + minor changes

File:
1 edited

Legend:

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

    r16661 r16663  
    393393                            VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    394394                            LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw=%#x!\n", iShwPdpt, iShw+i));
     395                            break;
    395396                        }
    396397                        else
     
    418419                                    VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    419420                                    LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw2=%#x!\n", iShwPdpt, iShw2));
     421                                    break;
    420422                                }
    421423                                else
     
    492494                    STAM_COUNTER_INC(&(pPool->CTX_SUFF(pVM)->pgm.s.StatRZGuestCR3WriteConflict));
    493495                    LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw=%#x!\n", iShw));
     496                    break;
    494497                }
     498#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     499                else
     500                {
     501                    if (uShw.pPD->a[iShw].n.u1Present)
     502                    {
     503                        LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw, uShw.pPD->a[iShw].u));
     504                        pgmPoolFree(pPool->CTX_SUFF(pVM),
     505                                    uShw.pPD->a[iShw].u & X86_PDE_PAE_PG_MASK,
     506                                    pPage->idx,
     507                                    iShw);
     508                        uShw.pPD->a[iShw].u = 0;
     509                    }
     510                }
     511#  endif
    495512                /* paranoia / a bit assumptive. */
    496                 else if (   pCpu
    497                          && (off & 3)
    498                          && (off & 3) + cbWrite > sizeof(X86PTE))
     513                if (   pCpu
     514                    && (off & 3)
     515                    && (off & 3) + cbWrite > sizeof(X86PTE))
    499516                {
    500517                    const unsigned iShw2 = (off + cbWrite - 1) / sizeof(X86PTE);
    501518                    if (    iShw2 != iShw
    502                         &&  iShw2 < RT_ELEMENTS(uShw.pPD->a)
    503                         &&  uShw.pPD->a[iShw2].u & PGM_PDFLAGS_MAPPING)
     519                        &&  iShw2 < RT_ELEMENTS(uShw.pPD->a))
    504520                    {
    505                         Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
    506                         STAM_COUNTER_INC(&(pPool->CTX_SUFF(pVM)->pgm.s.StatRZGuestCR3WriteConflict));
    507                         VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    508                         LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw2=%#x!\n", iShw2));
     521
     522                        if (uShw.pPD->a[iShw2].u & PGM_PDFLAGS_MAPPING)
     523                        {
     524                            Assert(pgmMapAreMappingsEnabled(&pPool->CTX_SUFF(pVM)->pgm.s));
     525                            STAM_COUNTER_INC(&(pPool->CTX_SUFF(pVM)->pgm.s.StatRZGuestCR3WriteConflict));
     526                            VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
     527                            LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw2=%#x!\n", iShw2));
     528                        }
     529#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     530                        else
     531                        {
     532                            if (uShw.pPD->a[iShw2].n.u1Present)
     533                            {
     534                                LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw2, uShw.pPD->a[iShw2].u));
     535                                pgmPoolFree(pPool->CTX_SUFF(pVM),
     536                                            uShw.pPD->a[iShw2].u & X86_PDE_PAE_PG_MASK,
     537                                            pPage->idx,
     538                                            iShw2);
     539                                uShw.pPD->a[iShw2].u = 0;
     540                            }
     541                        }
     542#  endif
    509543                    }
    510544                }
     
    583617                    STAM_COUNTER_INC(&(pPool->CTX_SUFF(pVM)->pgm.s.StatRZGuestCR3WriteConflict));
    584618                    LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw=%#x!\n", iShw));
     619                    break;
    585620                }
    586 #if defined(PGMPOOL_INVALIDATE_UPPER_SHADOW_TABLE_ENTRIES) || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
     621#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    587622                /*
    588623                 * Causes trouble when the guest uses a PDE to refer to the whole page table level
     
    625660                        LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw2=%#x!\n", iShw2));
    626661                    }
    627 #if defined(PGMPOOL_INVALIDATE_UPPER_SHADOW_TABLE_ENTRIES) || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
     662#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    628663                    else if (uShw.pPDPae->a[iShw2].n.u1Present)
    629664                    {
     
    673708                        VM_FF_SET(pPool->CTX_SUFF(pVM), VM_FF_PGM_SYNC_CR3);
    674709                        LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShw=%#x!\n", iShw));
     710                        break;
    675711                    }
    676712# ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
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