VirtualBox

Changeset 2121 in vbox


Ignore:
Timestamp:
Apr 17, 2007 9:42:38 AM (18 years ago)
Author:
vboxsync
Message:

Enable movs for ring 0. (not yet used)

File:
1 edited

Legend:

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

    r2117 r2121  
    470470
    471471#ifdef IOMGC_MOVS_SUPPORT
     472
     473inline int iomRamRead(PVM pVM, void *pDest, RTGCPTR GCSrc, uint32_t cb)
     474{
     475#ifdef IN_GC
     476    return MMGCRamReadNoTrapHandler(pDest, GCSrc, cb);
     477#else
     478    int         rc;
     479    RTGCPHYS    GCPhys;
     480    RTGCUINTPTR offset;
     481
     482    offset = GCSrc & PAGE_OFFSET_MASK;
     483
     484    /** @todo optimize the loop; no need to convert the address all the time */
     485    rc = PGMPhysGCPtr2GCPhys(pVM, GCSrc, &GCPhys);
     486    AssertRCReturn(rc, rc);
     487    PGMPhysRead(pVM, GCPhys + offset, pDest, cb);
     488    return VINF_SUCCESS;
     489#endif
     490}
     491
     492inline int iomRamWrite(PVM pVM, RTGCPTR GCDest, void *pSrc, uint32_t cb)
     493{
     494#ifdef IN_GC
     495    return MMGCRamWriteNoTrapHandler(GCDest, pSrc, cb);
     496#else
     497    int         rc;
     498    RTGCPHYS    GCPhys;
     499    RTGCUINTPTR offset;
     500
     501    /** @todo optimize the loop; no need to convert the address all the time */
     502    offset = GCDest & PAGE_OFFSET_MASK;
     503    rc = PGMPhysGCPtr2GCPhys(pVM, GCDest, &GCPhys);
     504    AssertRCReturn(rc, rc);
     505    PGMPhysWrite(pVM, GCPhys + offset, pSrc, cb);
     506    return VINF_SUCCESS;
     507#endif
     508}
     509
    472510/**
    473511 * [REP] MOVSB
     
    542580
    543581        /* Convert source address ds:esi. */
    544         uint8_t *pu8Virt;
     582        RTGCUINTPTR pu8Virt;
    545583        rc = SELMToFlatEx(pVM, pRegFrame->eflags, pRegFrame->ds, (RTGCPTR)pRegFrame->esi, &pRegFrame->dsHid,
    546584                                SELMTOFLAT_FLAGS_HYPER | SELMTOFLAT_FLAGS_NO_PL,
     
    550588
    551589            /* Access verification first; we currently can't recover properly from traps inside this instruction */
    552             rc = PGMVerifyAccess(pVM, (RTGCUINTPTR)pu8Virt, cTransfers * cbSize, (cpl == 3) ? X86_PTE_US : 0);
     590            rc = PGMVerifyAccess(pVM, pu8Virt, cTransfers * cbSize, (cpl == 3) ? X86_PTE_US : 0);
    553591            if (rc != VINF_SUCCESS)
    554592            {
     
    558596            }
    559597
     598#ifdef IN_GC
    560599            MMGCRamRegisterTrapHandler(pVM);
     600#endif
    561601
    562602            /* copy loop. */
     
    564604            {
    565605                uint32_t u32Data = 0;
    566                 rc = MMGCRamReadNoTrapHandler(&u32Data, pu8Virt, cbSize);
     606                rc = iomRamRead(pVM, &u32Data, (RTGCPTR)pu8Virt, cbSize);
    567607                if (rc != VINF_SUCCESS)
    568608                    break;
     
    577617                cTransfers--;
    578618            }
     619#ifdef IN_GC
    579620            MMGCRamDeregisterTrapHandler(pVM);
    580 
     621#endif
    581622            /* Update ecx. */
    582623            if (pCpu->prefix & PREFIX_REP)
     
    598639
    599640        /* Convert destination address. */
    600         uint8_t *pu8Virt;
     641        RTGCUINTPTR pu8Virt;
    601642        rc = SELMToFlatEx(pVM, pRegFrame->eflags, pRegFrame->es, (RTGCPTR)pRegFrame->edi, &pRegFrame->esHid,
    602643                                SELMTOFLAT_FLAGS_HYPER | SELMTOFLAT_FLAGS_NO_PL,
    603                                 (PRTGCPTR)&pu8Virt, NULL);
     644                                (RTGCPTR *)&pu8Virt, NULL);
    604645        if (VBOX_FAILURE(rc))
    605646            return VINF_EM_RAW_GUEST_TRAP;
     
    607648        /* Check if destination address is MMIO. */
    608649        RTGCPHYS PhysDst;
    609         rc = PGMGstGetPage(pVM, pu8Virt, NULL, &PhysDst);
     650        rc = PGMGstGetPage(pVM, (RTGCPTR)pu8Virt, NULL, &PhysDst);
    610651        if (    VBOX_SUCCESS(rc)
    611652            &&  iomMMIOGetRangeHC(&pVM->iom.s, PhysDst))
     
    618659
    619660            PhysDst |= (RTGCUINTPTR)pu8Virt & PAGE_OFFSET_MASK;
    620             PIOMMMIORANGEGC pMMIODst = iomMMIOGetRange(&pVM->iom.s, PhysDst);
     661            CTXALLSUFF(PIOMMMIORANGE) pMMIODst = iomMMIOGetRange(&pVM->iom.s, PhysDst);
    621662            if (    !pMMIODst
    622663                ||  !pMMIODst->pfnWriteCallback)
     
    655696
    656697            /* Access verification first; we currently can't recover properly from traps inside this instruction */
    657             rc = PGMVerifyAccess(pVM, (RTGCUINTPTR)pu8Virt, cTransfers * cbSize, X86_PTE_RW | ((cpl == 3) ? X86_PTE_US : 0));
     698            rc = PGMVerifyAccess(pVM, pu8Virt, cTransfers * cbSize, X86_PTE_RW | ((cpl == 3) ? X86_PTE_US : 0));
    658699            if (rc != VINF_SUCCESS)
    659700            {
     
    664705
    665706            /* copy loop. */
     707#ifdef IN_GC
    666708            MMGCRamRegisterTrapHandler(pVM);
     709#endif
    667710            while (cTransfers)
    668711            {
     
    671714                if (rc != VINF_SUCCESS)
    672715                    break;
    673                 rc = MMGCRamWriteNoTrapHandler(pu8Virt, &u32Data, cbSize);
     716                rc = iomRamWrite(pVM, (RTGCPTR)pu8Virt, &u32Data, cbSize);
    674717                if (rc != VINF_SUCCESS)
    675718                {
     
    684727                cTransfers--;
    685728            }
     729#ifdef IN_GC
    686730            MMGCRamDeregisterTrapHandler(pVM);
     731#endif
    687732            STAM_PROFILE_STOP(&pVM->iom.s.StatGCInstMovsFromMMIO, c);
    688733        }
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