VirtualBox

Changeset 89726 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 16, 2021 5:23:55 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145177
Message:

Intel IOMMU: bugref:9967 Validate reserved bits in domain ID (if we ever choose a smaller domain ID size). Release build fixes.

File:
1 edited

Legend:

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

    r89668 r89726  
    364364    /** Maximum guest-address width (MGAW) invalid address mask. */
    365365    uint64_t                    fMgawInvMask;
     366    /** Context-entry qword-1 valid mask. */
     367    uint64_t                    fCtxEntryQw1ValidMask;
    366368    /** Maximum supported paging level (3, 4 or 5). */
    367369    uint8_t                     cMaxPagingLevel;
     
    14021404static void dmarFaultEventRaiseInterrupt(PPDMDEVINS pDevIns)
    14031405{
    1404     PDMAR    pThis   = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    14051406    PCDMARCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PCDMARCC);
    14061407    DMAR_ASSERT_LOCK_IS_OWNER(pDevIns, pThisCC);
     
    14081409#ifdef RT_STRICT
    14091410    {
     1411        PDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    14101412        uint32_t const uFstsReg = dmarRegReadRaw32(pThis, VTD_MMIO_OFF_FSTS_REG);
    14111413        uint32_t const fFaultMask = VTD_BF_FSTS_REG_PPF_MASK | VTD_BF_FSTS_REG_PFO_MASK
     
    24452447                    {
    24462448                        /* Validate reserved bits in the context-entry. */
     2449                        PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PCDMAR);
    24472450                        if (   !(uCtxEntryQword0 & ~VTD_CONTEXT_ENTRY_0_VALID_MASK)
    2448                             && !(uCtxEntryQword1 & ~VTD_CONTEXT_ENTRY_1_VALID_MASK))
     2451                            && !(uCtxEntryQword1 & ~pThis->fCtxEntryQw1ValidMask))
    24492452                        {
    24502453                            /* Get the domain ID for this mapping. */
     
    24522455
    24532456                            /* Validate the translation type (TT). */
    2454                             PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PCDMAR);
    24552457                            uint8_t const fTt = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_TT);
    24562458                            switch (fTt)
     
    24762478                                            return dmarDrMemRangeLookup(pDevIns, dmarDrSecondLevelTranslate, pMemReqRemap);
    24772479                                        }
    2478                                         else
    2479                                             dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Ut_Aw_Invalid, pMemReqIn, pMemReqAux);
     2480                                        dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Ut_Aw_Invalid, pMemReqIn, pMemReqAux);
    24802481                                    }
    24812482                                    else
     
    25622563static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARMEMREQREMAP pMemReqRemap)
    25632564{
    2564     RT_NOREF2(uRtaddrReg, pMemReqRemap);
    2565     PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    2566     Assert(pThis->fExtCapReg & VTD_BF_ECAP_REG_SMTS_MASK);
     2565    RT_NOREF3(pDevIns, uRtaddrReg, pMemReqRemap);
    25672566    return VERR_NOT_IMPLEMENTED;
    25682567}
     
    38323831        uint8_t const fEsrtps  = 1;                                /* Enhanced SRTPS (auto invalidate cache on SRTP). */
    38333832        uint8_t const fEsirtps = 1;                                /* Enhanced SIRTPS (auto invalidate cache on SIRTP). */
    3834         AssertCompile(DMAR_ND <= 6);
    38353833
    38363834        pThis->fCapReg = RT_BF_MAKE(VTD_BF_CAP_REG_ND,      fNd)
     
    38573855        dmarRegWriteRaw64(pThis, VTD_MMIO_OFF_CAP_REG, pThis->fCapReg);
    38583856
    3859         pThis->fHawBaseMask    = ~(UINT64_MAX << cGstPhysAddrBits) & X86_PAGE_4K_BASE_MASK;
    3860         pThis->fMgawInvMask    = UINT64_MAX << cGstPhysAddrBits;
    3861         pThis->cMaxPagingLevel = vtdCapRegGetMaxPagingLevel(fSagaw);
     3857        AssertCompile(fNd <= RT_ELEMENTS(g_auNdMask));
     3858        pThis->fHawBaseMask          = ~(UINT64_MAX << cGstPhysAddrBits) & X86_PAGE_4K_BASE_MASK;
     3859        pThis->fMgawInvMask          = UINT64_MAX << cGstPhysAddrBits;
     3860        pThis->cMaxPagingLevel       = vtdCapRegGetMaxPagingLevel(fSagaw);
     3861        pThis->fCtxEntryQw1ValidMask = VTD_BF_1_CONTEXT_ENTRY_AW_MASK
     3862                                     | VTD_BF_1_CONTEXT_ENTRY_IGN_6_3_MASK
     3863                                     | RT_BF_MAKE(VTD_BF_1_CONTEXT_ENTRY_DID, g_auNdMask[fNd]);
    38623864    }
    38633865
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