VirtualBox

Changeset 83941 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Apr 23, 2020 10:22:56 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
137493
Message:

AMD IOMMU: bugref:9654 Hook into PCIPhys[Read|Write] for intercepting and translating device accesses through the IOMMU.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r83850 r83941  
    274274#endif
    275275
     276#ifdef VBOX_WITH_IOMMU_AMD
     277    /** @todo IOMMU: Optimize/re-organize things here later. */
     278    PGVM        pGVM         = pDevIns->Internal.s.pGVM;
     279    PPDMIOMMUR0 pIommu       = &pGVM->pdmr0.s.aIommus[0];
     280    PPDMDEVINS  pDevInsIommu = pIommu->CTX_SUFF(pDevIns);
     281    if (   pDevInsIommu
     282        && pDevInsIommu != pDevIns)
     283    {
     284        RTGCPHYS GCPhysOut;
     285        uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pPciDev->Int.s.idxPdmBus, pPciDev->uDevFn);
     286        int rc = pIommu->pfnMemRead(pDevInsIommu, uDeviceId, GCPhys, cbRead, &GCPhysOut);
     287        if (RT_FAILURE(rc))
     288        {
     289            Log(("pdmR0DevHlp_PCIPhysRead: IOMMU translation failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId,
     290                 GCPhys, cbRead, rc));
     291            return rc;
     292        }
     293    }
     294#endif
     295
    276296    return pDevIns->pHlpR0->pfnPhysRead(pDevIns, GCPhys, pvBuf, cbRead);
    277297}
     
    299319             pDevIns, pDevIns->iInstance, VERR_PDM_NOT_PCI_BUS_MASTER, GCPhys, cbWrite));
    300320        return VERR_PDM_NOT_PCI_BUS_MASTER;
     321    }
     322#endif
     323
     324#ifdef VBOX_WITH_IOMMU_AMD
     325    /** @todo IOMMU: Optimize/re-organize things here later. */
     326    PGVM        pGVM          = pDevIns->Internal.s.pGVM;
     327    PPDMIOMMUR0 pIommu        = &pGVM->pdmr0.s.aIommus[0];
     328    PPDMDEVINS   pDevInsIommu = pIommu->CTX_SUFF(pDevIns);
     329    if (   pDevInsIommu
     330        && pDevInsIommu != pDevIns)
     331    {
     332        RTGCPHYS GCPhysOut;
     333        uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pPciDev->Int.s.idxPdmBus, pPciDev->uDevFn);
     334        int rc = pIommu->pfnMemWrite(pDevInsIommu, uDeviceId, GCPhys, cbWrite, &GCPhysOut);
     335        if (RT_FAILURE(rc))
     336        {
     337            Log(("pdmR0DevHlp_PCIPhysWrite: IOMMU translation failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId,
     338                 GCPhys, cbWrite, rc));
     339            return rc;
     340        }
    301341    }
    302342#endif
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