VirtualBox

Changeset 31784 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Aug 19, 2010 11:42:18 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64972
Message:

PGM: Make sure we deploy the MMIO hack on all possible pages. Physical handler stats.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r31780 r31784  
    176176             * ASSUMES that there is only one handler per page or that they have similar write properties.
    177177             */
    178             if (    pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
    179                 && !(uErr & X86_TRAP_PF_P))
     178            if (   !(uErr & X86_TRAP_PF_P)
     179                &&  pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE)
    180180            {
    181181#   if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     
    195195            }
    196196#  endif
     197#  ifdef PGM_WITH_MMIO_OPTIMIZATIONS
     198            /*
     199             * If the access was not thru a #PF(RSVD|...) resync the page.
     200             */
     201            if (   !(uErr & X86_TRAP_PF_RSVD)
     202                && pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
     203#   if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     204                && pGstWalk->Core.fEffectiveRW
     205                && !pGstWalk->Core.fEffectiveUS /** @todo Remove pGstWalk->Core.fEffectiveUS and X86_PTE_US further down in the sync code. */
     206#   endif
     207               )
     208            {
     209#   if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     210                rc = PGM_BTH_NAME(SyncPage)(pVCpu, pGstWalk->Pde, pvFault, PGM_SYNC_NR_PAGES, uErr);
     211#   else
     212                rc = PGM_BTH_NAME(SyncPage)(pVCpu, PdeSrcDummy, pvFault, PGM_SYNC_NR_PAGES, uErr);
     213#   endif
     214                if (    RT_FAILURE(rc)
     215                    || rc == VINF_PGM_SYNCPAGE_MODIFIED_PDE)
     216                {
     217                    AssertRC(rc);
     218                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersOutOfSync);
     219                    STAM_STATS({ pVCpu->pgm.s.CTX_SUFF(pStatTrap0eAttribution) = &pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eTime2OutOfSyncHndPhys; });
     220                    return rc;
     221                }
     222            }
     223#  endif
    197224
    198225            AssertMsg(   pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
     
    200227                      ("Unexpected trap for physical handler: %08X (phys=%08x) pPage=%R[pgmpage] uErr=%X, enum=%d\n",
    201228                       pvFault, GCPhysFault, pPage, uErr, pCur->enmType));
     229            if (pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE)
     230                STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysWrite);
     231            else
     232            {
     233                STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysAll);
     234                if (uErr & X86_TRAP_PF_RSVD) STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysAllOpt);
     235            }
    202236
    203237            if (pCur->CTX_SUFF(pfnHandler))
     
    231265                rc = VINF_EM_RAW_EMULATE_INSTR;
    232266
    233             STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysical);
    234             if (uErr & X86_TRAP_PF_RSVD) STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysicalOpt);
    235267            STAM_STATS({ pVCpu->pgm.s.CTX_SUFF(pStatTrap0eAttribution) = &pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eTime2HndPhys; });
    236268            return rc;
     
    14711503    else if (   PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)
    14721504             && (   BTH_IS_NP_ACTIVE(pVM)
    1473                  || (fPteSrc & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_RW) /** @todo remove X86_PTE_US */
     1505                 || (fPteSrc & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_RW) /** @todo Remove X86_PTE_US here and pGstWalk->Core.fEffectiveUS before the sync page test. */
    14741506#  if PGM_SHW_TYPE == PGM_TYPE_AMD64
    14751507             && pVM->pgm.s.fLessThan52PhysicalAddressBits
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette