VirtualBox

Changeset 88342 in vbox for trunk


Ignore:
Timestamp:
Apr 1, 2021 8:23:15 AM (4 years ago)
Author:
vboxsync
Message:

Intel IOMMU: bugref:9967 WIP.

Location:
trunk/src/VBox/Devices
Files:
3 edited

Legend:

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

    r88332 r88342  
    3434 * This is suitable for casting constants outside code (since RT_LO_U32 can't be
    3535 * used as it asserts for correctness when compiling on certain compilers). */
    36 #define VTD_LO_U32(a)       (uint32_t)(UINT32_MAX & (a))
     36#define DMAR_LO_U32(a)       (uint32_t)(UINT32_MAX & (a))
    3737
    3838/** Gets the high uint32_t of a uint64_t or something equivalent.
     
    4040 * This is suitable for casting constants outside code (since RT_HI_U32 can't be
    4141 * used as it asserts for correctness when compiling on certain compilers). */
    42 #define VTD_HI_U32(a)       (uint32_t)((a) >> 32)
     42#define DMAR_HI_U32(a)       (uint32_t)((a) >> 32)
    4343
    4444/** Asserts MMIO access' offset and size are valid or returns appropriate error
    4545 * code suitable for returning from MMIO access handlers. */
    46 #define VTD_ASSERT_MMIO_ACCESS_RET(a_off, a_cb) \
     46#define DMAR_ASSERT_MMIO_ACCESS_RET(a_off, a_cb) \
    4747    do { \
    4848         AssertReturn(!(off & 3), VINF_IOM_MMIO_UNUSED_FF); \
     
    5151
    5252/** Checks whether the MMIO offset is valid. */
    53 #define VTD_IS_MMIO_OFF_VALID(a_off)                (   (a_off) < VTD_MMIO_GROUP_0_OFF_END \
    54                                                      || (a_off) - VTD_MMIO_GROUP_1_OFF_FIRST < VTD_MMIO_GROUP_1_SIZE)
     53#define DMAR_IS_MMIO_OFF_VALID(a_off)               (   (a_off) < DMAR_MMIO_GROUP_0_OFF_END \
     54                                                     || (a_off) - DMAR_MMIO_GROUP_1_OFF_FIRST < DMAR_MMIO_GROUP_1_SIZE)
    5555
    5656/** The number of fault recording registers our implementation supports.
     
    5959 *
    6060 *  See Intel VT-d spec. 10.4.2 "Capability Register" (CAP_REG::NFR). */
    61 #define VTD_FRCD_REG_COUNT                          UINT32_C(1)
     61#define DMAR_FRCD_REG_COUNT                         UINT32_C(1)
    6262
    6363/** Offset of first register in group 0. */
    64 #define VTD_MMIO_GROUP_0_OFF_FIRST                  VTD_MMIO_OFF_VER_REG
     64#define DMAR_MMIO_GROUP_0_OFF_FIRST                 VTD_MMIO_OFF_VER_REG
    6565/** Offset of last register in group 0 (inclusive). */
    66 #define VTD_MMIO_GROUP_0_OFF_LAST                   VTD_MMIO_OFF_MTRR_PHYSMASK9_REG
     66#define DMAR_MMIO_GROUP_0_OFF_LAST                  VTD_MMIO_OFF_MTRR_PHYSMASK9_REG
    6767/** Last valid offset in group 0 (exclusive). */
    68 #define VTD_MMIO_GROUP_0_OFF_END                    (VTD_MMIO_GROUP_0_OFF_LAST + 8 /* sizeof MTRR_PHYSMASK9_REG */)
     68#define DMAR_MMIO_GROUP_0_OFF_END                   (DMAR_MMIO_GROUP_0_OFF_LAST + 8 /* sizeof MTRR_PHYSMASK9_REG */)
    6969/** Size of the group 0 (in bytes). */
    70 #define VTD_MMIO_GROUP_0_SIZE                       (VTD_MMIO_GROUP_0_OFF_END - VTD_MMIO_GROUP_0_OFF_FIRST)
    71 
    72 #define VTD_MMIO_OFF_IVA_REG                        0xe40   /**< Implementation-specific MMIO offset of IVA_REG. */
    73 #define VTD_MMIO_OFF_IOTLB_REG                      0xe48   /**< Implementation-specific MMIO offset of IOTLB_REG. */
    74 #define VTD_MMIO_OFF_FRCD_LO_REG                    0xe60   /**< Implementation-specific MMIO offset of FRCD_LO_REG. */
    75 #define VTD_MMIO_OFF_FRCD_HI_REG                    0xe68   /**< Implementation-specific MMIO offset of FRCD_HI_REG. */
    76 AssertCompile(!(VTD_MMIO_OFF_FRCD_LO_REG & 0xf));
     70#define DMAR_MMIO_GROUP_0_SIZE                      (DMAR_MMIO_GROUP_0_OFF_END - DMAR_MMIO_GROUP_0_OFF_FIRST)
     71
     72#define DMAR_MMIO_OFF_IVA_REG                       0xe40   /**< Implementation-specific MMIO offset of IVA_REG. */
     73#define DMAR_MMIO_OFF_IOTLB_REG                     0xe48   /**< Implementation-specific MMIO offset of IOTLB_REG. */
     74#define DMAR_MMIO_OFF_FRCD_LO_REG                   0xe60   /**< Implementation-specific MMIO offset of FRCD_LO_REG. */
     75#define DMAR_MMIO_OFF_FRCD_HI_REG                   0xe68   /**< Implementation-specific MMIO offset of FRCD_HI_REG. */
     76AssertCompile(!(DMAR_MMIO_OFF_FRCD_LO_REG & 0xf));
    7777
    7878/** Offset of first register in group 1. */
    79 #define VTD_MMIO_GROUP_1_OFF_FIRST                  VTD_MMIO_OFF_VCCAP_REG
     79#define DMAR_MMIO_GROUP_1_OFF_FIRST                 VTD_MMIO_OFF_VCCAP_REG
    8080/** Offset of last register in group 1 (inclusive). */
    81 #define VTD_MMIO_GROUP_1_OFF_LAST                   (VTD_MMIO_OFF_FRCD_LO_REG + 8) * VTD_FRCD_REG_COUNT
     81#define DMAR_MMIO_GROUP_1_OFF_LAST                  (DMAR_MMIO_OFF_FRCD_LO_REG + 8) * DMAR_FRCD_REG_COUNT
    8282/** Last valid offset in group 1 (exclusive). */
    83 #define VTD_MMIO_GROUP_1_OFF_END                    (VTD_MMIO_GROUP_1_OFF_LAST + 8 /* sizeof FRCD_HI_REG */)
     83#define DMAR_MMIO_GROUP_1_OFF_END                   (DMAR_MMIO_GROUP_1_OFF_LAST + 8 /* sizeof FRCD_HI_REG */)
    8484/** Size of the group 1 (in bytes). */
    85 #define VTD_MMIO_GROUP_1_SIZE                       (VTD_MMIO_GROUP_1_OFF_END - VTD_MMIO_GROUP_1_OFF_FIRST)
     85#define DMAR_MMIO_GROUP_1_SIZE                      (DMAR_MMIO_GROUP_1_OFF_END - DMAR_MMIO_GROUP_1_OFF_FIRST)
    8686
    8787/** Release log prefix string. */
    88 #define IOMMU_LOG_PFX                               "Intel-IOMMU"
     88#define DMAR_LOG_PFX                                "Intel-IOMMU"
    8989
    9090/** The current saved state version. */
    91 #define IOMMU_SAVED_STATE_VERSION                   1
     91#define DMAR_SAVED_STATE_VERSION                    1
    9292
    9393
     
    9696*********************************************************************************************************************************/
    9797/**
    98  * The shared IOMMU device state.
    99  */
    100 typedef struct IOMMU
    101 {
    102     /** IOMMU device index (0 is at the top of the PCI tree hierarchy). */
     98 * The shared DMAR device state.
     99 */
     100typedef struct DMAR
     101{
     102    /** IOMMU device index. */
    103103    uint32_t                    idxIommu;
    104     /** IOMMU magic. */
     104    /** DMAR magic. */
    105105    uint32_t                    u32Magic;
    106106
     
    108108    IOMMMIOHANDLE               hMmio;
    109109
    110     /** IOMMU registers (group 0). */
    111     uint8_t                     abRegs0[VTD_MMIO_GROUP_0_SIZE];
    112     /** IOMMU registers (group 1). */
    113     uint8_t                     abRegs1[VTD_MMIO_GROUP_1_SIZE];
    114 } IOMMU;
    115 /** Pointer to the IOMMU device state. */
    116 typedef IOMMU *PIOMMU;
    117 /** Pointer to the const IOMMU device state. */
    118 typedef const IOMMU *PCIOMMU;
    119 
    120 /**
    121  * The ring-3 IOMMU device state.
    122  */
    123 typedef struct IOMMUR3
     110    /** DMAR registers (group 0). */
     111    uint8_t                     abRegs0[DMAR_MMIO_GROUP_0_SIZE];
     112    /** DMAR registers (group 1). */
     113    uint8_t                     abRegs1[DMAR_MMIO_GROUP_1_SIZE];
     114} DMAR;
     115/** Pointer to the DMAR device state. */
     116typedef DMAR *PDMAR;
     117/** Pointer to the const DMAR device state. */
     118typedef const DMAR *PCDMAR;
     119
     120/**
     121 * The ring-3 DMAR device state.
     122 */
     123typedef struct DMARR3
    124124{
    125125    /** Device instance. */
     
    127127    /** The IOMMU helper. */
    128128    R3PTRTYPE(PCPDMIOMMUHLPR3)  pIommuHlpR3;
    129 } IOMMUR3;
    130 /** Pointer to the ring-3 IOMMU device state. */
    131 typedef IOMMUR3 *PIOMMUR3;
    132 /** Pointer to the const ring-3 IOMMU device state. */
    133 typedef const IOMMUR3 *PCIOMMUR3;
    134 
    135 /**
    136  * The ring-0 IOMMU device state.
    137  */
    138 typedef struct IOMMUR0
     129} DMARR3;
     130/** Pointer to the ring-3 DMAR device state. */
     131typedef DMARR3 *PDMARR3;
     132/** Pointer to the const ring-3 DMAR device state. */
     133typedef const DMARR3 *PCDMARR3;
     134
     135/**
     136 * The ring-0 DMAR device state.
     137 */
     138typedef struct DMARR0
    139139{
    140140    /** Device instance. */
     
    142142    /** The IOMMU helper. */
    143143    R0PTRTYPE(PCPDMIOMMUHLPR0)  pIommuHlpR0;
    144 } IOMMUR0;
     144} DMARR0;
    145145/** Pointer to the ring-0 IOMMU device state. */
    146 typedef IOMMUR0 *PIOMMUR0;
     146typedef DMARR0 *PDMARR0;
    147147/** Pointer to the const ring-0 IOMMU device state. */
    148 typedef const IOMMUR0 *PCIOMMUR0;
    149 
    150 /**
    151  * The raw-mode IOMMU device state.
    152  */
    153 typedef struct IOMMURC
     148typedef const DMARR0 *PCDMARR0;
     149
     150/**
     151 * The raw-mode DMAR device state.
     152 */
     153typedef struct DMARRC
    154154{
    155155    /** Device instance. */
     
    157157    /** The IOMMU helper. */
    158158    RCPTRTYPE(PCPDMIOMMUHLPRC)  pIommuHlpRC;
    159 } IOMMURC;
    160 /** Pointer to the raw-mode IOMMU device state. */
    161 typedef IOMMURC *PIOMMURC;
    162 /** Pointer to the const raw-mode IOMMU device state. */
    163 typedef const IOMMURC *PCIOMMURC;
    164 
    165 /** The IOMMU device state for the current context. */
    166 typedef CTX_SUFF(IOMMU)  IOMMUCC;
    167 /** Pointer to the IOMMU device state for the current context. */
    168 typedef CTX_SUFF(PIOMMU) PIOMMUCC;
     159} DMARRC;
     160/** Pointer to the raw-mode DMAR device state. */
     161typedef DMARRC *PDMARRC;
     162/** Pointer to the const raw-mode DMAR device state. */
     163typedef const DMARRC *PCIDMARRC;
     164
     165/** The DMAR device state for the current context. */
     166typedef CTX_SUFF(DMAR)  DMARCC;
     167/** Pointer to the DMAR device state for the current context. */
     168typedef CTX_SUFF(PDMAR) PDMARCC;
    169169
    170170
     
    173173*********************************************************************************************************************************/
    174174/**
    175  * Read-write masks for IOMMU registers (group 0).
     175 * Read-write masks for DMAR registers (group 0).
    176176 */
    177177static const uint32_t g_au32RwMasks0[] =
     
    180180    /* 0x000   VER_REG               */  VTD_VER_REG_RW_MASK,
    181181    /* 0x004   Reserved              */  0,
    182     /* 0x008   CAP_REG               */  VTD_LO_U32(VTD_CAP_REG_RW_MASK),           VTD_HI_U32(VTD_CAP_REG_RW_MASK),
    183     /* 0x010   ECAP_REG              */  VTD_LO_U32(VTD_ECAP_REG_RW_MASK),          VTD_HI_U32(VTD_ECAP_REG_RW_MASK),
     182    /* 0x008   CAP_REG               */  DMAR_LO_U32(VTD_CAP_REG_RW_MASK),          DMAR_HI_U32(VTD_CAP_REG_RW_MASK),
     183    /* 0x010   ECAP_REG              */  DMAR_LO_U32(VTD_ECAP_REG_RW_MASK),         DMAR_HI_U32(VTD_ECAP_REG_RW_MASK),
    184184    /* 0x018   GCMD_REG              */  VTD_GCMD_REG_RW_MASK,
    185185    /* 0x01c   GSTS_REG              */  VTD_GSTS_REG_RW_MASK,
    186     /* 0x020   RTADDR_REG            */  VTD_LO_U32(VTD_RTADDR_REG_RW_MASK),        VTD_HI_U32(VTD_RTADDR_REG_RW_MASK),
    187     /* 0x028   CCMD_REG              */  VTD_LO_U32(VTD_CCMD_REG_RW_MASK),          VTD_HI_U32(VTD_CCMD_REG_RW_MASK),
     186    /* 0x020   RTADDR_REG            */  DMAR_LO_U32(VTD_RTADDR_REG_RW_MASK),       DMAR_HI_U32(VTD_RTADDR_REG_RW_MASK),
     187    /* 0x028   CCMD_REG              */  DMAR_LO_U32(VTD_CCMD_REG_RW_MASK),         DMAR_HI_U32(VTD_CCMD_REG_RW_MASK),
    188188    /* 0x030   Reserved              */  0,
    189189    /* 0x034   FSTS_REG              */  VTD_FSTS_REG_RW_MASK,
     
    194194    /* 0x048   Reserved              */  0,                                         0,
    195195    /* 0x050   Reserved              */  0,                                         0,
    196     /* 0x058   AFLOG_REG             */  VTD_LO_U32(VTD_AFLOG_REG_RW_MASK),         VTD_HI_U32(VTD_AFLOG_REG_RW_MASK),
     196    /* 0x058   AFLOG_REG             */  DMAR_LO_U32(VTD_AFLOG_REG_RW_MASK),        DMAR_HI_U32(VTD_AFLOG_REG_RW_MASK),
    197197    /* 0x060   Reserved              */  0,
    198198    /* 0x064   PMEN_REG              */  0, /* RO as we don't support PLMR and PHMR. */
     
    201201    /* 0x070   PHMBASE_REG           */  0,                                         0, /* RO as we don't support PHMR. */
    202202    /* 0x078   PHMLIMIT_REG          */  0,                                         0, /* RO as we don't support PHMR. */
    203     /* 0x080   IQH_REG               */  VTD_LO_U32(VTD_IQH_REG_RW_MASK),           VTD_HI_U32(VTD_IQH_REG_RW_MASK),
    204     /* 0x088   IQT_REG               */  VTD_LO_U32(VTD_IQT_REG_RW_MASK),           VTD_HI_U32(VTD_IQT_REG_RW_MASK),
    205     /* 0x090   IQA_REG               */  VTD_LO_U32(VTD_IQA_REG_RW_MASK),           VTD_HI_U32(VTD_IQA_REG_RW_MASK),
     203    /* 0x080   IQH_REG               */  DMAR_LO_U32(VTD_IQH_REG_RW_MASK),          DMAR_HI_U32(VTD_IQH_REG_RW_MASK),
     204    /* 0x088   IQT_REG               */  DMAR_LO_U32(VTD_IQT_REG_RW_MASK),          DMAR_HI_U32(VTD_IQT_REG_RW_MASK),
     205    /* 0x090   IQA_REG               */  DMAR_LO_U32(VTD_IQA_REG_RW_MASK),          DMAR_HI_U32(VTD_IQA_REG_RW_MASK),
    206206    /* 0x098   Reserved              */  0,
    207207    /* 0x09c   ICS_REG               */  VTD_ICS_REG_RW_MASK,
     
    210210    /* 0x0a8   IEADDR_REG            */  VTD_IEADDR_REG_RW_MASK,
    211211    /* 0x0ac   IEUADDR_REG           */  VTD_IEUADDR_REG_RW_MASK,
    212     /* 0x0b0   IQERCD_REG            */  VTD_LO_U32(VTD_IQERCD_REG_RW_MASK),        VTD_HI_U32(VTD_IQERCD_REG_RW_MASK),
    213     /* 0x0b8   IRTA_REG              */  VTD_LO_U32(VTD_IRTA_REG_RW_MASK),          VTD_HI_U32(VTD_IRTA_REG_RW_MASK),
    214     /* 0x0c0   PQH_REG               */  VTD_LO_U32(VTD_PQH_REG_RW_MASK),           VTD_HI_U32(VTD_PQH_REG_RW_MASK),
    215     /* 0x0c8   PQT_REG               */  VTD_LO_U32(VTD_PQT_REG_RW_MASK),           VTD_HI_U32(VTD_PQT_REG_RW_MASK),
    216     /* 0x0d0   PQA_REG               */  VTD_LO_U32(VTD_PQA_REG_RW_MASK),           VTD_HI_U32(VTD_PQA_REG_RW_MASK),
     212    /* 0x0b0   IQERCD_REG            */  DMAR_LO_U32(VTD_IQERCD_REG_RW_MASK),       DMAR_HI_U32(VTD_IQERCD_REG_RW_MASK),
     213    /* 0x0b8   IRTA_REG              */  DMAR_LO_U32(VTD_IRTA_REG_RW_MASK),         DMAR_HI_U32(VTD_IRTA_REG_RW_MASK),
     214    /* 0x0c0   PQH_REG               */  DMAR_LO_U32(VTD_PQH_REG_RW_MASK),          DMAR_HI_U32(VTD_PQH_REG_RW_MASK),
     215    /* 0x0c8   PQT_REG               */  DMAR_LO_U32(VTD_PQT_REG_RW_MASK),          DMAR_HI_U32(VTD_PQT_REG_RW_MASK),
     216    /* 0x0d0   PQA_REG               */  DMAR_LO_U32(VTD_PQA_REG_RW_MASK),          DMAR_HI_U32(VTD_PQA_REG_RW_MASK),
    217217    /* 0x0d8   Reserved              */  0,
    218218    /* 0x0dc   PRS_REG               */  VTD_PRS_REG_RW_MASK,
     
    223223    /* 0x0f0   Reserved              */  0,                                         0,
    224224    /* 0x0f8   Reserved              */  0,                                         0,
    225     /* 0x100   MTRRCAP_REG           */  VTD_LO_U32(VTD_MTRRCAP_REG_RW_MASK),       VTD_HI_U32(VTD_MTRRCAP_REG_RW_MASK),
     225    /* 0x100   MTRRCAP_REG           */  DMAR_LO_U32(VTD_MTRRCAP_REG_RW_MASK),      DMAR_HI_U32(VTD_MTRRCAP_REG_RW_MASK),
    226226    /* 0x108   MTRRDEF_REG           */  0,                                         0, /* RO as we don't support MTS. */
    227227    /* 0x110   Reserved              */  0,                                         0,
     
    260260    /* 0x218   MTRR_PHYSMASK9_REG    */  0,                                         0,
    261261};
    262 AssertCompile(sizeof(g_au32RwMasks0) == VTD_MMIO_GROUP_0_SIZE);
    263 
    264 /**
    265  * Read-only Status, Write-1-to-clear masks for IOMMU registers (group 0).
     262AssertCompile(sizeof(g_au32RwMasks0) == DMAR_MMIO_GROUP_0_SIZE);
     263
     264/**
     265 * Read-only Status, Write-1-to-clear masks for DMAR registers (group 0).
    266266 */
    267267static const uint32_t g_au32Rw1cMasks0[] =
    268268{
    269     /* Offset  Register                  Low                      High */
     269    /* Offset  Register                  Low                        High */
    270270    /* 0x000   VER_REG               */  0,
    271271    /* 0x004   Reserved              */  0,
    272     /* 0x008   CAP_REG               */  0,                       0,
    273     /* 0x010   ECAP_REG              */  0,                       0,
     272    /* 0x008   CAP_REG               */  0,                         0,
     273    /* 0x010   ECAP_REG              */  0,                         0,
    274274    /* 0x018   GCMD_REG              */  0,
    275275    /* 0x01c   GSTS_REG              */  0,
    276     /* 0x020   RTADDR_REG            */  0,                       0,
    277     /* 0x028   CCMD_REG              */  0,                       0,
     276    /* 0x020   RTADDR_REG            */  0,                         0,
     277    /* 0x028   CCMD_REG              */  0,                         0,
    278278    /* 0x030   Reserved              */  0,
    279279    /* 0x034   FSTS_REG              */  VTD_FSTS_REG_RW1C_MASK,
     
    282282    /* 0x040   FEADDR_REG            */  0,
    283283    /* 0x044   FEUADDR_REG           */  0,
    284     /* 0x048   Reserved              */  0,                       0,
    285     /* 0x050   Reserved              */  0,                       0,
    286     /* 0x058   AFLOG_REG             */  0,                       0,
     284    /* 0x048   Reserved              */  0,                         0,
     285    /* 0x050   Reserved              */  0,                         0,
     286    /* 0x058   AFLOG_REG             */  0,                         0,
    287287    /* 0x060   Reserved              */  0,
    288288    /* 0x064   PMEN_REG              */  0,
    289289    /* 0x068   PLMBASE_REG           */  0,
    290290    /* 0x06c   PLMLIMIT_REG          */  0,
    291     /* 0x070   PHMBASE_REG           */  0,                       0,
    292     /* 0x078   PHMLIMIT_REG          */  0,                       0,
    293     /* 0x080   IQH_REG               */  0,                       0,
    294     /* 0x088   IQT_REG               */  0,                       0,
    295     /* 0x090   IQA_REG               */  0,                       0,
     291    /* 0x070   PHMBASE_REG           */  0,                         0,
     292    /* 0x078   PHMLIMIT_REG          */  0,                         0,
     293    /* 0x080   IQH_REG               */  0,                         0,
     294    /* 0x088   IQT_REG               */  0,                         0,
     295    /* 0x090   IQA_REG               */  0,                         0,
    296296    /* 0x098   Reserved              */  0,
    297297    /* 0x09c   ICS_REG               */  VTD_ICS_REG_RW1C_MASK,
     
    300300    /* 0x0a8   IEADDR_REG            */  0,
    301301    /* 0x0ac   IEUADDR_REG           */  0,
    302     /* 0x0b0   IQERCD_REG            */  0,                       0,
    303     /* 0x0b8   IRTA_REG              */  0,                       0,
    304     /* 0x0c0   PQH_REG               */  0,                       0,
    305     /* 0x0c8   PQT_REG               */  0,                       0,
    306     /* 0x0d0   PQA_REG               */  0,                       0,
     302    /* 0x0b0   IQERCD_REG            */  0,                         0,
     303    /* 0x0b8   IRTA_REG              */  0,                         0,
     304    /* 0x0c0   PQH_REG               */  0,                         0,
     305    /* 0x0c8   PQT_REG               */  0,                         0,
     306    /* 0x0d0   PQA_REG               */  0,                         0,
    307307    /* 0x0d8   Reserved              */  0,
    308308    /* 0x0dc   PRS_REG               */  0,
     
    311311    /* 0x0e8   PEADDR_REG            */  0,
    312312    /* 0x0ec   PEUADDR_REG           */  0,
    313     /* 0x0f0   Reserved              */  0,                       0,
    314     /* 0x0f8   Reserved              */  0,                       0,
    315     /* 0x100   MTRRCAP_REG           */  0,                       0,
    316     /* 0x108   MTRRDEF_REG           */  0,                       0,
    317     /* 0x110   Reserved              */  0,                       0,
    318     /* 0x118   Reserved              */  0,                       0,
    319     /* 0x120   MTRR_FIX64_00000_REG  */  0,                       0,
    320     /* 0x128   MTRR_FIX16K_80000_REG */  0,                       0,
    321     /* 0x130   MTRR_FIX16K_A0000_REG */  0,                       0,
    322     /* 0x138   MTRR_FIX4K_C0000_REG  */  0,                       0,
    323     /* 0x140   MTRR_FIX4K_C8000_REG  */  0,                       0,
    324     /* 0x148   MTRR_FIX4K_D0000_REG  */  0,                       0,
    325     /* 0x150   MTRR_FIX4K_D8000_REG  */  0,                       0,
    326     /* 0x158   MTRR_FIX4K_E0000_REG  */  0,                       0,
    327     /* 0x160   MTRR_FIX4K_E8000_REG  */  0,                       0,
    328     /* 0x168   MTRR_FIX4K_F0000_REG  */  0,                       0,
    329     /* 0x170   MTRR_FIX4K_F8000_REG  */  0,                       0,
    330     /* 0x178   Reserved              */  0,                       0,
    331     /* 0x180   MTRR_PHYSBASE0_REG    */  0,                       0,
    332     /* 0x188   MTRR_PHYSMASK0_REG    */  0,                       0,
    333     /* 0x190   MTRR_PHYSBASE1_REG    */  0,                       0,
    334     /* 0x198   MTRR_PHYSMASK1_REG    */  0,                       0,
    335     /* 0x1a0   MTRR_PHYSBASE2_REG    */  0,                       0,
    336     /* 0x1a8   MTRR_PHYSMASK2_REG    */  0,                       0,
    337     /* 0x1b0   MTRR_PHYSBASE3_REG    */  0,                       0,
    338     /* 0x1b8   MTRR_PHYSMASK3_REG    */  0,                       0,
    339     /* 0x1c0   MTRR_PHYSBASE4_REG    */  0,                       0,
    340     /* 0x1c8   MTRR_PHYSMASK4_REG    */  0,                       0,
    341     /* 0x1d0   MTRR_PHYSBASE5_REG    */  0,                       0,
    342     /* 0x1d8   MTRR_PHYSMASK5_REG    */  0,                       0,
    343     /* 0x1e0   MTRR_PHYSBASE6_REG    */  0,                       0,
    344     /* 0x1e8   MTRR_PHYSMASK6_REG    */  0,                       0,
    345     /* 0x1f0   MTRR_PHYSBASE7_REG    */  0,                       0,
    346     /* 0x1f8   MTRR_PHYSMASK7_REG    */  0,                       0,
    347     /* 0x200   MTRR_PHYSBASE8_REG    */  0,                       0,
    348     /* 0x208   MTRR_PHYSMASK8_REG    */  0,                       0,
    349     /* 0x210   MTRR_PHYSBASE9_REG    */  0,                       0,
    350     /* 0x218   MTRR_PHYSMASK9_REG    */  0,                       0,
     313    /* 0x0f0   Reserved              */  0,                         0,
     314    /* 0x0f8   Reserved              */  0,                         0,
     315    /* 0x100   MTRRCAP_REG           */  0,                         0,
     316    /* 0x108   MTRRDEF_REG           */  0,                         0,
     317    /* 0x110   Reserved              */  0,                         0,
     318    /* 0x118   Reserved              */  0,                         0,
     319    /* 0x120   MTRR_FIX64_00000_REG  */  0,                         0,
     320    /* 0x128   MTRR_FIX16K_80000_REG */  0,                         0,
     321    /* 0x130   MTRR_FIX16K_A0000_REG */  0,                         0,
     322    /* 0x138   MTRR_FIX4K_C0000_REG  */  0,                         0,
     323    /* 0x140   MTRR_FIX4K_C8000_REG  */  0,                         0,
     324    /* 0x148   MTRR_FIX4K_D0000_REG  */  0,                         0,
     325    /* 0x150   MTRR_FIX4K_D8000_REG  */  0,                         0,
     326    /* 0x158   MTRR_FIX4K_E0000_REG  */  0,                         0,
     327    /* 0x160   MTRR_FIX4K_E8000_REG  */  0,                         0,
     328    /* 0x168   MTRR_FIX4K_F0000_REG  */  0,                         0,
     329    /* 0x170   MTRR_FIX4K_F8000_REG  */  0,                         0,
     330    /* 0x178   Reserved              */  0,                         0,
     331    /* 0x180   MTRR_PHYSBASE0_REG    */  0,                         0,
     332    /* 0x188   MTRR_PHYSMASK0_REG    */  0,                         0,
     333    /* 0x190   MTRR_PHYSBASE1_REG    */  0,                         0,
     334    /* 0x198   MTRR_PHYSMASK1_REG    */  0,                         0,
     335    /* 0x1a0   MTRR_PHYSBASE2_REG    */  0,                         0,
     336    /* 0x1a8   MTRR_PHYSMASK2_REG    */  0,                         0,
     337    /* 0x1b0   MTRR_PHYSBASE3_REG    */  0,                         0,
     338    /* 0x1b8   MTRR_PHYSMASK3_REG    */  0,                         0,
     339    /* 0x1c0   MTRR_PHYSBASE4_REG    */  0,                         0,
     340    /* 0x1c8   MTRR_PHYSMASK4_REG    */  0,                         0,
     341    /* 0x1d0   MTRR_PHYSBASE5_REG    */  0,                         0,
     342    /* 0x1d8   MTRR_PHYSMASK5_REG    */  0,                         0,
     343    /* 0x1e0   MTRR_PHYSBASE6_REG    */  0,                         0,
     344    /* 0x1e8   MTRR_PHYSMASK6_REG    */  0,                         0,
     345    /* 0x1f0   MTRR_PHYSBASE7_REG    */  0,                         0,
     346    /* 0x1f8   MTRR_PHYSMASK7_REG    */  0,                         0,
     347    /* 0x200   MTRR_PHYSBASE8_REG    */  0,                         0,
     348    /* 0x208   MTRR_PHYSMASK8_REG    */  0,                         0,
     349    /* 0x210   MTRR_PHYSBASE9_REG    */  0,                         0,
     350    /* 0x218   MTRR_PHYSMASK9_REG    */  0,                         0,
    351351};
    352 AssertCompile(sizeof(g_au32Rw1cMasks0) == VTD_MMIO_GROUP_0_SIZE);
    353 
    354 /**
    355  * Read-write masks for IOMMU registers (group 1).
     352AssertCompile(sizeof(g_au32Rw1cMasks0) == DMAR_MMIO_GROUP_0_SIZE);
     353
     354/**
     355 * Read-write masks for DMAR registers (group 1).
    356356 */
    357357static const uint32_t g_au32RwMasks1[] =
    358358{
    359     /* Offset  Register                  Low                                    High */
    360     /* 0xe00   VCCAP_REG             */  VTD_LO_U32(VTD_VCCAP_REG_RW_MASK),     VTD_HI_U32(VTD_VCCAP_REG_RW_MASK),
    361     /* 0xe08   Reserved              */  0,                                     0,
    362     /* 0xe10   VCMD_REG              */  0,                                     0, /* RO as we don't support VCS. */
    363     /* 0xe18   VCMDRSVD_REG          */  0,                                     0,
    364     /* 0xe20   VCRSP_REG             */  0,                                     0, /* RO as we don't support VCS. */
    365     /* 0xe28   VCRSPRSVD_REG         */  0,                                     0,
    366     /* 0xe30   Reserved              */  0,                                     0,
    367     /* 0xe38   Reserved              */  0,                                     0,
    368     /* 0xe40   IVA_REG               */  VTD_LO_U32(VTD_IVA_REG_RW_MASK),       VTD_HI_U32(VTD_IVA_REG_RW_MASK),
    369     /* 0xe48   IOTLB_REG             */  VTD_LO_U32(VTD_IOTLB_REG_RW_MASK),     VTD_HI_U32(VTD_IOTLB_REG_RW_MASK),
    370     /* 0xe50   Reserved              */  0,                                     0,
    371     /* 0xe58   Reserved              */  0,                                     0,
    372     /* 0xe60   FRCD_REG_LO           */  VTD_LO_U32(VTD_FRCD_REG_LO_RW_MASK),   VTD_HI_U32(VTD_FRCD_REG_LO_RW_MASK),
    373     /* 0xe68   FRCD_REG_HI           */  VTD_LO_U32(VTD_FRCD_REG_HI_RW_MASK),   VTD_HI_U32(VTD_FRCD_REG_HI_RW_MASK),
     359    /* Offset  Register                  Low                                        High */
     360    /* 0xe00   VCCAP_REG             */  DMAR_LO_U32(VTD_VCCAP_REG_RW_MASK),        DMAR_HI_U32(VTD_VCCAP_REG_RW_MASK),
     361    /* 0xe08   Reserved              */  0,                                         0,
     362    /* 0xe10   VCMD_REG              */  0,                                         0, /* RO: VCS not supported. */
     363    /* 0xe18   VCMDRSVD_REG          */  0,                                         0,
     364    /* 0xe20   VCRSP_REG             */  0,                                         0, /* RO: VCS not supported. */
     365    /* 0xe28   VCRSPRSVD_REG         */  0,                                         0,
     366    /* 0xe30   Reserved              */  0,                                         0,
     367    /* 0xe38   Reserved              */  0,                                         0,
     368    /* 0xe40   IVA_REG               */  DMAR_LO_U32(VTD_IVA_REG_RW_MASK),          DMAR_HI_U32(VTD_IVA_REG_RW_MASK),
     369    /* 0xe48   IOTLB_REG             */  DMAR_LO_U32(VTD_IOTLB_REG_RW_MASK),        DMAR_HI_U32(VTD_IOTLB_REG_RW_MASK),
     370    /* 0xe50   Reserved              */  0,                                         0,
     371    /* 0xe58   Reserved              */  0,                                         0,
     372    /* 0xe60   FRCD_REG_LO           */  DMAR_LO_U32(VTD_FRCD_REG_LO_RW_MASK),      DMAR_HI_U32(VTD_FRCD_REG_LO_RW_MASK),
     373    /* 0xe68   FRCD_REG_HI           */  DMAR_LO_U32(VTD_FRCD_REG_HI_RW_MASK),      DMAR_HI_U32(VTD_FRCD_REG_HI_RW_MASK),
    374374};
    375 AssertCompile(sizeof(g_au32RwMasks1) == VTD_MMIO_GROUP_1_SIZE);
    376 AssertCompile((VTD_MMIO_OFF_FRCD_LO_REG - VTD_MMIO_GROUP_1_OFF_FIRST) + VTD_FRCD_REG_COUNT * 2 * sizeof(uint64_t) );
    377 
    378 /**
    379  * Read-only Status, Write-1-to-clear masks for IOMMU registers (group 1).
     375AssertCompile(sizeof(g_au32RwMasks1) == DMAR_MMIO_GROUP_1_SIZE);
     376AssertCompile((DMAR_MMIO_OFF_FRCD_LO_REG - DMAR_MMIO_GROUP_1_OFF_FIRST) + DMAR_FRCD_REG_COUNT * 2 * sizeof(uint64_t) );
     377
     378/**
     379 * Read-only Status, Write-1-to-clear masks for DMAR registers (group 1).
    380380 */
    381381static const uint32_t g_au32Rw1cMasks1[] =
    382382{
    383     /* Offset  Register                  Low                                    High */
    384     /* 0xe00   VCCAP_REG             */  0,                                     0,
    385     /* 0xe08   Reserved              */  0,                                     0,
    386     /* 0xe10   VCMD_REG              */  0,                                     0,
    387     /* 0xe18   VCMDRSVD_REG          */  0,                                     0,
    388     /* 0xe20   VCRSP_REG             */  0,                                     0,
    389     /* 0xe28   VCRSPRSVD_REG         */  0,                                     0,
    390     /* 0xe30   Reserved              */  0,                                     0,
    391     /* 0xe38   Reserved              */  0,                                     0,
    392     /* 0xe40   IVA_REG               */  0,                                     0,
    393     /* 0xe48   IOTLB_REG             */  0,                                     0,
    394     /* 0xe50   Reserved              */  0,                                     0,
    395     /* 0xe58   Reserved              */  0,                                     0,
    396     /* 0xe60   FRCD_REG_LO           */  VTD_LO_U32(VTD_FRCD_REG_LO_RW1C_MASK), VTD_HI_U32(VTD_FRCD_REG_LO_RW1C_MASK),
    397     /* 0xe68   FRCD_REG_HI           */  VTD_LO_U32(VTD_FRCD_REG_HI_RW1C_MASK), VTD_HI_U32(VTD_FRCD_REG_HI_RW1C_MASK),
     383    /* Offset  Register                  Low                                        High */
     384    /* 0xe00   VCCAP_REG             */  0,                                         0,
     385    /* 0xe08   Reserved              */  0,                                         0,
     386    /* 0xe10   VCMD_REG              */  0,                                         0,
     387    /* 0xe18   VCMDRSVD_REG          */  0,                                         0,
     388    /* 0xe20   VCRSP_REG             */  0,                                         0,
     389    /* 0xe28   VCRSPRSVD_REG         */  0,                                         0,
     390    /* 0xe30   Reserved              */  0,                                         0,
     391    /* 0xe38   Reserved              */  0,                                         0,
     392    /* 0xe40   IVA_REG               */  0,                                         0,
     393    /* 0xe48   IOTLB_REG             */  0,                                         0,
     394    /* 0xe50   Reserved              */  0,                                         0,
     395    /* 0xe58   Reserved              */  0,                                         0,
     396    /* 0xe60   FRCD_REG_LO           */  DMAR_LO_U32(VTD_FRCD_REG_LO_RW1C_MASK),    DMAR_HI_U32(VTD_FRCD_REG_LO_RW1C_MASK),
     397    /* 0xe68   FRCD_REG_HI           */  DMAR_LO_U32(VTD_FRCD_REG_HI_RW1C_MASK),    DMAR_HI_U32(VTD_FRCD_REG_HI_RW1C_MASK),
    398398};
    399 AssertCompile(sizeof(g_au32Rw1cMasks1) == VTD_MMIO_GROUP_1_SIZE);
     399AssertCompile(sizeof(g_au32Rw1cMasks1) == DMAR_MMIO_GROUP_1_SIZE);
    400400
    401401/** Array of RW masks for each register group. */
     
    415415 *
    416416 * @returns Pointer to the first element of the register group.
    417  * @param   pThis       The shared IOMMU device state.
     417 * @param   pThis       The shared DMAR device state.
    418418 * @param   offReg      The MMIO offset of the register.
    419419 * @param   cbReg       The size of the access being made (for bounds checking on
     
    422422 *                      belongs to.
    423423 */
    424 DECLINLINE(uint8_t *) iommuIntelRegGetGroup(PIOMMU pThis, uint16_t offReg, uint8_t cbReg, uint8_t *pIdxGroup)
     424DECLINLINE(uint8_t *) dmarRegGetGroup(PDMAR pThis, uint16_t offReg, uint8_t cbReg, uint8_t *pIdxGroup)
    425425{
    426426    uint16_t const offLast = offReg + cbReg - 1;
    427     AssertCompile(VTD_MMIO_GROUP_0_OFF_FIRST == 0);
    428     AssertMsg(VTD_IS_MMIO_OFF_VALID(offLast), ("off=%#x cb=%u\n", offReg, cbReg));
     427    AssertCompile(DMAR_MMIO_GROUP_0_OFF_FIRST == 0);
     428    AssertMsg(DMAR_IS_MMIO_OFF_VALID(offLast), ("off=%#x cb=%u\n", offReg, cbReg));
    429429
    430430    uint8_t *const apbRegs[] = { &pThis->abRegs0[0], &pThis->abRegs1[0] };
    431     *pIdxGroup = !(offLast < VTD_MMIO_GROUP_0_OFF_END);
     431    *pIdxGroup = !(offLast < DMAR_MMIO_GROUP_0_OFF_END);
    432432    return apbRegs[*pIdxGroup];
    433433}
     
    437437 * Writes a 64-bit register with the exactly the supplied value.
    438438 *
    439  * @param   pThis       The shared IOMMU device state.
     439 * @param   pThis       The shared DMAR device state.
    440440 * @param   offReg      The MMIO offset of the register.
    441441 * @param   uReg        The 64-bit value to write.
    442442 */
    443 DECLINLINE(void) iommuIntelRegWriteRaw64(PIOMMU pThis, uint16_t offReg, uint64_t uReg)
     443DECLINLINE(void) dmarRegWriteRaw64(PDMAR pThis, uint16_t offReg, uint64_t uReg)
    444444{
    445445    uint8_t idxGroup;
    446     uint8_t *pabRegs = iommuIntelRegGetGroup(pThis, offReg, sizeof(uint64_t), &idxGroup);
     446    uint8_t *pabRegs = dmarRegGetGroup(pThis, offReg, sizeof(uint64_t), &idxGroup);
    447447    NOREF(idxGroup);
    448448    *(uint64_t *)(pabRegs + offReg) = uReg;
     
    453453 * Writes a 32-bit register with the exactly the supplied value.
    454454 *
    455  * @param   pThis       The shared IOMMU device state.
     455 * @param   pThis       The shared DMAR device state.
    456456 * @param   offReg      The MMIO offset of the register.
    457457 * @param   uReg        The 32-bit value to write.
    458458 */
    459 DECLINLINE(void) iommuIntelRegWriteRaw32(PIOMMU pThis, uint16_t offReg, uint32_t uReg)
     459DECLINLINE(void) dmarRegWriteRaw32(PDMAR pThis, uint16_t offReg, uint32_t uReg)
    460460{
    461461    uint8_t idxGroup;
    462     uint8_t *pabRegs = iommuIntelRegGetGroup(pThis, offReg, sizeof(uint32_t), &idxGroup);
     462    uint8_t *pabRegs = dmarRegGetGroup(pThis, offReg, sizeof(uint32_t), &idxGroup);
    463463    NOREF(idxGroup);
    464464    *(uint32_t *)(pabRegs + offReg) = uReg;
     
    469469 * Reads a 64-bit register with exactly the value it contains.
    470470 *
    471  * @param   pThis       The shared IOMMU device state.
     471 * @param   pThis       The shared DMAR device state.
    472472 * @param   offReg      The MMIO offset of the register.
    473473 * @param   puReg       Where to store the raw 64-bit register value.
     
    475475 * @param   pfRw1cMask  Where to store the RW1C mask corresponding to this register.
    476476 */
    477 DECLINLINE(void) iommuIntelRegReadRaw64(PIOMMU pThis, uint16_t offReg, uint64_t *puReg, uint64_t *pfRwMask, uint64_t *pfRw1cMask)
     477DECLINLINE(void) dmarRegReadRaw64(PDMAR pThis, uint16_t offReg, uint64_t *puReg, uint64_t *pfRwMask, uint64_t *pfRw1cMask)
    478478{
    479479    uint8_t idxGroup;
    480     uint8_t const *pabRegs      = iommuIntelRegGetGroup(pThis, offReg, sizeof(uint64_t), &idxGroup);
     480    uint8_t const *pabRegs      = dmarRegGetGroup(pThis, offReg, sizeof(uint64_t), &idxGroup);
    481481    Assert(idxGroup < RT_ELEMENTS(g_apbRwMasks));
    482482    uint8_t const *pabRwMasks   = g_apbRwMasks[idxGroup];
     
    491491 * Reads a 32-bit register with exactly the value it contains.
    492492 *
    493  * @param   pThis       The shared IOMMU device state.
     493 * @param   pThis       The shared DMAR device state.
    494494 * @param   offReg      The MMIO offset of the register.
    495495 * @param   puReg       Where to store the raw 32-bit register value.
     
    497497 * @param   pfRw1cMask  Where to store the RW1C mask corresponding to this register.
    498498 */
    499 DECLINLINE(void) iommuIntelRegReadRaw32(PIOMMU pThis, uint16_t offReg, uint32_t *puReg, uint32_t *pfRwMask, uint32_t *pfRw1cMask)
     499DECLINLINE(void) dmarRegReadRaw32(PDMAR pThis, uint16_t offReg, uint32_t *puReg, uint32_t *pfRwMask, uint32_t *pfRw1cMask)
    500500{
    501501    uint8_t idxGroup;
    502     uint8_t const *pabRegs      = iommuIntelRegGetGroup(pThis, offReg, sizeof(uint32_t), &idxGroup);
     502    uint8_t const *pabRegs      = dmarRegGetGroup(pThis, offReg, sizeof(uint32_t), &idxGroup);
    503503    Assert(idxGroup < RT_ELEMENTS(g_apbRwMasks));
    504504    uint8_t const *pabRwMasks   = g_apbRwMasks[idxGroup];
     
    514514 * This will preserve read-only bits, mask off reserved bits and clear RW1C bits.
    515515 *
    516  * @param   pThis   The shared IOMMU device state.
     516 * @param   pThis   The shared DMAR device state.
    517517 * @param   offReg  The MMIO offset of the register.
    518518 * @param   uReg    The 64-bit value to write.
    519519 */
    520 static void iommuIntelRegWrite64(PIOMMU pThis, uint16_t offReg, uint64_t uReg)
     520static void dmarRegWrite64(PDMAR pThis, uint16_t offReg, uint64_t uReg)
    521521{
    522522    /* Read current value from the 64-bit register. */
     
    524524    uint64_t fRwMask;
    525525    uint64_t fRw1cMask;
    526     iommuIntelRegReadRaw64(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
     526    dmarRegReadRaw64(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
    527527
    528528    uint64_t const fRoBits   = uCurReg & ~fRwMask;      /* Preserve current read-only and reserved bits. */
     
    532532
    533533    /* Write new value to the 64-bit register. */
    534     iommuIntelRegWriteRaw64(pThis, offReg, uNewReg);
     534    dmarRegWriteRaw64(pThis, offReg, uNewReg);
    535535}
    536536
     
    540540 * This will preserve read-only bits, mask off reserved bits and clear RW1C bits.
    541541 *
    542  * @param   pThis   The shared IOMMU device state.
     542 * @param   pThis   The shared DMAR device state.
    543543 * @param   offReg  The MMIO offset of the register.
    544544 * @param   uReg    The 32-bit value to write.
    545545 */
    546 static void iommuIntelRegWrite32(PIOMMU pThis, uint16_t offReg, uint32_t uReg)
     546static void dmarRegWrite32(PDMAR pThis, uint16_t offReg, uint32_t uReg)
    547547{
    548548    /* Read current value from the 32-bit register. */
     
    550550    uint32_t fRwMask;
    551551    uint32_t fRw1cMask;
    552     iommuIntelRegReadRaw32(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
     552    dmarRegReadRaw32(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
    553553
    554554    uint32_t const fRoBits   = uCurReg & ~fRwMask;      /* Preserve current read-only and reserved bits. */
     
    558558
    559559    /* Write new value to the 32-bit register. */
    560     iommuIntelRegWriteRaw32(pThis, offReg, uNewReg);
     560    dmarRegWriteRaw32(pThis, offReg, uNewReg);
    561561}
    562562
     
    566566 *
    567567 * @returns The 64-bit register value.
    568  * @param   pThis   The shared IOMMU device state.
     568 * @param   pThis   The shared DMAR device state.
    569569 * @param   offReg  The MMIO offset of the register.
    570570 */
    571 static uint64_t iommuIntelRegRead64(PIOMMU pThis, uint16_t offReg)
     571static uint64_t dmarRegRead64(PDMAR pThis, uint16_t offReg)
    572572{
    573573    uint64_t uCurReg;
    574574    uint64_t fRwMask;
    575575    uint64_t fRw1cMask;
    576     iommuIntelRegReadRaw64(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
     576    dmarRegReadRaw64(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
    577577    NOREF(fRwMask); NOREF(fRw1cMask);
    578578    return uCurReg;
     
    584584 *
    585585 * @returns The 32-bit register value.
    586  * @param   pThis   The shared IOMMU device state.
     586 * @param   pThis   The shared DMAR device state.
    587587 * @param   offReg  The MMIO offset of the register.
    588588 */
    589 static uint32_t iommuIntelRegRead32(PIOMMU pThis, uint16_t offReg)
     589static uint32_t dmarRegRead32(PDMAR pThis, uint16_t offReg)
    590590{
    591591    uint32_t uCurReg;
    592592    uint32_t fRwMask;
    593593    uint32_t fRw1cMask;
    594     iommuIntelRegReadRaw32(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
     594    dmarRegReadRaw32(pThis, offReg, &uCurReg, &fRwMask, &fRw1cMask);
    595595    NOREF(fRwMask); NOREF(fRw1cMask);
    596596    return uCurReg;
     
    661661 * @callback_method_impl{FNIOMMMIONEWWRITE}
    662662 */
    663 static DECLCALLBACK(VBOXSTRICTRC) iommuIntelMmioWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void const *pv, unsigned cb)
     663static DECLCALLBACK(VBOXSTRICTRC) dmarMmioWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void const *pv, unsigned cb)
    664664{
    665665    RT_NOREF1(pvUser);
    666     VTD_ASSERT_MMIO_ACCESS_RET(off, cb);
    667 
    668     PIOMMU         pThis   = PDMDEVINS_2_DATA(pDevIns, PIOMMU);
     666    DMAR_ASSERT_MMIO_ACCESS_RET(off, cb);
     667
     668    PDMAR          pThis   = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    669669    uint16_t const offReg  = off;
    670670    uint16_t const offLast = offReg + cb - 1;
    671     if (VTD_IS_MMIO_OFF_VALID(offLast))
     671    if (DMAR_IS_MMIO_OFF_VALID(offLast))
    672672    {
    673673        switch (off)
     
    676676            {
    677677                if (cb == 8)
    678                     iommuIntelRegWrite64(pThis, offReg, *(uint64_t *)pv);
     678                    dmarRegWrite64(pThis, offReg, *(uint64_t *)pv);
    679679                else
    680                     iommuIntelRegWrite32(pThis, offReg, *(uint32_t *)pv);
     680                    dmarRegWrite32(pThis, offReg, *(uint32_t *)pv);
    681681                break;
    682682            }
     
    691691 * @callback_method_impl{FNIOMMMIONEWREAD}
    692692 */
    693 static DECLCALLBACK(VBOXSTRICTRC) iommuIntelMmioRead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void *pv, unsigned cb)
     693static DECLCALLBACK(VBOXSTRICTRC) dmarMmioRead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void *pv, unsigned cb)
    694694{
    695695    RT_NOREF1(pvUser);
    696     VTD_ASSERT_MMIO_ACCESS_RET(off, cb);
    697 
    698     PIOMMU         pThis   = PDMDEVINS_2_DATA(pDevIns, PIOMMU);
     696    DMAR_ASSERT_MMIO_ACCESS_RET(off, cb);
     697
     698    PDMAR          pThis   = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    699699    uint16_t const offReg  = off;
    700700    uint16_t const offLast = offReg + cb - 1;
    701     if (VTD_IS_MMIO_OFF_VALID(offLast))
     701    if (DMAR_IS_MMIO_OFF_VALID(offLast))
    702702    {
    703703        if (cb == 8)
    704             *(uint64_t *)pv = iommuIntelRegRead64(pThis, offReg);
     704            *(uint64_t *)pv = dmarRegRead64(pThis, offReg);
    705705        else
    706             *(uint32_t *)pv = iommuIntelRegRead32(pThis, offReg);
     706            *(uint32_t *)pv = dmarRegRead32(pThis, offReg);
    707707        return VINF_SUCCESS;
    708708    }
     
    739739    RT_NOREF(pCfg);
    740740
    741     PIOMMU   pThis   = PDMDEVINS_2_DATA(pDevIns, PIOMMU);
    742     PIOMMUR3 pThisR3 = PDMDEVINS_2_DATA_CC(pDevIns, PIOMMUR3);
     741    PDMAR   pThis   = PDMDEVINS_2_DATA(pDevIns, PDMAR);
     742    PDMARR3 pThisR3 = PDMDEVINS_2_DATA_CC(pDevIns, PDMARR3);
    743743    pThisR3->pDevInsR3 = pDevIns;
    744744
     
    780780
    781781    /* Header. */
    782     PDMPciDevSetVendorId(pPciDev,          VTD_PCI_VENDOR_ID);         /* Intel */
    783     PDMPciDevSetDeviceId(pPciDev,          VTD_PCI_DEVICE_ID);         /* VirtualBox DMAR device */
    784     PDMPciDevSetRevisionId(pPciDev,        VTD_PCI_REVISION_ID);       /* VirtualBox specific device implementation revision */
     782    PDMPciDevSetVendorId(pPciDev,          DMAR_PCI_VENDOR_ID);         /* Intel */
     783    PDMPciDevSetDeviceId(pPciDev,          DMAR_PCI_DEVICE_ID);         /* VirtualBox DMAR device */
     784    PDMPciDevSetRevisionId(pPciDev,        DMAR_PCI_REVISION_ID);       /* VirtualBox specific device implementation revision */
    785785    PDMPciDevSetClassBase(pPciDev,         VBOX_PCI_CLASS_SYSTEM);     /* System Base Peripheral */
    786786    PDMPciDevSetClassSub(pPciDev,          VBOX_PCI_SUB_SYSTEM_OTHER); /* Other */
    787787    PDMPciDevSetHeaderType(pPciDev,        0x0);                       /* Single function, type 0 */
    788     PDMPciDevSetSubSystemId(pPciDev,       VTD_PCI_DEVICE_ID);         /* VirtualBox DMAR device */
    789     PDMPciDevSetSubSystemVendorId(pPciDev, VTD_PCI_VENDOR_ID);         /* Intel */
     788    PDMPciDevSetSubSystemId(pPciDev,       DMAR_PCI_DEVICE_ID);        /* VirtualBox DMAR device */
     789    PDMPciDevSetSubSystemVendorId(pPciDev, DMAR_PCI_VENDOR_ID);        /* Intel */
    790790
    791791    /** @todo VTD: Chipset spec says PCI Express Capability Id. Relevant for us? */
     
    821821     * Register MMIO region.
    822822     */
    823     AssertCompile(!(VTD_MMIO_BASE_PHYSADDR & X86_PAGE_4K_OFFSET_MASK));
    824     rc = PDMDevHlpMmioCreateAndMap(pDevIns, VTD_MMIO_BASE_PHYSADDR, VTD_MMIO_SIZE, iommuIntelMmioWrite, iommuIntelMmioRead,
     823    AssertCompile(!(DMAR_MMIO_BASE_PHYSADDR & X86_PAGE_4K_OFFSET_MASK));
     824    rc = PDMDevHlpMmioCreateAndMap(pDevIns, DMAR_MMIO_BASE_PHYSADDR, DMAR_MMIO_SIZE, dmarMmioWrite, dmarMmioRead,
    825825                                   IOMMMIO_FLAGS_READ_DWORD_QWORD | IOMMMIO_FLAGS_WRITE_DWORD_QWORD_ZEROED,
    826826                                   "Intel-IOMMU", &pThis->hMmio);
     
    838838{
    839839    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    840     PIOMMU   pThis   = PDMDEVINS_2_DATA(pDevIns, PIOMMU);
    841     PIOMMUCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PIOMMUCC);
     840    PDMAR   pThis   = PDMDEVINS_2_DATA(pDevIns, PDMAR);
     841    PDMARCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDMARCC);
    842842    pThisCC->CTX_SUFF(pDevIns) = pDevIns;
    843843
     
    847847
    848848    /* Set up the MMIO RZ handlers. */
    849     rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, iommuIntelMmioWrite, iommuIntelMmioRead, NULL /* pvUser */);
     849    rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, dmarMmioWrite, dmarMmioRead, NULL /* pvUser */);
    850850    AssertRCReturn(rc, rc);
    851851
     
    884884    /* .cMaxInstances = */          1,
    885885    /* .uSharedVersion = */         42,
    886     /* .cbInstanceShared = */       sizeof(IOMMU),
    887     /* .cbInstanceCC = */           sizeof(IOMMUCC),
    888     /* .cbInstanceRC = */           sizeof(IOMMURC),
     886    /* .cbInstanceShared = */       sizeof(DMAR),
     887    /* .cbInstanceCC = */           sizeof(DMARCC),
     888    /* .cbInstanceRC = */           sizeof(DMARRC),
    889889    /* .cMaxPciDevices = */         1,          /** @todo Make this 0 if this isn't a PCI device. */
    890890    /* .cMaxMsixVectors = */        0,
  • trunk/src/VBox/Devices/Bus/DevIommuIntel.h

    r88332 r88342  
    2525
    2626/** Intel vendor ID for the DMAR unit. */
    27 #define VTD_PCI_VENDOR_ID                           0x8086
     27#define DMAR_PCI_VENDOR_ID                          0x8086
    2828/** VirtualBox DMAR unit's device ID. */
    29 #define VTD_PCI_DEVICE_ID                           0xc0de
     29#define DMAR_PCI_DEVICE_ID                          0xc0de
    3030/** VirtualBox DMAR unit's device revision ID. */
    31 #define VTD_PCI_REVISION_ID                         0x01
     31#define DMAR_PCI_REVISION_ID                        0x01
    3232
    3333/** Feature/capability flags exposed to the guest (x2APIC Opt Out until we get
    3434 *  regular APIC setup working). */
    35 #define VTD_ACPI_DMAR_FLAGS                         (ACPI_DMAR_F_INTR_REMAP | ACPI_DMAR_F_X2APIC_OPT_OUT)
     35#define DMAR_ACPI_DMAR_FLAGS                        (ACPI_DMAR_F_INTR_REMAP | ACPI_DMAR_F_X2APIC_OPT_OUT)
    3636
    3737/** The MMIO base address of the DMAR unit (taken from real hardware). */
    38 #define VTD_MMIO_BASE_PHYSADDR                      UINT64_C(0xfed90000)
     38#define DMAR_MMIO_BASE_PHYSADDR                     UINT64_C(0xfed90000)
    3939/** The size of the MMIO region (in bytes). */
    40 #define VTD_MMIO_SIZE                               4096
     40#define DMAR_MMIO_SIZE                              4096
    4141
    4242#endif /* !VBOX_INCLUDED_SRC_Bus_DevIommuIntel_h */
  • trunk/src/VBox/Devices/PC/DevACPI.cpp

    r88340 r88342  
    33823382    Assert(cPhysAddrBits > 0); NOREF(cLinearAddrBits);
    33833383    VtdTable.Dmar.uHostAddrWidth = cPhysAddrBits - 1;
    3384     VtdTable.Dmar.fFlags         = VTD_ACPI_DMAR_FLAGS;
     3384    VtdTable.Dmar.fFlags         = DMAR_ACPI_DMAR_FLAGS;
    33853385
    33863386    /* DRHD. */
    33873387    VtdTable.Drhd.cbLength     = sizeof(ACPIDRHD) /* + sizeof(VtdTable.DevScope) */;
    33883388    VtdTable.Drhd.fFlags       = ACPI_DRHD_F_INCLUDE_PCI_ALL;
    3389     VtdTable.Drhd.uRegBaseAddr = VTD_MMIO_BASE_PHYSADDR;
     3389    VtdTable.Drhd.uRegBaseAddr = DMAR_MMIO_BASE_PHYSADDR;
    33903390
    33913391    /* Finally, compute checksum. */
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