VirtualBox

Changeset 4414 in vbox


Ignore:
Timestamp:
Aug 29, 2007 8:56:57 AM (17 years ago)
Author:
vboxsync
Message:

Use PGMPhysRead/WriteGCPtrSafe to respect access handlers, set dirty/accessed bits and deal with crossing page boundaries.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r4401 r4414  
    281281DECLINLINE(int) emRamRead(PVM pVM, void *pDest, RTGCPTR GCSrc, uint32_t cb)
    282282{
    283     int rc;
    284 #ifdef IN_GC
    285     rc = MMGCRamRead(pVM, pDest, GCSrc, cb);
     283#ifdef IN_GC
     284    int rc = MMGCRamRead(pVM, pDest, GCSrc, cb);
    286285    if (RT_LIKELY(rc != VERR_ACCESS_DENIED))
    287286        return rc;
     
    291290     * instruction and it either flushed the TLB or the CPU reused it.
    292291     */
    293 #endif
    294292    RTGCPHYS    GCPhys;
    295293    RTGCUINTPTR offset;
     
    301299    PGMPhysRead(pVM, GCPhys + offset, pDest, cb);
    302300    return VINF_SUCCESS;
     301#else
     302    return PGMPhysReadGCPtrSafe(pVM, pDest, GCSrc, cb);
     303#endif
    303304}
    304305
     
    329330
    330331#else
    331 
    332     int         rc;
    333     RTGCPHYS    GCPhys;
    334     RTGCUINTPTR offset;
    335 
    336     offset = GCDest & PAGE_OFFSET_MASK;
    337     rc = PGMPhysGCPtr2GCPhys(pVM, GCDest, &GCPhys);
    338     AssertRCReturn(rc, rc);
    339     PGMPhysWrite(pVM, GCPhys + offset, pSrc, cb);
    340     return VINF_SUCCESS;
     332    return PGMPhysWriteGCPtrSafe(pVM, GCDest, pSrc, cb);
    341333#endif
    342334}
  • trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp

    r4411 r4414  
    461461    return MMGCRamReadNoTrapHandler(pDest, GCSrc, cb);
    462462#else
    463     int         rc;
    464     RTGCPHYS    GCPhys;
    465     RTGCUINTPTR offset;
    466 
    467     offset = GCSrc & PAGE_OFFSET_MASK;
    468 
    469     /** @todo optimize the loop; no need to convert the address all the time */
    470     rc = PGMPhysGCPtr2GCPhys(pVM, GCSrc, &GCPhys);
    471     AssertRCReturn(rc, rc);
    472     PGMPhysRead(pVM, GCPhys + offset, pDest, cb);
    473     return VINF_SUCCESS;
     463    return PGMPhysReadGCPtrSafe(pVM, pDest, GCSrc, cb);
    474464#endif
    475465}
     
    480470    return MMGCRamWriteNoTrapHandler(GCDest, pSrc, cb);
    481471#else
    482     int         rc;
    483     RTGCPHYS    GCPhys;
    484     RTGCUINTPTR offset;
    485 
    486     /** @todo optimize the loop; no need to convert the address all the time */
    487     offset = GCDest & PAGE_OFFSET_MASK;
    488     rc = PGMPhysGCPtr2GCPhys(pVM, GCDest, &GCPhys);
    489     AssertRCReturn(rc, rc);
    490     PGMPhysWrite(pVM, GCPhys + offset, pSrc, cb);
    491     return VINF_SUCCESS;
     472    return PGMPhysWriteGCPtrSafe(pVM, GCDest, pSrc, cb);
    492473#endif
    493474}
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