VirtualBox

Changeset 89275 in vbox for trunk/src/VBox/Devices/Bus


Ignore:
Timestamp:
May 25, 2021 2:59:30 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144621
Message:

Intel IOMMU: bugref:9967 Address translation, WIP.

File:
1 edited

Legend:

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

    r89257 r89275  
    143143/** The current saved state version. */
    144144#define DMAR_SAVED_STATE_VERSION                    1
     145
     146/** @name DMAR_IO_PERM_XXX: DMAR I/O permissions.
     147 * These are not according to the spec. other than the value of the READ and WRITE
     148 * permissions. */
     149#define DMAR_IO_PERM_READ                           RT_BIT(0)
     150#define DMAR_IO_PERM_WRITE                          RT_BIT(1)
     151#define DMAR_IO_PERM_EXECUTE                        RT_BIT(2)
     152#define DMAR_IO_PERM_SUPERVISOR                     RT_BIT(3)
     153/** @} */
    145154
    146155
     
    418427} DMAREVENTTYPE;
    419428
    420 
    421429/**
    422430 * DMA address map.
     
    434442    /** The size of the DMA access (in bytes). */
    435443    size_t          cbDma;
     444
    436445    /** The translated system-physical address (HPA). */
    437446    RTGCPHYS        GCPhysSpa;
     
    18901899 * @param   pDevIns         The IOMMU device instance.
    18911900 * @param   uRtaddrReg      The current RTADDR_REG value.
     1901 * @param   enmAddrType     The PCI memory request address type.
    18921902 * @param   pAddrRemap      The DMA address remap info.
    18931903 */
    1894 static int dmarDrLegacyModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARADDRMAP pAddrRemap)
     1904static int dmarDrLegacyModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PCIADDRTYPE enmAddrType, PDMARADDRMAP pAddrRemap)
    18951905{
    18961906    uint8_t const idxRootEntry = RT_HI_U8(pAddrRemap->idDevice);
     
    19211931                            && !(uCtxEntryQword1 & ~VTD_CONTEXT_ENTRY_1_VALID_MASK))
    19221932                        {
    1923                             /** @todo Handle context entry validation and processing. */
    1924                             return VERR_NOT_IMPLEMENTED;
     1933                            PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PCDMAR);
     1934                            uint8_t const fTt = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_TT);
     1935                            switch (fTt)
     1936                            {
     1937                                case 0:
     1938                                {
     1939                                    if (enmAddrType == PCIADDRTYPE_UNTRANSLATED)
     1940                                    {
     1941                                        /** @todo perform second-level translation. */
     1942                                        return VERR_NOT_IMPLEMENTED;
     1943                                    }
     1944                                    Log4Func(("Translation type blocks translated and translation requests\n"));
     1945                                    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
     1946                                }
     1947
     1948                                case 2:
     1949                                {
     1950                                    if (pThis->fExtCapReg & VTD_BF_ECAP_REG_PT_MASK)
     1951                                    {
     1952                                        pAddrRemap->GCPhysSpa    = pAddrRemap->uDmaAddr;
     1953                                        pAddrRemap->cbContiguous = pAddrRemap->cbDma;
     1954                                        return VINF_SUCCESS;
     1955                                    }
     1956                                    RT_FALL_THRU();
     1957                                }
     1958
     1959                                case 1:
     1960                                {
     1961                                    Assert(!(pThis->fExtCapReg & VTD_BF_ECAP_REG_DT_MASK));
     1962                                    RT_FALL_THRU();
     1963                                }
     1964
     1965                                default:
     1966                                {
     1967                                    dmarAtFaultQualifiedRecord(pDevIns, kDmarDiag_Atf_Lct_4_2, VTDATFAULT_LCT_4_2,
     1968                                                               pAddrRemap->idDevice, pAddrRemap->uDmaAddr, pAddrRemap->enmReqType,
     1969                                                               uCtxEntryQword0);
     1970                                    break;
     1971                                }
     1972                            }
    19251973                        }
    19261974                        else
    19271975                            dmarAtFaultQualifiedRecord(pDevIns, kDmarDiag_Atf_Lct_3, VTDATFAULT_LCT_3, pAddrRemap->idDevice,
    1928                                                        pAddrRemap->uDmaAddr, pAddrRemap->enmReqType, uCtxEntryQword0);
     1976                                                   pAddrRemap->uDmaAddr, pAddrRemap->enmReqType, uCtxEntryQword0);
    19291977                    }
    19301978                    else
     
    19572005 * @param   pDevIns         The IOMMU device instance.
    19582006 * @param   uRtaddrReg      The current RTADDR_REG value.
     2007 * @param   enmAddrType     The PCI memory request address type.
    19592008 * @param   pAddrRemap      The DMA address remap info.
    19602009 */
    1961 static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARADDRMAP pAddrRemap)
    1962 {
     2010static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PCIADDRTYPE enmAddrType, PDMARADDRMAP pAddrRemap)
     2011{
     2012    RT_NOREF(enmAddrType);
    19632013    PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    19642014    if (pThis->fExtCapReg & VTD_BF_ECAP_REG_SMTS_MASK)
     
    20562106            case VTD_TTM_LEGACY_MODE:
    20572107            {
    2058                 rc = dmarDrLegacyModeRemapAddr(pDevIns, uRtaddrReg, &AddrRemap);
     2108                rc = dmarDrLegacyModeRemapAddr(pDevIns, uRtaddrReg, PCIADDRTYPE_UNTRANSLATED, &AddrRemap);
    20592109                break;
    20602110            }
     
    20622112            case VTD_TTM_SCALABLE_MODE:
    20632113            {
    2064                 rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, &AddrRemap);
     2114                rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, PCIADDRTYPE_UNTRANSLATED, &AddrRemap);
    20652115                break;
    20662116            }
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