VirtualBox

Changeset 4417 in vbox for trunk/src


Ignore:
Timestamp:
Aug 29, 2007 9:12:42 AM (17 years ago)
Author:
vboxsync
Message:

Forgot to convert addresses

File:
1 edited

Legend:

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

    r4415 r4417  
    15641564PGMDECL(int) PGMPhysReadGCPtrSafe(PVM pVM, void *pvDst, RTGCPTR GCPtrSrc, size_t cb)
    15651565{
     1566    RTGCPHYS    GCPhys;
     1567    RTGCUINTPTR offset;
     1568    int         rc;
     1569
    15661570    /*
    15671571     * Anything to do?
     
    15771581    if (((RTGCUINTPTR)GCPtrSrc & PAGE_OFFSET_MASK) + cb <= PAGE_SIZE)
    15781582    {
     1583        /* Convert virtual to physical address */
     1584        offset = GCPtrSrc & PAGE_OFFSET_MASK;
     1585        rc = PGMPhysGCPtr2GCPhys(pVM, GCPtrSrc, &GCPhys);
     1586        AssertRCReturn(rc, rc);
     1587
     1588        /* mark the guest page as accessed. */
     1589        rc = PGMGstModifyPage(pVM, GCPtrSrc, 1, X86_PTE_A, ~(uint64_t)(X86_PTE_A));
     1590        AssertRC(rc);
     1591
     1592        PGMPhysRead(pVM, GCPhys + offset, pvDst, cb);
     1593        return VINF_SUCCESS;
     1594    }
     1595
     1596    /*
     1597     * Page by page.
     1598     */
     1599    for (;;)
     1600    {
     1601        /* Convert virtual to physical address */
     1602        offset = GCPtrSrc & PAGE_OFFSET_MASK;
     1603        rc = PGMPhysGCPtr2GCPhys(pVM, GCPtrSrc, &GCPhys);
     1604        AssertRCReturn(rc, rc);
     1605
    15791606        /* mark the guest page as accessed. */
    15801607        int rc = PGMGstModifyPage(pVM, GCPtrSrc, 1, X86_PTE_A, ~(uint64_t)(X86_PTE_A));
    15811608        AssertRC(rc);
    15821609
    1583         PGMPhysRead(pVM, GCPtrSrc, pvDst, cb);
    1584         return VINF_SUCCESS;
    1585     }
    1586 
    1587     /*
    1588      * Page by page.
    1589      */
    1590     for (;;)
    1591     {
    1592         /* mark the guest page as accessed. */
    1593         int rc = PGMGstModifyPage(pVM, GCPtrSrc, 1, X86_PTE_A, ~(uint64_t)(X86_PTE_A));
    1594         AssertRC(rc);
    1595 
    15961610        /* copy */
    15971611        size_t cbRead = PAGE_SIZE - ((RTGCUINTPTR)GCPtrSrc & PAGE_OFFSET_MASK);
    15981612        if (cbRead >= cb)
    15991613        {
    1600             PGMPhysRead(pVM, GCPtrSrc, pvDst, cb);
     1614            PGMPhysRead(pVM, GCPhys + offset, pvDst, cb);
    16011615            return VINF_SUCCESS;
    16021616        }
    1603         PGMPhysRead(pVM, GCPtrSrc, pvDst, cbRead);
     1617        PGMPhysRead(pVM, GCPhys + offset, pvDst, cbRead);
    16041618
    16051619        /* next */
     
    16261640PGMDECL(int) PGMPhysWriteGCPtrSafe(PVM pVM, RTGCPTR GCPtrDst, const void *pvSrc, size_t cb)
    16271641{
     1642    RTGCPHYS    GCPhys;
     1643    RTGCUINTPTR offset;
     1644    int         rc;
     1645
    16281646    /*
    16291647     * Anything to do?
     
    16391657    if (((RTGCUINTPTR)GCPtrDst & PAGE_OFFSET_MASK) + cb <= PAGE_SIZE)
    16401658    {
     1659        /* Convert virtual to physical address */
     1660        offset = GCPtrDst & PAGE_OFFSET_MASK;
     1661        rc = PGMPhysGCPtr2GCPhys(pVM, GCPtrDst, &GCPhys);
     1662        AssertRCReturn(rc, rc);
     1663
    16411664        /* mark the guest page as accessed and dirty. */
    1642         int rc = PGMGstModifyPage(pVM, GCPtrDst, 1, X86_PTE_A | X86_PTE_D, ~(uint64_t)(X86_PTE_A | X86_PTE_D));
     1665        rc = PGMGstModifyPage(pVM, GCPtrDst, 1, X86_PTE_A | X86_PTE_D, ~(uint64_t)(X86_PTE_A | X86_PTE_D));
    16431666        AssertRC(rc);
    16441667
    1645         PGMPhysWrite(pVM, GCPtrDst, pvSrc, cb);
     1668        PGMPhysWrite(pVM, GCPhys + offset, pvSrc, cb);
    16461669        return VINF_SUCCESS;
    16471670    }
     
    16521675    for (;;)
    16531676    {
     1677        /* Convert virtual to physical address */
     1678        offset = GCPtrDst & PAGE_OFFSET_MASK;
     1679        rc = PGMPhysGCPtr2GCPhys(pVM, GCPtrDst, &GCPhys);
     1680        AssertRCReturn(rc, rc);
     1681
    16541682        /* mark the guest page as accessed and dirty. */
    1655         int rc = PGMGstModifyPage(pVM, GCPtrDst, 1, X86_PTE_A | X86_PTE_D, ~(uint64_t)(X86_PTE_A | X86_PTE_D));
     1683        rc = PGMGstModifyPage(pVM, GCPtrDst, 1, X86_PTE_A | X86_PTE_D, ~(uint64_t)(X86_PTE_A | X86_PTE_D));
    16561684        AssertRC(rc);
    16571685
     
    16601688        if (cbWrite >= cb)
    16611689        {
    1662             PGMPhysWrite(pVM, GCPtrDst, pvSrc, cb);
     1690            PGMPhysWrite(pVM, GCPhys + offset, pvSrc, cb);
    16631691            return VINF_SUCCESS;
    16641692        }
    1665         PGMPhysWrite(pVM, GCPtrDst, pvSrc, cbWrite);
     1693        PGMPhysWrite(pVM, GCPhys + offset, pvSrc, cbWrite);
    16661694
    16671695        /* next */
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