VirtualBox

Changeset 89451 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 2, 2021 6:41:13 AM (4 years ago)
Author:
vboxsync
Message:

Intel IOMMU: bugref:9967 Use VT-d nomenclature.

File:
1 edited

Legend:

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

    r89419 r89451  
    461461
    462462/**
    463  * Type of DMAR originated events that generate interrupts.
     463 * DMAR originated events that generate interrupts.
    464464 */
    465465typedef enum DMAREVENTTYPE
     
    478478    /** The system-physical base address of the translation. */
    479479    RTGCPHYS            GCPhysBase;
     480    /** The domain ID of the translated region. */
     481    uint16_t            idDomain;
     482    /** The permissions granted. */
     483    uint8_t             fPerm;
    480484    /** The page shift of the translation. */
    481485    uint8_t             cShift;
    482     /** The permissions granted. */
    483     uint8_t             fPerm;
    484     /** The domain ID of the translated region. */
    485     uint16_t            idDomain;
    486486} DMARIOTLBE;
    487487/** Pointer to an IOTLB entry. */
     
    489489/** Pointer to a const IOTLB entry. */
    490490typedef DMARIOTLBE const *PCDMARIOTLBE;
    491 
    492 /**
    493  * DMA Address Request.
    494  */
    495 typedef struct DMARADDRREQ
     491AssertCompileSizeAlignment(DMARIOTLBE, 4);
     492
     493/**
     494 * DMA Memory Request.
     495 */
     496typedef struct DMARMEMREQ
    496497{
    497498    /** The address being accessed. */
     
    509510    /** The request type. */
    510511    VTDREQTYPE          enmReqType;
    511 } DMARADDRREQ;
    512 /** Pointer to a DMA address request. */
    513 typedef DMARADDRREQ *PDMARADDRREQ;
    514 /** Pointer to a const DMA request. */
    515 typedef DMARADDRREQ const *PCDMARADDRREQ;
    516 
    517 /**
    518  * DMA Address Remap Info.
    519  */
    520 typedef struct DMARADDRREMAP
    521 {
    522     /* The DMA address request. */
    523     DMARADDRREQ         AddrReq;
     512} DMARMEMREQ;
     513/** Pointer to a DMA memory request. */
     514typedef DMARMEMREQ *PDMARMEMREQ;
     515/** Pointer to a const DMA memory request. */
     516typedef DMARMEMREQ const *PCDMARMEMREQ;
     517
     518/**
     519 * DMA Memory Request Remapping Information.
     520 */
     521typedef struct DMARMEMREQREMAP
     522{
     523    /* The DMA memory request. */
     524    DMARMEMREQ          Req;
    524525    /** The table translation mode (VTD_TTM_XXX). */
    525526    uint8_t             fTtm;
     
    527528    uint8_t             fFpd;
    528529
    529     /** The IOTLBE results for this remapping. */
     530    /** The IOTLBE result for this remapping. */
    530531    DMARIOTLBE          Iotlbe;
    531532    /** The size of the contiguous translated region (in bytes). */
    532533    size_t              cbContiguous;
    533 } DMARADDRREMAP;
     534} DMARMEMREQREMAP;
    534535/** Pointer to a DMA remap info. */
    535 typedef DMARADDRREMAP *PDMARADDRREMAP;
     536typedef DMARMEMREQREMAP *PDMARMEMREQREMAP;
    536537/** Pointer to a const DMA remap info. */
    537 typedef DMARADDRREMAP const *PCDMARADDRREMAP;
     538typedef DMARMEMREQREMAP const *PCDMARMEMREQREMAP;
    538539
    539540
     
    14981499 * Records an address translation fault.
    14991500 *
    1500  * @param   pDevIns     The IOMMU device instance.
    1501  * @param   enmDiag     The diagnostic reason.
    1502  * @param   enmAtFault  The address translation fault reason.
    1503  * @param   pAddrRemap  The DMA address remap info.
    1504  */
    1505 static void dmarAtFaultRecord(PPDMDEVINS pDevIns, DMARDIAG enmDiag, VTDATFAULT enmAtFault, PCDMARADDRREMAP pAddrRemap)
     1501 * @param   pDevIns         The IOMMU device instance.
     1502 * @param   enmDiag         The diagnostic reason.
     1503 * @param   enmAtFault      The address translation fault reason.
     1504 * @param   pMemReqRemap    The DMA memory request remapping info.
     1505 */
     1506static void dmarAtFaultRecord(PPDMDEVINS pDevIns, DMARDIAG enmDiag, VTDATFAULT enmAtFault, PCDMARMEMREQREMAP pMemReqRemap)
    15061507{
    15071508    /*
     
    15091510     * in the contex entry, scalable-mode context entry etc.
    15101511     */
    1511     if (!pAddrRemap->fFpd)
    1512     {
    1513         uint8_t const fType1 = pAddrRemap->AddrReq.enmReqType & RT_BIT(1);
    1514         uint8_t const fType2 = pAddrRemap->AddrReq.enmReqType & RT_BIT(0);
    1515         uint8_t const fExec  = pAddrRemap->AddrReq.fReqPerm & DMAR_PERM_EXE;
    1516         uint8_t const fPriv  = pAddrRemap->AddrReq.fReqPerm & DMAR_PERM_PRIV;
    1517         uint64_t const uFrcdHi = RT_BF_MAKE(VTD_BF_1_FRCD_REG_SID,  pAddrRemap->AddrReq.idDevice)
     1512    if (!pMemReqRemap->fFpd)
     1513    {
     1514        uint16_t const idDevice  = pMemReqRemap->Req.idDevice;
     1515        uint8_t const  fType1    = pMemReqRemap->Req.enmReqType & RT_BIT(1);
     1516        uint8_t const  fType2    = pMemReqRemap->Req.enmReqType & RT_BIT(0);
     1517        uint8_t const  fExec     = pMemReqRemap->Req.fReqPerm & DMAR_PERM_EXE;
     1518        uint8_t const  fPriv     = pMemReqRemap->Req.fReqPerm & DMAR_PERM_PRIV;
     1519        bool const     fHasPasid = PCIPASID_IS_VALID(pMemReqRemap->Req.Pasid);
     1520        uint32_t const uPasid    = PCIPASID_VAL(pMemReqRemap->Req.Pasid);
     1521        PCIADDRTYPE const enmAt  = pMemReqRemap->Req.enmAddrType;
     1522
     1523        uint64_t const uFrcdHi = RT_BF_MAKE(VTD_BF_1_FRCD_REG_SID,  idDevice)
    15181524                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_T2,   fType2)
    1519                                | RT_BF_MAKE(VTD_BF_1_FRCD_REG_PP,   PCIPASID_IS_VALID(pAddrRemap->AddrReq.Pasid))
     1525                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_PP,   fHasPasid)
    15201526                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_EXE,  fExec)
    15211527                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_PRIV, fPriv)
    15221528                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_FR,   enmAtFault)
    1523                                | RT_BF_MAKE(VTD_BF_1_FRCD_REG_PV,   PCIPASID_VAL(pAddrRemap->AddrReq.Pasid))
    1524                                | RT_BF_MAKE(VTD_BF_1_FRCD_REG_AT,   pAddrRemap->AddrReq.enmAddrType)
     1529                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_PV,   uPasid)
     1530                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_AT,   enmAt)
    15251531                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_T1,   fType1)
    15261532                               | RT_BF_MAKE(VTD_BF_1_FRCD_REG_F,    1);
    1527         uint64_t const uFrcdLo = pAddrRemap->AddrReq.uDmaAddr & X86_PAGE_BASE_MASK;
     1533        uint64_t const uFrcdLo = pMemReqRemap->Req.uDmaAddr & X86_PAGE_BASE_MASK;
    15281534        dmarPrimaryFaultRecord(pDevIns, enmDiag, uFrcdHi, uFrcdLo);
    15291535    }
     
    19952001 * @param   cPagingLevel    The paging level.
    19962002 * @param   idDomain        The domain ID for the translation.
    1997  * @param   pAddrRemap      The DMA address remap info.
     2003 * @param   pMemReqRemap    The DMA memory request remapping info.
    19982004 */
    19992005static int dmarDrSecondLevelTranslate(PPDMDEVINS pDevIns, VTD_SLP_ENTRY_T SlpEntry, uint8_t cPagingLevel, uint16_t idDomain,
    2000                                       PDMARADDRREMAP pAddrRemap)
     2006                                      PDMARMEMREQREMAP pMemReqRemap)
    20012007{
    20022008    PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PCDMAR);
     
    20222028
    20232029    /* Second-level translations restricts input address to an implementation-specific MGAW. */
    2024     uint64_t const uDmaAddr = pAddrRemap->AddrReq.uDmaAddr;
     2030    uint64_t const uDmaAddr = pMemReqRemap->Req.uDmaAddr;
    20252031    if (!(uDmaAddr & pThis->fInvMgawMask))
    20262032    { /* likely */ }
    20272033    else
    20282034    {
    2029         if (pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE)
    2030             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lgn_1_1, VTDATFAULT_LGN_1_1, pAddrRemap);
     2035        if (pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE)
     2036            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lgn_1_1, VTDATFAULT_LGN_1_1, pMemReqRemap);
    20312037        else
    2032             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Sgn_5, VTDATFAULT_SGN_5, pAddrRemap);
     2038            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Sgn_5, VTDATFAULT_SGN_5, pMemReqRemap);
    20332039        return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    20342040    }
     
    20542060            else
    20552061            {
    2056                 if (pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE)
    2057                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_1, VTDATFAULT_LSL_1, pAddrRemap);
     2062                if (pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE)
     2063                    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_1, VTDATFAULT_LSL_1, pMemReqRemap);
    20582064                else
    2059                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_1, VTDATFAULT_SSL_1, pAddrRemap);
     2065                    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_1, VTDATFAULT_SSL_1, pMemReqRemap);
    20602066                return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    20612067            }
     
    20682074         * See Intel spec. 7.1.3 "Fault conditions and Remapping hardware behavior for various request".
    20692075         */
    2070         uint8_t const fReqPerm = pAddrRemap->AddrReq.fReqPerm & pThis->fPermValidMask;
     2076        uint8_t const fReqPerm = pMemReqRemap->Req.fReqPerm & pThis->fPermValidMask;
    20712077        uint8_t const fPtPerm  = uPtEntity & pThis->fPermValidMask;
    20722078        if ((fPtPerm & fReqPerm) == fReqPerm)
     
    20742080        else
    20752081        {
    2076             if (pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE)
    2077                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pAddrRemap);
     2082            if (pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE)
     2083                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pMemReqRemap);
    20782084            else
    2079                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_2, VTDATFAULT_SSL_2, pAddrRemap);
     2085                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_2, VTDATFAULT_SSL_2, pMemReqRemap);
    20802086            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    20812087        }
     
    20882094        else
    20892095        {
    2090             if (pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE)
    2091                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pAddrRemap);
     2096            if (pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE)
     2097                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pMemReqRemap);
    20922098            else
    2093                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_3, VTDATFAULT_SSL_3, pAddrRemap);
     2099                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_3, VTDATFAULT_SSL_3, pMemReqRemap);
    20942100            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    20952101        }
     
    21062112            if (fSllpsMask & RT_BIT(iLevel - 1))
    21072113            {
    2108                 pAddrRemap->Iotlbe.GCPhysBase = uPtEntity & ~(RT_BIT_64(cLevelShift) - 1);
    2109                 pAddrRemap->Iotlbe.cShift     = cLevelShift;
    2110                 pAddrRemap->Iotlbe.fPerm      = fPtPerm;
    2111                 pAddrRemap->Iotlbe.idDomain   = idDomain;
     2114                pMemReqRemap->Iotlbe.GCPhysBase = uPtEntity & ~(RT_BIT_64(cLevelShift) - 1);
     2115                pMemReqRemap->Iotlbe.cShift     = cLevelShift;
     2116                pMemReqRemap->Iotlbe.fPerm      = fPtPerm;
     2117                pMemReqRemap->Iotlbe.idDomain   = idDomain;
    21122118                return VINF_SUCCESS;
    21132119            }
    21142120
    2115             if (pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE)
    2116                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2_LargePage, VTDATFAULT_LSL_2, pAddrRemap);
     2121            if (pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE)
     2122                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lsl_2_LargePage, VTDATFAULT_LSL_2, pMemReqRemap);
    21172123            else
    2118                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_3_LargePage, VTDATFAULT_SSL_3, pAddrRemap);
     2124                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Ssl_3_LargePage, VTDATFAULT_SSL_3, pMemReqRemap);
    21192125            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    21202126        }
     
    21252131        if (iLevel == 0)
    21262132        {
    2127             pAddrRemap->Iotlbe.GCPhysBase = uPtEntity & ~(RT_BIT_64(cLevelShift) - 1);
    2128             pAddrRemap->Iotlbe.cShift     = cLevelShift;
    2129             pAddrRemap->Iotlbe.fPerm      = fPtPerm;
    2130             pAddrRemap->Iotlbe.idDomain   = idDomain;
     2133            pMemReqRemap->Iotlbe.GCPhysBase = uPtEntity & ~(RT_BIT_64(cLevelShift) - 1);
     2134            pMemReqRemap->Iotlbe.cShift     = cLevelShift;
     2135            pMemReqRemap->Iotlbe.fPerm      = fPtPerm;
     2136            pMemReqRemap->Iotlbe.idDomain   = idDomain;
    21312137            return VINF_SUCCESS;
    21322138        }
     
    21442150 * @param   pDevIns         The IOMMU device instance.
    21452151 * @param   uRtaddrReg      The current RTADDR_REG value.
    2146  * @param   pAddrRemap      The DMA address remap info.
    2147  */
    2148 static int dmarDrLegacyModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARADDRREMAP pAddrRemap)
    2149 {
    2150     Assert(pAddrRemap->fTtm == VTD_TTM_LEGACY_MODE);    /* Paranoia. */
     2152 * @param   pMemReqRemap    The DMA memory request remapping info.
     2153 */
     2154static int dmarDrLegacyModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARMEMREQREMAP pMemReqRemap)
     2155{
     2156    Assert(pMemReqRemap->fTtm == VTD_TTM_LEGACY_MODE);    /* Paranoia. */
    21512157
    21522158    /* Read the root-entry from guest memory. */
    2153     uint8_t const idxRootEntry = RT_HI_U8(pAddrRemap->AddrReq.idDevice);
     2159    uint8_t const idxRootEntry = RT_HI_U8(pMemReqRemap->Req.idDevice);
    21542160    VTD_ROOT_ENTRY_T RootEntry;
    21552161    int rc = dmarDrReadRootEntry(pDevIns, uRtaddrReg, idxRootEntry, &RootEntry);
     
    21682174                /* Read the context-entry from guest memory. */
    21692175                RTGCPHYS const GCPhysCtxTable = RT_BF_GET(uRootEntryQword0, VTD_BF_0_ROOT_ENTRY_CTP);
    2170                 uint8_t const idxCtxEntry = RT_LO_U8(pAddrRemap->AddrReq.idDevice);
     2176                uint8_t const idxCtxEntry = RT_LO_U8(pMemReqRemap->Req.idDevice);
    21712177                VTD_CONTEXT_ENTRY_T CtxEntry;
    21722178                rc = dmarDrReadCtxEntry(pDevIns, GCPhysCtxTable, idxCtxEntry, &CtxEntry);
     
    21772183
    21782184                    /* Note the FPD bit which software can use to supress translation faults from here on in. */
    2179                     pAddrRemap->fFpd = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_FPD);
     2185                    pMemReqRemap->fFpd = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_FPD);
    21802186
    21812187                    /* Check if the context-entry is present (must be done before validating reserved bits). */
     
    22012207                                     * through SLPTPTR. Translated requests and Translation Requests are blocked.
    22022208                                     */
    2203                                     if (pAddrRemap->AddrReq.enmAddrType == PCIADDRTYPE_UNTRANSLATED)
     2209                                    if (pMemReqRemap->Req.enmAddrType == PCIADDRTYPE_UNTRANSLATED)
    22042210                                    {
    22052211                                        /* Validate the address width and get the paging level. */
     
    22152221                                                /* Finally... perform second-level translation. */
    22162222                                                return dmarDrSecondLevelTranslate(pDevIns, SlpEntry, cPagingLevel, idDomain,
    2217                                                                                   pAddrRemap);
     2223                                                                                  pMemReqRemap);
    22182224                                            }
    2219                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_3, VTDATFAULT_LCT_4_3, pAddrRemap);
     2225                                            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_3, VTDATFAULT_LCT_4_3, pMemReqRemap);
    22202226                                        }
    22212227                                        else
    2222                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_1, VTDATFAULT_LCT_4_1, pAddrRemap);
     2228                                            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_1, VTDATFAULT_LCT_4_1, pMemReqRemap);
    22232229                                    }
    22242230                                    else
    2225                                         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pAddrRemap);
     2231                                        dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pMemReqRemap);
    22262232                                    break;
    22272233                                }
     
    22362242                                    if (pThis->fExtCapReg & VTD_BF_ECAP_REG_PT_MASK)
    22372243                                    {
    2238                                         if (pAddrRemap->AddrReq.enmAddrType == PCIADDRTYPE_UNTRANSLATED)
     2244                                        if (pMemReqRemap->Req.enmAddrType == PCIADDRTYPE_UNTRANSLATED)
    22392245                                        {
    22402246                                            /** @todo Check AW == maximum SAGAW bit? */
    2241                                             pAddrRemap->Iotlbe.GCPhysBase = pAddrRemap->AddrReq.uDmaAddr & X86_PAGE_4K_BASE_MASK;
    2242                                             pAddrRemap->Iotlbe.cShift     = X86_PAGE_4K_SHIFT;
    2243                                             pAddrRemap->Iotlbe.fPerm      = DMAR_PERM_ALL;
    2244                                             pAddrRemap->Iotlbe.idDomain   = idDomain;
    2245                                             pAddrRemap->cbContiguous      = pAddrRemap->AddrReq.cbDma;
     2247                                            pMemReqRemap->Iotlbe.GCPhysBase = pMemReqRemap->Req.uDmaAddr & X86_PAGE_4K_BASE_MASK;
     2248                                            pMemReqRemap->Iotlbe.cShift     = X86_PAGE_4K_SHIFT;
     2249                                            pMemReqRemap->Iotlbe.fPerm      = DMAR_PERM_ALL;
     2250                                            pMemReqRemap->Iotlbe.idDomain   = idDomain;
     2251                                            pMemReqRemap->cbContiguous      = pMemReqRemap->Req.cbDma;
    22462252                                            return VINF_SUCCESS;
    22472253                                        }
    2248                                         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pAddrRemap);
     2254                                        dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pMemReqRemap);
    22492255                                        break;
    22502256                                    }
     
    22652271                                {
    22662272                                    /* Any other TT value is reserved. */
    2267                                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_2, VTDATFAULT_LCT_4_2, pAddrRemap);
     2273                                    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_2, VTDATFAULT_LCT_4_2, pMemReqRemap);
    22682274                                    break;
    22692275                                }
     
    22712277                        }
    22722278                        else
    2273                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_3, VTDATFAULT_LCT_3, pAddrRemap);
     2279                            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_3, VTDATFAULT_LCT_3, pMemReqRemap);
    22742280                    }
    22752281                    else
    2276                         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_2, VTDATFAULT_LCT_2, pAddrRemap);
     2282                        dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_2, VTDATFAULT_LCT_2, pMemReqRemap);
    22772283                }
    22782284                else
    2279                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_1, VTDATFAULT_LCT_1, pAddrRemap);
     2285                    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_1, VTDATFAULT_LCT_1, pMemReqRemap);
    22802286            }
    22812287            else
    2282                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_3, VTDATFAULT_LRT_3, pAddrRemap);
     2288                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_3, VTDATFAULT_LRT_3, pMemReqRemap);
    22832289        }
    22842290        else
    2285             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_2, VTDATFAULT_LRT_2, pAddrRemap);
     2291            dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_2, VTDATFAULT_LRT_2, pMemReqRemap);
    22862292    }
    22872293    else
    2288         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_1, VTDATFAULT_LRT_1, pAddrRemap);
     2294        dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_1, VTDATFAULT_LRT_1, pMemReqRemap);
    22892295    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    22902296}
     
    22972303 * @param   pDevIns         The IOMMU device instance.
    22982304 * @param   uRtaddrReg      The current RTADDR_REG value.
    2299  * @param   pAddrRemap      The DMA address remap info.
    2300  */
    2301 static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARADDRREMAP pAddrRemap)
     2305 * @param   pMemReqRemap    The DMA memory request remapping info.
     2306 */
     2307static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARMEMREQREMAP pMemReqRemap)
    23022308{
    23032309    PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
     
    23082314    }
    23092315
    2310     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_3, VTDATFAULT_RTA_1_3, pAddrRemap);
     2316    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_3, VTDATFAULT_RTA_1_3, pMemReqRemap);
    23112317    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    23122318}
     
    23852391
    23862392        uint8_t const fTtm = RT_BF_GET(uRtaddrReg, VTD_BF_RTADDR_REG_TTM);
    2387         DMARADDRREMAP AddrRemap;
    2388         RT_ZERO(AddrRemap);
    2389         AddrRemap.AddrReq.uDmaAddr    = uIova;
    2390         AddrRemap.AddrReq.cbDma       = cbIova;
    2391         AddrRemap.AddrReq.fReqPerm    = fReqPerm;
    2392         AddrRemap.AddrReq.idDevice    = idDevice;
    2393         AddrRemap.AddrReq.Pasid       = NIL_PCIPASID;
    2394         AddrRemap.AddrReq.enmAddrType = PCIADDRTYPE_UNTRANSLATED;
    2395         AddrRemap.AddrReq.enmReqType  = enmReqType;
    2396         AddrRemap.fTtm                = fTtm;
    2397         AddrRemap.Iotlbe.GCPhysBase   = NIL_RTGCPHYS;
     2393        DMARMEMREQREMAP MemReqRemap;
     2394        RT_ZERO(MemReqRemap);
     2395        MemReqRemap.Req.uDmaAddr    = uIova;
     2396        MemReqRemap.Req.cbDma       = cbIova;
     2397        MemReqRemap.Req.fReqPerm    = fReqPerm;
     2398        MemReqRemap.Req.idDevice    = idDevice;
     2399        MemReqRemap.Req.Pasid       = NIL_PCIPASID;
     2400        MemReqRemap.Req.enmAddrType = PCIADDRTYPE_UNTRANSLATED;
     2401        MemReqRemap.Req.enmReqType  = enmReqType;
     2402        MemReqRemap.fTtm                = fTtm;
     2403        MemReqRemap.Iotlbe.GCPhysBase   = NIL_RTGCPHYS;
    23982404
    23992405        int rc;
     
    24022408            case VTD_TTM_LEGACY_MODE:
    24032409            {
    2404                 rc = dmarDrLegacyModeRemapAddr(pDevIns, uRtaddrReg, &AddrRemap);
     2410                rc = dmarDrLegacyModeRemapAddr(pDevIns, uRtaddrReg, &MemReqRemap);
    24052411                break;
    24062412            }
     
    24082414            case VTD_TTM_SCALABLE_MODE:
    24092415            {
    2410                 rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, &AddrRemap);
     2416                rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, &MemReqRemap);
    24112417                break;
    24122418            }
     
    24182424                    dmarDrTargetAbort(pDevIns);
    24192425                else
    2420                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_1, VTDATFAULT_RTA_1_1, &AddrRemap);
     2426                    dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_1, VTDATFAULT_RTA_1_1, &MemReqRemap);
    24212427                break;
    24222428            }
     
    24252431            {
    24262432                rc = VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    2427                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_2, VTDATFAULT_RTA_1_2, &AddrRemap);
     2433                dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_2, VTDATFAULT_RTA_1_2, &MemReqRemap);
    24282434                break;
    24292435            }
    24302436        }
    24312437
    2432         *pcbContiguous = AddrRemap.cbContiguous;
    2433         *pGCPhysSpa    = AddrRemap.Iotlbe.GCPhysBase | DMAR_GET_PAGE_OFF_MASK(AddrRemap.Iotlbe.cShift);
     2438        *pcbContiguous = MemReqRemap.cbContiguous;
     2439        *pGCPhysSpa    = MemReqRemap.Iotlbe.GCPhysBase | DMAR_GET_PAGE_OFF_MASK(MemReqRemap.Iotlbe.cShift);
    24342440        return rc;
    24352441    }
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