VirtualBox

Changeset 88201 in vbox


Ignore:
Timestamp:
Mar 19, 2021 8:03:46 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
143365
Message:

Intel IOMMU: bugref:9967 WIP.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/iommu-intel.h

    r88192 r88201  
    3131
    3232#include <iprt/types.h>
    33 #include <iprt/assertcompile.h>
    3433
    3534
     
    4039 */
    4140#define VTD_MMIO_GROUP_0_OFF_FIRST                              0x000
    42 #define VTD_MMIO_OFF_VER_REG                                    0x000  /**< Version. */
     41#define VTD_MMIO_OFF_VER_REG                                    VTD_MMIO_GROUP_0_OFF_FIRST  /**< Version. */
    4342#define VTD_MMIO_OFF_CAP_REG                                    0x008  /**< Capability. */
    4443#define VTD_MMIO_OFF_ECAP_REG                                   0x010  /**< Extended Capability. */
     
    121120#define VTD_MMIO_GROUP_0_OFF_END                                (VTD_MMIO_GROUP_0_OFF_LAST + 8 /* sizeof MTRR_PHYSMASK9_REG */)
    122121
    123 #define VTD_MMIO_GROUP_1_OFF_FIRST                              0x000
    124 #define VTD_MMIO_OFF_VCCAP_REG                                  0xe00  /**< Virtual Command Capability. */
     122#define VTD_MMIO_GROUP_1_OFF_FIRST                              0xe00
     123#define VTD_MMIO_OFF_VCCAP_REG                                  VTD_MMIO_GROUP_1_OFF_FIRST  /**< Virtual Command Capability. */
    125124#define VTD_MMIO_OFF_VCMD_REG                                   0xe10  /**< Virtual Command. */
    126125#define VTD_MMIO_OFF_VCRSP_REG                                  0xe20  /**< Virtual Command Response. */
     
    704703RT_BF_ASSERT_COMPILE_CHECKS(VTX_BF_VER_REG_, UINT32_C(0), UINT32_MAX,
    705704                            (MIN, MAX, RSVD_31_8));
     705/** RW: Read/write mask. */
     706#define VTD_VER_REG_RW_MASK                                     UINT32_C(0)
    706707/** @} */
    707708
     
    784785                            (ND, AFL, RWBF, PLMR, PHMR, CM, SAGAW, RSVD_15_13, MGAW, ZLR, RSVD_23, FRO, SLLPS, RSVD_38, PSI, NFR,
    785786                             MAMV, DWD, DRD, FL1GP, RSVD_58_57, PI, FL5LP, RSVD_63_61));
     787
     788/** RW: Read/write mask. */
     789#define VTD_CAP_REG_RW_MASK                                     UINT64_C(0x0000000000000000)
    786790/** @} */
    787791
     
    895899                             PRS, ERS, SRS, RSVD_32, NWFS, EAFS, PSS, PASID, DIT, PDS, SMTS, VCS, SLADS, SLTS, FLTS, SMPWCS, RPS,
    896900                             RSVD_63_50));
     901
     902/** RW: Read/write mask. */
     903#define VTD_ECAP_REG_RW_MASK                                    UINT64_C(0x0000000000000000)
    897904/** @} */
    898905
     
    932939RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_GCMD_REG_, UINT32_C(0), UINT32_MAX,
    933940                            (RSVD_22_0, CFI, SIRTP, IRE, QIE, WBF, EAFL, SFL, SRTP, TE));
     941
     942/** RW: Read/write mask. */
     943#define VTD_GCMD_REG_RW_MASK                                    UINT32_C(0xff800000)
    934944/** @} */
    935945
     
    969979RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_GSTS_REG_, UINT32_C(0), UINT32_MAX,
    970980                            (RSVD_22_0, CFIS, IRTPS, IRES, QIES, WBFS, AFLS, FLS, RTPS, TES));
     981
     982/** RW: Read/write mask. */
     983#define VTD_GSTS_REG_RW_MASK                                    UINT32_C(0)
    971984/** @} */
    972985
     
    985998RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_RTADDR_REG_, UINT64_C(0), UINT64_MAX,
    986999                            (RSVD_9_0, TTM, RTA));
     1000
     1001/** RW: Read/write mask. */
     1002#define VTD_RTADDR_REG_RW_MASK                                  UINT64_C(0xfffffffffffffc00)
    9871003/** @} */
    9881004
     
    10131029RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_CCMD_REG_, UINT64_C(0), UINT64_MAX,
    10141030                            (DID, SID, FM, RSVD_58_34, CAIG, CIRG, ICC));
     1031
     1032/** RW: Read/write mask. */
     1033#define VTD_CCMD_REG_RW_MASK                                    (  VTD_BF_CCMD_REG_DID_MASK | VTD_BF_CCMD_REG_SID_MASK  \
     1034                                                                 | VTD_BF_CCMD_REG_FM_MASK  | VTD_BF_CCMD_REG_CIRG_MASK \
     1035                                                                 | VTD_BF_CCMD_REG_ICC_MASK)
    10151036/** @} */
    10161037
     
    11061127RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_FSTS_REG_, UINT32_C(0), UINT32_MAX,
    11071128                            (PFO, PPF, AFO, APF, IQE, ICE, ITE, RSVD_7, FRI, RSVD_31_16));
     1129
     1130/** RW: Read/write mask. */
     1131#define VTD_FSTS_REG_RW_MASK                                    (  VTD_BF_FSTS_REG_PFO_MASK | VTD_BF_FSTS_REG_AFO_MASK \
     1132                                                                 | VTD_BF_FSTS_REG_APF_MASK | VTD_BF_FSTS_REG_IQE_MASK \
     1133                                                                 | VTD_BF_FSTS_REG_ICE_MASK | VTD_BF_FSTS_REG_ITE_MASK)
    11081134/** @} */
    11091135
     
    11221148RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_FECTL_REG_, UINT32_C(0), UINT32_MAX,
    11231149                            (RSVD_29_0, IP, IM));
     1150
     1151/** RW: Read/write mask. */
     1152#define VTD_FECTL_REG_RW_MASK                                   VTD_BF_FECTL_REG_IM_MASK
    11241153/** @} */
    11251154
     
    11351164RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_FEDATA_REG_, UINT32_C(0), UINT32_MAX,
    11361165                            (IMD, EIMD));
     1166
     1167/** RW: Read/write mask. */
     1168#define VTD_FEDATA_REG_RW_MASK                                  (VTD_BF_FEDATA_REG_IMD_MASK | VTD_BF_FEDATA_REG_EIMD_MASK)
    11371169/** @} */
    11381170
     
    11481180RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_FEADDR_REG_, UINT32_C(0), UINT32_MAX,
    11491181                            (RSVD_1_0, MA));
     1182
     1183/** RW: Read/write mask. */
     1184#define VTD_FEADDR_REG_RW_MASK                                  VTD_BF_FEADDR_REG_MA_MASK
     1185/** @} */
     1186
     1187
     1188/** @name Fault Event Upper Address Register (FEUADDR_REG).
     1189 * @{ */
     1190/** MUA: Message Upper Address. */
     1191#define VTD_BF_FEUADDR_REG_MA_SHIFT                             0
     1192#define VTD_BF_FEUADDR_REG_MA_MASK                              UINT32_C(0xffffffff)
     1193
     1194/** RW: Read/write mask. */
     1195#define VTD_FEUADDR_REG_RW_MASK                                 VTD_BF_FEUADDR_REG_MA_MASK
    11501196/** @} */
    11511197
     
    12131259RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_0_AFLOG_REG_, UINT64_C(0), UINT64_MAX,
    12141260                            (RSVD_8_0, FLS, FLA));
     1261
     1262/** RW: Read/write mask. */
     1263#define VTD_AFLOG_REG_RW_MASK                                   (VTD_BF_0_AFLOG_REG_FLS_MASK | VTD_BF_0_AFLOG_REG_FLA_MASK)
    12151264/** @} */
    12161265
     
    12291278RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PMEN_REG_, UINT32_C(0), UINT32_MAX,
    12301279                            (PRS, RSVD_30_1, EPM));
     1280
     1281/** RW: Read/write mask. */
     1282#define VTD_PMEN_REG_RW_MASK                                    VTD_BF_PMEN_REG_EPM_MASK
    12311283/** @} */
    12321284
     
    12451297RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IQH_REG_, UINT64_C(0), UINT64_MAX,
    12461298                            (RSVD_3_0, QH, RSVD_63_19));
     1299
     1300/** RW: Read/write mask. */
     1301#define VTD_IQH_REG_RW_MASK                                     UINT64_C(0x0)
    12471302/** @} */
    12481303
     
    12611316RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IQT_REG_, UINT64_C(0), UINT64_MAX,
    12621317                            (RSVD_3_0, QT, RSVD_63_19));
    1263 /** @} */
     1318
     1319/** RW: Read/write mask. */
     1320#define VTD_IQT_REG_RW_MASK                                     VTD_BF_IQT_REG_QT_MASK
     1321/** @} */
     1322
    12641323
    12651324/** @name Invalidation Queue Address Register (IQA_REG).
     
    12791338RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IQA_REG_, UINT64_C(0), UINT64_MAX,
    12801339                            (QS, RSVD_10_3, DW, IQA));
     1340
     1341/** RW: Read/write mask. */
     1342#define VTD_IQA_REG_RW_MASK                                     (  VTD_BF_IQA_REG_QS_MASK | VTD_BF_IQA_REG_DW_MASK \
     1343                                                                 | VTD_BF_IQA_REG_IQA_MASK)
    12811344/** @} */
    12821345
     
    12921355RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_ICS_REG_, UINT32_C(0), UINT32_MAX,
    12931356                            (IWC, RSVD_31_1));
     1357
     1358/** RW: Read/write mask. */
     1359#define VTD_ICS_REG_RW_MASK                                     VTD_BF_ICS_REG_IWC_MASK
    12941360/** @} */
    12951361
     
    13081374RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IECTL_REG_, UINT32_C(0), UINT32_MAX,
    13091375                            (RSVD_29_0, IP, IM));
     1376
     1377/** RW: Read/write mask. */
     1378#define VTD_IECTL_REG_RW_MASK                                   VTD_BF_IECTL_REG_IM_MASK
    13101379/** @} */
    13111380
     
    13211390RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IEDATA_REG_, UINT32_C(0), UINT32_MAX,
    13221391                            (IMD, EIMD));
     1392
     1393/** RW: Read/write mask. */
     1394#define VTD_IEDATA_REG_RW_MASK                                  (VTD_BF_IEDATA_REG_IMD_MASK | VTD_BF_IEDATA_REG_EIMD_MASK)
    13231395/** @} */
    13241396
     
    13341406RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IEADDR_REG_, UINT32_C(0), UINT32_MAX,
    13351407                            (RSVD_1_0, MA));
     1408
     1409/** RW: Read/write mask. */
     1410#define VTD_IEADDR_REG_RW_MASK                                  VTD_BF_IEADDR_REG_MA_MASK
     1411/** @} */
     1412
     1413
     1414/** @name Invalidation Event Upper Address Register (IEUADDR_REG).
     1415 * @{ */
     1416/** MUA: Message Upper Address. */
     1417#define VTD_BF_IEUADDR_REG_MUA_SHIFT                            0
     1418#define VTD_BF_IEUADDR_REG_MUA_MASK                             UINT32_C(0xffffffff)
     1419
     1420/** RW: Read/write mask. */
     1421#define VTD_IEUADDR_REG_RW_MASK                                 VTD_BF_IEUADDR_REG_MUA_MASK
    13361422/** @} */
    13371423
     
    13531439RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IQERCD_REG_, UINT64_C(0), UINT64_MAX,
    13541440                            (IQEI, RSVD_31_4, ITESID, ICESID));
     1441
     1442/** RW: Read/write mask. */
     1443#define VTD_IQERCD_REG_RW_MASK                                  UINT64_C(0)
    13551444/** @} */
    13561445
     
    13721461RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_IRTA_REG_, UINT64_C(0), UINT64_MAX,
    13731462                            (S, RSVD_10_4, EIME, IRTA));
     1463
     1464/** RW: Read/write mask. */
     1465#define VTD_IRTA_REG_RW_MASK                                    (  VTD_BF_IRTA_REG_S_MASK | VTD_BF_IRTA_REG_EIME_MASK \
     1466                                                                 | VTD_BF_IRTA_REG_IRTA_MASK)
    13741467/** @} */
    13751468
     
    13881481RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PQH_REG_, UINT64_C(0), UINT64_MAX,
    13891482                            (RSVD_4_0, PQH, RSVD_63_19));
     1483
     1484/** RW: Read/write mask. */
     1485#define VTD_PQH_REG_RW_MASK                                     VTD_BF_PQH_REG_PQH_MASK
    13901486/** @} */
    13911487
     
    14041500RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PQT_REG_, UINT64_C(0), UINT64_MAX,
    14051501                            (RSVD_4_0, PQT, RSVD_63_19));
     1502
     1503/** RW: Read/write mask. */
     1504#define VTD_PQT_REG_RW_MASK                                     VTD_BF_PQT_REG_PQT_MASK
    14061505/** @} */
    14071506
     
    14201519RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PQA_REG_, UINT64_C(0), UINT64_MAX,
    14211520                            (PQS, RSVD_11_3, PQA));
     1521
     1522/** RW: Read/write mask. */
     1523#define VTD_PQA_REG_RW_MASK                                     (VTD_BF_PQA_REG_PQS_MASK | VTD_BF_PQA_REG_PQA_MASK)
    14221524/** @} */
    14231525
     
    14361538RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PRS_REG_, UINT32_C(0), UINT32_MAX,
    14371539                            (PPR, PRO, RSVD_31_2));
     1540
     1541/** RW: Read/write mask. */
     1542#define VTD_PRS_REG_RW_MASK                                     (VTD_BF_PRS_REG_PPR_MASK | VTD_BF_PRS_REG_PRO_MASK)
    14381543/** @} */
    14391544
     
    14521557RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PECTL_REG_, UINT32_C(0), UINT32_MAX,
    14531558                            (RSVD_29_0, IP, IM));
     1559
     1560/** RW: Read/write mask. */
     1561#define VTD_PECTL_REG_RW_MASK                                   VTD_BF_PECTL_REG_IM_MASK
    14541562/** @} */
    14551563
     
    14651573RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PEDATA_REG_, UINT32_C(0), UINT32_MAX,
    14661574                            (IMD, EIMD));
     1575
     1576/** RW: Read/write mask. */
     1577#define VTD_PEDATA_REG_RW_MASK                                  (VTD_BF_PEDATA_REG_IMD_MASK | VTD_BF_PEDATA_REG_EIMD_MASK)
    14671578/** @} */
    14681579
     
    14781589RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_PEADDR_REG_, UINT32_C(0), UINT32_MAX,
    14791590                            (RSVD_1_0, MA));
     1591
     1592/** RW: Read/write mask. */
     1593#define VTD_PEADDR_REG_RW_MASK                                  VTD_BF_PEADDR_REG_MA_MASK
     1594/** @} */
     1595
     1596
     1597
     1598/** @name Page Request Event Upper Address Register (PEUADDR_REG).
     1599 * @{ */
     1600/** MA: Message Address. */
     1601#define VTD_BF_PEUADDR_REG_MUA_SHIFT                            0
     1602#define VTD_BF_PEUADDR_REG_MUA_MASK                             UINT32_C(0xffffffff)
     1603
     1604/** RW: Read/write mask. */
     1605#define VTD_PEUADDR_REG_RW_MASK                                 VTD_BF_PEUADDR_REG_MUA_MASK
     1606/** @} */
     1607
     1608
     1609/** @name MTRR Capability Register (MTRRCAP_REG).
     1610 * @{ */
     1611/** VCNT: Variable MTRR Count. */
     1612#define VTD_BF_MTRRCAP_REG_VCNT_SHIFT                           0
     1613#define VTD_BF_MTRRCAP_REG_VCNT_MASK                            UINT64_C(0x00000000000000ff)
     1614/** FIX: Fixed range MTRRs Supported. */
     1615#define VTD_BF_MTRRCAP_REG_FIX_SHIFT                            8
     1616#define VTD_BF_MTRRCAP_REG_FIX_MASK                             UINT64_C(0x0000000000000100)
     1617/** R: Reserved (bit 9). */
     1618#define VTD_BF_MTRRCAP_REG_RSVD_9_SHIFT                         9
     1619#define VTD_BF_MTRRCAP_REG_RSVD_9_MASK                          UINT64_C(0x0000000000000200)
     1620/** WC: Write Combining. */
     1621#define VTD_BF_MTRRCAP_REG_WC_SHIFT                             10
     1622#define VTD_BF_MTRRCAP_REG_WC_MASK                              UINT64_C(0x0000000000000400)
     1623/** R: Reserved (bits 63:11). */
     1624#define VTD_BF_MTRRCAP_REG_RSVD_63_11_SHIFT                     11
     1625#define VTD_BF_MTRRCAP_REG_RSVD_63_11_MASK                      UINT64_C(0xfffffffffffff800)
     1626RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_MTRRCAP_REG_, UINT64_C(0), UINT64_MAX,
     1627                            (VCNT, FIX, RSVD_9, WC, RSVD_63_11));
     1628
     1629/** RW: Read/write mask. */
     1630#define VTD_MTRRCAP_REG_RW_MASK                                 UINT64_C(0)
    14801631/** @} */
    14811632
     
    15001651RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_MTRRDEF_REG_, UINT64_C(0), UINT64_MAX,
    15011652                            (TYPE, RSVD_9_8, FE, E, RSVD_63_12));
     1653
     1654/** RW: Read/write mask. */
     1655#define VTD_MTRRDEF_REG_RW_MASK                                 (  VTD_BF_MTRRDEF_REG_TYPE_MASK | VTD_BF_MTRRDEF_REG_FE_MASK \
     1656                                                                 | VTD_BF_MTRRDEF_REG_E_MASK)
    15021657/** @} */
    15031658
     
    15131668RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_VCCAP_REG_, UINT64_C(0), UINT64_MAX,
    15141669                            (PAS, RSVD_63_1));
     1670
     1671/** RW: Read/write mask. */
     1672#define VTD_VCCAP_REG_RW_MASK                                   UINT64_C(0)
    15151673/** @} */
    15161674
     
    15261684RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_VCMD_REG_, UINT64_C(0), UINT64_MAX,
    15271685                            (CMD, OP));
    1528 /** @} */
    1529 
    1530 
    1531 /** @name Virtual Command Register (VCMD_REG).
     1686
     1687/** RW: Read/write mask. */
     1688#define VTD_VCMD_REG_RW_MASK                                    (VTD_BF_VCMD_REG_CMD_MASK | VTD_BF_VCMD_REG_OP_MASK)
     1689/** @} */
     1690
     1691
     1692/** @name Virtual Command Response Register (VCRSP_REG).
    15321693 * @{ */
    15331694/** IP: In Progress. */
     
    15451706RT_BF_ASSERT_COMPILE_CHECKS(VTD_BF_VCRSP_REG_, UINT64_C(0), UINT64_MAX,
    15461707                            (IP, SC, RSVD_7_3, RSLT));
     1708
     1709/** RW: Read/write mask. */
     1710#define VTD_VCRSP_REG_RW_MASK                                   UINT64_C(0)
    15471711/** @} */
    15481712
  • trunk/src/VBox/Devices/Bus/DevIommuIntel.cpp

    r88192 r88201  
    2424#include <VBox/iommu-intel.h>
    2525
     26#include <iprt/assertcompile.h>
    2627#include <iprt/string.h>
    2728
     
    3233*   Defined Constants And Macros                                                                                                 *
    3334*********************************************************************************************************************************/
     35/** @def VTD_LO_U32
     36 * Gets the low uint32_t of a uint64_t or something equivalent.
     37 *
     38 * This is suitable for casting constants outside code (since RT_LO_U32 can't be
     39 * used as it asserts for correctness when compiling on certain compilers). */
     40#define VTD_LO_U32(a)       (uint32_t)(UINT32_MAX & (a))
     41
     42/** @def VTD_HI_U32
     43 * Gets the high uint32_t of a uint64_t or something equivalent.
     44 *
     45 * This is suitable for casting constants outside code (since RT_HI_U32 can't be
     46 * used as it asserts for correctness when compiling on certain compilers). */
     47#define VTD_HI_U32(a)       (uint32_t)((a) >> 32)
     48
    3449/** Release log prefix string. */
    3550#define IOMMU_LOG_PFX                               "Intel-IOMMU"
     51
    3652/** The current saved state version. */
    3753#define IOMMU_SAVED_STATE_VERSION                   1
    3854
    3955
     56/*********************************************************************************************************************************
     57*   Structures and Typedefs                                                                                                      *
     58*********************************************************************************************************************************/
    4059/**
    4160 * The shared IOMMU device state.
     
    111130typedef CTX_SUFF(PIOMMU) PIOMMUCC;
    112131
    113 /**
    114  * IOMMU register attributes.
    115  */
    116 typedef struct IOMMUREGATTR
    117 {
    118     /** Name of the register. */
    119     const char   *pszName;
    120     /** RW: Read/write mask. */
    121     uint64_t      fRwMask;
    122     /** RO: Read-only mask. */
    123     uint64_t      fRoMask;
    124     /** WO: Write-only mask. */
    125     uint64_t      fWoMask;
    126     /** RW1C: Read-only Status, Write-1-to-clear mask. */
    127     uint64_t      fRw1cMask;
    128 } IOMMUREGATTR;
    129 /** Pointer to an IOMMU register attributes struct. */
    130 typedef IOMMUREGATTR *PIOMMUREGATTR;
    131 /** Pointer to a const IOMMU register attributes struct. */
    132 typedef IOMMUREGATTR const *PCIOMMUREGATTR;
     132
     133/*********************************************************************************************************************************
     134*   Global Variables                                                                                                             *
     135*********************************************************************************************************************************/
     136/**
     137 * Read-write masks for IOMMU registers (group 0).
     138 */
     139static const uint32_t g_aRwMasks0[] =
     140{
     141    /* Offset  Register                  Low                                        High */
     142    /* 0x000   VER_REG               */  VTD_VER_REG_RW_MASK,
     143    /* 0x004   Reserved              */  0,
     144    /* 0x008   CAP_REG               */  VTD_LO_U32(VTD_CAP_REG_RW_MASK),           VTD_HI_U32(VTD_CAP_REG_RW_MASK),
     145    /* 0x010   ECAP_REG              */  VTD_LO_U32(VTD_ECAP_REG_RW_MASK),          VTD_HI_U32(VTD_ECAP_REG_RW_MASK),
     146    /* 0x018   GCMD_REG              */  VTD_GCMD_REG_RW_MASK,
     147    /* 0x01c   GSTS_REG              */  VTD_GSTS_REG_RW_MASK,
     148    /* 0x020   RTADDR_REG            */  VTD_LO_U32(VTD_RTADDR_REG_RW_MASK),        VTD_HI_U32(VTD_RTADDR_REG_RW_MASK),
     149    /* 0x028   CCMD_REG              */  VTD_LO_U32(VTD_CCMD_REG_RW_MASK),          VTD_HI_U32(VTD_CCMD_REG_RW_MASK),
     150    /* 0x030   Reserved              */  0,
     151    /* 0x034   FSTS_REG              */  VTD_FSTS_REG_RW_MASK,
     152    /* 0x038   FECTL_REG             */  VTD_FECTL_REG_RW_MASK,
     153    /* 0x03c   FEDATA_REG            */  VTD_FEDATA_REG_RW_MASK,
     154    /* 0x040   FEADDR_REG            */  VTD_FEADDR_REG_RW_MASK,
     155    /* 0x044   FEUADDR_REG           */  VTD_FEUADDR_REG_RW_MASK,
     156    /* 0x048   Reserved              */  0,                                         0,
     157    /* 0x050   Reserved              */  0,                                         0,
     158    /* 0x058   AFLOG_REG             */  VTD_LO_U32(VTD_AFLOG_REG_RW_MASK),         VTD_HI_U32(VTD_AFLOG_REG_RW_MASK),
     159    /* 0x060   Reserved              */  0,
     160    /* 0x064   PMEN_REG              */  0, /* RO as we don't support PLMR and PHMR. */
     161    /* 0x068   PLMBASE_REG           */  0, /* RO as we don't support PLMR. */
     162    /* 0x06c   PLMLIMIT_REG          */  0, /* RO as we don't support PLMR. */
     163    /* 0x070   PHMBASE_REG           */  0,                                         0, /* RO as we don't support PHMR. */
     164    /* 0x078   PHMLIMIT_REG          */  0,                                         0, /* RO as we don't support PHMR. */
     165    /* 0x080   IQH_REG               */  VTD_LO_U32(VTD_IQH_REG_RW_MASK),           VTD_HI_U32(VTD_IQH_REG_RW_MASK),
     166    /* 0x088   IQT_REG               */  VTD_LO_U32(VTD_IQT_REG_RW_MASK),           VTD_HI_U32(VTD_IQT_REG_RW_MASK),
     167    /* 0x090   IQA_REG               */  VTD_LO_U32(VTD_IQA_REG_RW_MASK),           VTD_HI_U32(VTD_IQA_REG_RW_MASK),
     168    /* 0x098   Reserved              */  0,
     169    /* 0x09c   ICS_REG               */  VTD_ICS_REG_RW_MASK,
     170    /* 0x0a0   IECTL_REG             */  VTD_IECTL_REG_RW_MASK,
     171    /* 0x0a4   IEDATA_REG            */  VTD_IEDATA_REG_RW_MASK,
     172    /* 0x0a8   IEADDR_REG            */  VTD_IEADDR_REG_RW_MASK,
     173    /* 0x0ac   IEUADDR_REG           */  VTD_IEUADDR_REG_RW_MASK,
     174    /* 0x0b0   IQERCD_REG            */  VTD_LO_U32(VTD_IQERCD_REG_RW_MASK),        VTD_HI_U32(VTD_IQERCD_REG_RW_MASK),
     175    /* 0x0b8   IRTA_REG              */  VTD_LO_U32(VTD_IRTA_REG_RW_MASK),          VTD_HI_U32(VTD_IRTA_REG_RW_MASK),
     176    /* 0x0c0   PQH_REG               */  VTD_LO_U32(VTD_PQH_REG_RW_MASK),           VTD_HI_U32(VTD_PQH_REG_RW_MASK),
     177    /* 0x0c8   PQT_REG               */  VTD_LO_U32(VTD_PQT_REG_RW_MASK),           VTD_HI_U32(VTD_PQT_REG_RW_MASK),
     178    /* 0x0d0   PQA_REG               */  VTD_LO_U32(VTD_PQA_REG_RW_MASK),           VTD_HI_U32(VTD_PQA_REG_RW_MASK),
     179    /* 0x0d8   Reserved              */  0,
     180    /* 0x0dc   PRS_REG               */  VTD_PRS_REG_RW_MASK,
     181    /* 0x0e0   PECTL_REG             */  VTD_PECTL_REG_RW_MASK,
     182    /* 0x0e4   PEDATA_REG            */  VTD_PEDATA_REG_RW_MASK,
     183    /* 0x0e8   PEADDR_REG            */  VTD_PEADDR_REG_RW_MASK,
     184    /* 0x0ec   PEUADDR_REG           */  VTD_PEUADDR_REG_RW_MASK,
     185    /* 0x0f0   Reserved              */  0,                                         0,
     186    /* 0x0f8   Reserved              */  0,                                         0,
     187    /* 0x100   MTRRCAP_REG           */  VTD_LO_U32(VTD_MTRRCAP_REG_RW_MASK),       VTD_HI_U32(VTD_MTRRCAP_REG_RW_MASK),
     188    /* 0x108   MTRRDEF_REG           */  0,                                         0, /* RO as we don't support MTS. */
     189    /* 0x110   Reserved              */  0,                                         0,
     190    /* 0x118   Reserved              */  0,                                         0,
     191    /* 0x120   MTRR_FIX64_00000_REG  */  0,                                         0, /* RO as we don't support MTS. */
     192    /* 0x128   MTRR_FIX16K_80000_REG */  0,                                         0,
     193    /* 0x130   MTRR_FIX16K_A0000_REG */  0,                                         0,
     194    /* 0x138   MTRR_FIX4K_C0000_REG  */  0,                                         0,
     195    /* 0x140   MTRR_FIX4K_C8000_REG  */  0,                                         0,
     196    /* 0x148   MTRR_FIX4K_D0000_REG  */  0,                                         0,
     197    /* 0x150   MTRR_FIX4K_D8000_REG  */  0,                                         0,
     198    /* 0x158   MTRR_FIX4K_E0000_REG  */  0,                                         0,
     199    /* 0x160   MTRR_FIX4K_E8000_REG  */  0,                                         0,
     200    /* 0x168   MTRR_FIX4K_F0000_REG  */  0,                                         0,
     201    /* 0x170   MTRR_FIX4K_F8000_REG  */  0,                                         0,
     202    /* 0x178   Reserved              */  0,                                         0,
     203    /* 0x180   MTRR_PHYSBASE0_REG    */  0,                                         0, /* RO as we don't support MTS. */
     204    /* 0x188   MTRR_PHYSMASK0_REG    */  0,                                         0,
     205    /* 0x190   MTRR_PHYSBASE1_REG    */  0,                                         0,
     206    /* 0x198   MTRR_PHYSMASK1_REG    */  0,                                         0,
     207    /* 0x1a0   MTRR_PHYSBASE2_REG    */  0,                                         0,
     208    /* 0x1a8   MTRR_PHYSMASK2_REG    */  0,                                         0,
     209    /* 0x1b0   MTRR_PHYSBASE3_REG    */  0,                                         0,
     210    /* 0x1b8   MTRR_PHYSMASK3_REG    */  0,                                         0,
     211    /* 0x1c0   MTRR_PHYSBASE4_REG    */  0,                                         0,
     212    /* 0x1c8   MTRR_PHYSMASK4_REG    */  0,                                         0,
     213    /* 0x1d0   MTRR_PHYSBASE5_REG    */  0,                                         0,
     214    /* 0x1d8   MTRR_PHYSMASK5_REG    */  0,                                         0,
     215    /* 0x1e0   MTRR_PHYSBASE6_REG    */  0,                                         0,
     216    /* 0x1e8   MTRR_PHYSMASK6_REG    */  0,                                         0,
     217    /* 0x1f0   MTRR_PHYSBASE7_REG    */  0,                                         0,
     218    /* 0x1f8   MTRR_PHYSMASK7_REG    */  0,                                         0,
     219    /* 0x200   MTRR_PHYSBASE8_REG    */  0,                                         0,
     220    /* 0x208   MTRR_PHYSMASK8_REG    */  0,                                         0,
     221    /* 0x210   MTRR_PHYSBASE9_REG    */  0,                                         0,
     222    /* 0x218   MTRR_PHYSMASK9_REG    */  0,                                         0,
     223};
     224AssertCompile(sizeof(g_aRwMasks0) == VTD_MMIO_GROUP_0_SIZE);
     225
     226/**
     227 * Read-write masks for IOMMU registers (group 1).
     228 */
     229static const uint32_t g_aRwMasks1[] =
     230{
     231    /* Offset  Register                  Low                                        High */
     232    /* 0xe00   VCCAP_REG             */  VTD_LO_U32(VTD_VCCAP_REG_RW_MASK),         VTD_HI_U32(VTD_VCCAP_REG_RW_MASK),
     233    /* 0xe08   Reserved              */  0,                                         0,
     234    /* 0xe10   VCMD_REG              */  0,                                         0, /* RO as we don't support VCS. */
     235    /* 0xe18   Reserved              */  0,                                         0,
     236    /* 0xe20   VCRSP_REG             */  0,                                         0, /* RO as we don't support VCS. */
     237};
     238AssertCompile(sizeof(g_aRwMasks1) == VTD_MMIO_GROUP_1_SIZE);
    133239
    134240
     
    276382    AssertRCReturn(rc, rc);
    277383
    278     /*
    279      * Initialize read-only PCI configuration space.
    280      */
    281     PPDMPCIDEV pPciDev = pDevIns->apPciDevs[0];
    282     PDMPCIDEV_ASSERT_VALID(pDevIns, pPciDev);
    283 
    284     /** @todo Figure out the PCI vendor/product and other stuff. Can't seem to find
    285      *        this yet. Maybe dump info from real hw. */
    286384
    287385    return VERR_NOT_IMPLEMENTED;
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