VirtualBox

Changeset 89499 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 4, 2021 9:36:58 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144856
Message:

Intel IOMMU: bugref:9967 Nits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Bus/DevIommuIntel.cpp

    r89498 r89499  
    354354    uint64_t                    fHawBaseMask;
    355355    /** Maximum guest-address width (MGAW) invalid address mask. */
    356     uint64_t                    fInvMgawMask;
     356    uint64_t                    fMgawInvMask;
    357357    /** Maximum supported paging level (3, 4 or 5). */
    358358    uint8_t                     cMaxPagingLevel;
     
    555555    uint8_t             cPagingLevel;
    556556    uint8_t             afPadding[5];
    557     /** The first-level page-table pointer (base).  */
     557    /** The first-level page-table pointer.  */
    558558    uint64_t            uFlptPtr;
    559     /** The second-level page-table pointer (base).  */
     559    /** The second-level page-table pointer.  */
    560560    uint64_t            uSlptPtr;
    561561} DMARMEMREQAUX;
     
    582582typedef DMARMEMREQREMAP const *PCDMARMEMREQREMAP;
    583583
    584 typedef DECLCALLBACKTYPE(int, FNDMAADDRTRANSLATE,(PPDMDEVINS pDevIns, PCDMARMEMREQIN pMemReqIn, PCDMARMEMREQAUX pMemReqAux,
    585                                                   PDMARIOPAGE pIoPageOut));
    586 typedef FNDMAADDRTRANSLATE *PFNDMAADDRTRANSLATE;
     584typedef DECLCALLBACKTYPE(int, FNDMADDRLOOKUP,(PPDMDEVINS pDevIns, PCDMARMEMREQIN pMemReqIn, PCDMARMEMREQAUX pMemReqAux,
     585                                              PDMARIOPAGE pIoPageOut));
     586typedef FNDMADDRLOOKUP *PFNDMADDRLOOKUP;
    587587
    588588
     
    20932093 * Performs second level translation.
    20942094 *
     2095 * This is a DMA address lookup callback function which performs the translation
     2096 * (and access control) as part of the lookup.
     2097 *
    20952098 * @returns VBox status code.
    20962099 * @param   pDevIns     The IOMMU device instance.
     
    21222125
    21232126    /* Second-level translations restricts input address to an implementation-specific MGAW. */
    2124     uint64_t const uDmaAddr = pMemReqIn->AddrRange.uAddr;
    2125     if (!(uDmaAddr & pThis->fInvMgawMask))
     2127    uint64_t const uAddrIn = pMemReqIn->AddrRange.uAddr;
     2128    if (!(uAddrIn & pThis->fMgawInvMask))
    21262129    { /* likely */ }
    21272130    else
     
    22272230         */
    22282231        {
    2229             uint16_t const idxPte         = (uDmaAddr >> cLevelShift) & UINT64_C(0x1ff);
     2232            uint16_t const idxPte         = (uAddrIn >> cLevelShift) & UINT64_C(0x1ff);
    22302233            uint64_t const offPte         = idxPte << 3;
    22312234            RTGCPHYS const GCPhysPtEntity = uPtEntity | offPte;
     
    22802283 * @returns VBox status code.
    22812284 * @param   pDevIns         The IOMMU device instance.
    2282  * @param   pfnTranslate    The DMA address translation function.
     2285 * @param   pfnLookup       The DMA address lookup function.
    22832286 * @param   pMemReqRemap    The DMA memory request remapping info.
    22842287 */
    2285 static int dmarDrMemRangeLookup(PPDMDEVINS pDevIns, PFNDMAADDRTRANSLATE pfnTranslate, PDMARMEMREQREMAP pMemReqRemap)
     2288static int dmarDrMemRangeLookup(PPDMDEVINS pDevIns, PFNDMADDRLOOKUP pfnLookup, PDMARMEMREQREMAP pMemReqRemap)
    22862289{
    22872290    RTGCPHYS       GCPhysAddr  = NIL_RTGCPHYS;
     
    23002303        /* Update the input memory request with the next address in our range that needs translation. */
    23012304        MemReqIn.AddrRange.uAddr = uAddrInBase;
    2302         MemReqIn.AddrRange.cb    = cbRemaining;  /* Not currently accessed by pfnTranslate, but keep things consistent. */
     2305        MemReqIn.AddrRange.cb    = cbRemaining;  /* Not currently accessed by pfnLookup, but keep things consistent. */
    23032306
    23042307        DMARIOPAGE IoPage;
    2305         rc = pfnTranslate(pDevIns, &MemReqIn, &pMemReqRemap->Aux, &IoPage);
     2308        rc = pfnLookup(pDevIns, &MemReqIn, &pMemReqRemap->Aux, &IoPage);
    23062309        if (RT_SUCCESS(rc))
    23072310        {
     
    37173720
    37183721        pThis->fHawBaseMask    = ~(UINT64_MAX << cGstPhysAddrBits) & X86_PAGE_4K_BASE_MASK;
    3719         pThis->fInvMgawMask    = UINT64_MAX << cGstPhysAddrBits;
     3722        pThis->fMgawInvMask    = UINT64_MAX << cGstPhysAddrBits;
    37203723        pThis->cMaxPagingLevel = vtdCapRegGetMaxPagingLevel(fSagaw);
    37213724    }
     
    39803983     * Log some of the features exposed to software.
    39813984     */
    3982     uint32_t const uVerReg   = pThis->uVerReg;
    3983     uint8_t const  cMgawBits = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_MGAW) + 1;
    3984     uint8_t const  fSagaw    = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_SAGAW);
    3985     uint16_t const offFrcd   = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_FRO);
    3986     uint16_t const offIva    = RT_BF_GET(pThis->fExtCapReg, VTD_BF_ECAP_REG_IRO);
    3987     LogRel(("%s: VER=%u.%u CAP=%#RX64 ECAP=%#RX64 (MGAW=%u bits, SAGAW=%#x HAW_Base=%#RX64 MGAW_Inv=%#RX64 FRO=%#x IRO=%#x cMaxPagingLevel=%u) mapped at %#RGp\n",
    3988             DMAR_LOG_PFX, RT_BF_GET(uVerReg, VTD_BF_VER_REG_MAX), RT_BF_GET(uVerReg, VTD_BF_VER_REG_MIN),
    3989             pThis->fCapReg, pThis->fExtCapReg, cMgawBits, fSagaw, pThis->fHawBaseMask, pThis->fInvMgawMask, offFrcd, offIva,
    3990             pThis->cMaxPagingLevel, DMAR_MMIO_BASE_PHYSADDR));
    3991 
     3985    uint8_t const uVerMax   = RT_BF_GET(pThis->uVerReg, VTD_BF_VER_REG_MAX);
     3986    uint8_t const uVerMin   = RT_BF_GET(pThis->uVerReg, VTD_BF_VER_REG_MIN);
     3987    uint8_t const cMgawBits = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_MGAW) + 1;
     3988    uint8_t const fSagaw    = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_SAGAW);
     3989    uint16_t const offFrcd  = RT_BF_GET(pThis->fCapReg, VTD_BF_CAP_REG_FRO);
     3990    uint16_t const offIva   = RT_BF_GET(pThis->fExtCapReg, VTD_BF_ECAP_REG_IRO);
     3991    LogRel(("%s: Mapped at %#RGp (%u-level page-table supported)\n",
     3992            DMAR_LOG_PFX, DMAR_MMIO_BASE_PHYSADDR, pThis->cMaxPagingLevel));
     3993    LogRel(("%s: Version=%u.%u Cap=%#RX64 ExtCap=%#RX64 Mgaw=%u bits Sagaw=%#x HawBaseMask=%#RX64 MgawInvMask=%#RX64 FRO=%#x IRO=%#x\n",
     3994            DMAR_LOG_PFX, uVerMax, uVerMin, pThis->fCapReg, pThis->fExtCapReg, cMgawBits, fSagaw, pThis->fHawBaseMask,
     3995            pThis->fMgawInvMask, offFrcd, offIva));
    39923996    return VINF_SUCCESS;
    39933997}
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