VirtualBox

Changeset 89523 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 5, 2021 6:49:18 AM (4 years ago)
Author:
vboxsync
Message:

Intel IOMMU: bugref:9967 Address translation, WIP.

File:
1 edited

Legend:

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

    r89513 r89523  
    179179
    180180    /* Address Translation Faults. */
    181     kDmarDiag_Atf_Lct_1,
    182     kDmarDiag_Atf_Lct_2,
    183     kDmarDiag_Atf_Lct_3,
    184     kDmarDiag_Atf_Lct_4_1,
    185     kDmarDiag_Atf_Lct_4_2,
    186     kDmarDiag_Atf_Lct_4_3,
    187     kDmarDiag_Atf_Lct_5,
    188     kDmarDiag_Atf_Lgn_1_1,
    189     kDmarDiag_Atf_Lgn_1_2,
    190     kDmarDiag_Atf_Lgn_1_3,
    191     kDmarDiag_Atf_Lgn_4,
    192     kDmarDiag_Atf_Lrt_1,
    193     kDmarDiag_Atf_Lrt_2,
    194     kDmarDiag_Atf_Lrt_3,
    195     kDmarDiag_Atf_Lsl_1,
    196     kDmarDiag_Atf_Lsl_2,
    197     kDmarDiag_Atf_Lsl_2_LargePage,
    198     kDmarDiag_Atf_Rta_1_1,
    199     kDmarDiag_Atf_Rta_1_2,
    200     kDmarDiag_Atf_Rta_1_3,
    201     kDmarDiag_Atf_Sgn_5,
    202     kDmarDiag_Atf_Sgn_8,
    203     kDmarDiag_Atf_Ssl_1,
    204     kDmarDiag_Atf_Ssl_2,
    205     kDmarDiag_Atf_Ssl_3,
    206     kDmarDiag_Atf_Ssl_3_LargePage,
     181    kDmarDiag_At_Lm_CtxEntry_Not_Present,
     182    kDmarDiag_At_Lm_CtxEntry_Read_Failed,
     183    kDmarDiag_At_Lm_CtxEntry_Rsvd,
     184    kDmarDiag_At_Lm_Pt_At_Block,
     185    kDmarDiag_At_Lm_Pt_Aw_Invalid,
     186    kDmarDiag_At_Lm_RootEntry_Not_Present,
     187    kDmarDiag_At_Lm_RootEntry_Read_Failed,
     188    kDmarDiag_At_Lm_RootEntry_Rsvd,
     189    kDmarDiag_At_Lm_Slpptr_Read_Failed,
     190    kDmarDiag_At_Lm_Tt_Invalid,
     191    kDmarDiag_At_Lm_Ut_At_Block,
     192    kDmarDiag_At_Lm_Ut_Aw_Invalid,
     193    kDmarDiag_At_Rta_Adms_Not_Supported,
     194    kDmarDiag_At_Rta_Rsvd,
     195    kDmarDiag_At_Rta_Smts_Not_Supported,
     196    kDmarDiag_At_Xm_AddrIn_Invalid,
     197    kDmarDiag_At_Xm_AddrOut_Invalid,
     198    kDmarDiag_At_Xm_Perm_Denied,
     199    kDmarDiag_At_Xm_Pte_Rsvd,
     200    kDmarDiag_At_Xm_Pte_Sllps_Invalid,
     201    kDmarDiag_At_Xm_Read_Pte_Failed,
    207202
    208203    /* CCMD_REG faults. */
    209     kDmarDiag_CcmdReg_NotSupported,
     204    kDmarDiag_CcmdReg_Not_Supported,
    210205    kDmarDiag_CcmdReg_Qi_Enabled,
    211206    kDmarDiag_CcmdReg_Ttm_Invalid,
     
    225220    /* IQT_REG faults. */
    226221    kDmarDiag_IqtReg_Qt_Invalid,
    227     kDmarDiag_IqtReg_Qt_NotAligned,
    228 
    229     /* Compatibility Format Interrupt Faults. */
     222    kDmarDiag_IqtReg_Qt_Not_Aligned,
     223
     224    /* Interrupt Remapping Faults. */
    230225    kDmarDiag_Ir_Cfi_Blocked,
    231 
    232     /* Remappable Format Interrupt Faults. */
    233226    kDmarDiag_Ir_Rfi_Intr_Index_Invalid,
    234227    kDmarDiag_Ir_Rfi_Irte_Mode_Invalid,
     
    257250static const char *const g_apszDmarDiagDesc[] =
    258251{
    259     DMARDIAG_DESC(None                      ),
    260     DMARDIAG_DESC(Atf_Lct_1                 ),
    261     DMARDIAG_DESC(Atf_Lct_2                 ),
    262     DMARDIAG_DESC(Atf_Lct_3                 ),
    263     DMARDIAG_DESC(Atf_Lct_4_1               ),
    264     DMARDIAG_DESC(Atf_Lct_4_2               ),
    265     DMARDIAG_DESC(Atf_Lct_4_3               ),
    266     DMARDIAG_DESC(Atf_Lct_5                 ),
    267     DMARDIAG_DESC(Atf_Lgn_1_1               ),
    268     DMARDIAG_DESC(Atf_Lgn_1_2               ),
    269     DMARDIAG_DESC(Atf_Lgn_1_3               ),
    270     DMARDIAG_DESC(Atf_Lgn_4                 ),
    271     DMARDIAG_DESC(Atf_Lrt_1                 ),
    272     DMARDIAG_DESC(Atf_Lrt_2                 ),
    273     DMARDIAG_DESC(Atf_Lrt_3                 ),
    274     DMARDIAG_DESC(Atf_Lsl_1                 ),
    275     DMARDIAG_DESC(Atf_Lsl_2                 ),
    276     DMARDIAG_DESC(Atf_Lsl_2_LargePage       ),
    277     DMARDIAG_DESC(Atf_Rta_1_1               ),
    278     DMARDIAG_DESC(Atf_Rta_1_2               ),
    279     DMARDIAG_DESC(Atf_Rta_1_3               ),
    280     DMARDIAG_DESC(Atf_Sgn_5                 ),
    281     DMARDIAG_DESC(Atf_Sgn_8                 ),
    282     DMARDIAG_DESC(Atf_Ssl_1                 ),
    283     DMARDIAG_DESC(Atf_Ssl_2                 ),
    284     DMARDIAG_DESC(Atf_Ssl_3                 ),
    285     DMARDIAG_DESC(Atf_Ssl_3_LargePage       ),
    286     DMARDIAG_DESC(CcmdReg_NotSupported      ),
    287     DMARDIAG_DESC(CcmdReg_Qi_Enabled        ),
    288     DMARDIAG_DESC(CcmdReg_Ttm_Invalid       ),
    289     DMARDIAG_DESC(IqaReg_Dsc_Fetch_Error    ),
    290     DMARDIAG_DESC(IqaReg_Dw_128_Invalid     ),
    291     DMARDIAG_DESC(IqaReg_Dw_256_Invalid     ),
    292     DMARDIAG_DESC(Iqei_Dsc_Type_Invalid     ),
    293     DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_0_1_Rsvd),
    294     DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_2_3_Rsvd),
    295     DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_Invalid ),
    296     DMARDIAG_DESC(Iqei_Ttm_Rsvd             ),
    297     DMARDIAG_DESC(IqtReg_Qt_Invalid         ),
    298     DMARDIAG_DESC(IqtReg_Qt_NotAligned      ),
    299     DMARDIAG_DESC(Ir_Cfi_Blocked            ),
    300     DMARDIAG_DESC(Ir_Rfi_Intr_Index_Invalid ),
    301     DMARDIAG_DESC(Ir_Rfi_Irte_Mode_Invalid  ),
    302     DMARDIAG_DESC(Ir_Rfi_Irte_Not_Present   ),
    303     DMARDIAG_DESC(Ir_Rfi_Irte_Read_Failed   ),
    304     DMARDIAG_DESC(Ir_Rfi_Irte_Rsvd          ),
    305     DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Bus       ),
    306     DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Masked    ),
    307     DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Rsvd      ),
    308     DMARDIAG_DESC(Ir_Rfi_Rsvd               ),
     252    DMARDIAG_DESC(None                       ),
     253
     254    /* Address Translation Faults. */
     255    DMARDIAG_DESC(At_Lm_CtxEntry_Not_Present ),
     256    DMARDIAG_DESC(At_Lm_CtxEntry_Read_Failed ),
     257    DMARDIAG_DESC(At_Lm_CtxEntry_Rsvd        ),
     258    DMARDIAG_DESC(At_Lm_Pt_At_Block          ),
     259    DMARDIAG_DESC(At_Lm_Pt_Aw_Invalid        ),
     260    DMARDIAG_DESC(At_Lm_RootEntry_Not_Present),
     261    DMARDIAG_DESC(At_Lm_RootEntry_Read_Failed),
     262    DMARDIAG_DESC(At_Lm_RootEntry_Rsvd       ),
     263    DMARDIAG_DESC(At_Lm_Slpptr_Read_Failed   ),
     264    DMARDIAG_DESC(At_Lm_Tt_Invalid           ),
     265    DMARDIAG_DESC(At_Lm_Ut_At_Block          ),
     266    DMARDIAG_DESC(At_Lm_Ut_Aw_Invalid        ),
     267    DMARDIAG_DESC(At_Rta_Adms_Not_Supported  ),
     268    DMARDIAG_DESC(At_Rta_Rsvd                ),
     269    DMARDIAG_DESC(At_Rta_Smts_Not_Supported  ),
     270    DMARDIAG_DESC(At_Xm_AddrIn_Invalid       ),
     271    DMARDIAG_DESC(At_Xm_AddrOut_Invalid      ),
     272    DMARDIAG_DESC(At_Xm_Perm_Denied          ),
     273    DMARDIAG_DESC(At_Xm_Pte_Rsvd             ),
     274    DMARDIAG_DESC(At_Xm_Pte_Sllps_Invalid    ),
     275    DMARDIAG_DESC(At_Xm_Read_Pte_Failed      ),
     276
     277    /* CCMD_REG faults. */
     278    DMARDIAG_DESC(CcmdReg_Not_Supported      ),
     279    DMARDIAG_DESC(CcmdReg_Qi_Enabled         ),
     280    DMARDIAG_DESC(CcmdReg_Ttm_Invalid        ),
     281
     282    /* IQA_REG faults. */
     283    DMARDIAG_DESC(IqaReg_Dsc_Fetch_Error     ),
     284    DMARDIAG_DESC(IqaReg_Dw_128_Invalid      ),
     285    DMARDIAG_DESC(IqaReg_Dw_256_Invalid      ),
     286
     287    /* Invalidation Queue Error Info. */
     288    DMARDIAG_DESC(Iqei_Dsc_Type_Invalid      ),
     289    DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_0_1_Rsvd ),
     290    DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_2_3_Rsvd ),
     291    DMARDIAG_DESC(Iqei_Inv_Wait_Dsc_Invalid  ),
     292    DMARDIAG_DESC(Iqei_Ttm_Rsvd              ),
     293
     294    /* IQT_REG faults. */
     295    DMARDIAG_DESC(IqtReg_Qt_Invalid          ),
     296    DMARDIAG_DESC(IqtReg_Qt_Not_Aligned      ),
     297
     298    /* Interrupt remapping faults. */
     299    DMARDIAG_DESC(Ir_Cfi_Blocked             ),
     300    DMARDIAG_DESC(Ir_Rfi_Intr_Index_Invalid  ),
     301    DMARDIAG_DESC(Ir_Rfi_Irte_Mode_Invalid   ),
     302    DMARDIAG_DESC(Ir_Rfi_Irte_Not_Present    ),
     303    DMARDIAG_DESC(Ir_Rfi_Irte_Read_Failed    ),
     304    DMARDIAG_DESC(Ir_Rfi_Irte_Rsvd           ),
     305    DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Bus        ),
     306    DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Masked     ),
     307    DMARDIAG_DESC(Ir_Rfi_Irte_Svt_Rsvd       ),
     308    DMARDIAG_DESC(Ir_Rfi_Rsvd                ),
    309309    /* kDmarDiag_End */
    310310};
     
    15491549
    15501550/**
    1551  * Records an address translation fault (extended version).
     1551 * Records an address translation fault.
    15521552 *
    15531553 * @param   pDevIns         The IOMMU device instance.
    15541554 * @param   enmDiag         The diagnostic reason.
    1555  * @param   enmAtFault      The address translation fault reason.
    15561555 * @param   pMemReqIn       The DMA memory request input.
    15571556 * @param   pMemReqAux      The DMA memory request auxiliary info.
    15581557 */
    1559 static void dmarAtFaultRecordEx(PPDMDEVINS pDevIns, DMARDIAG enmDiag, VTDATFAULT enmAtFault, PCDMARMEMREQIN pMemReqIn,
    1560                                 PCDMARMEMREQAUX pMemReqAux)
    1561 {
    1562     /* Update the diagnostic reason (even if software wants to supress faults). */
     1558static void dmarAtFaultRecord(PPDMDEVINS pDevIns, DMARDIAG enmDiag, PCDMARMEMREQIN pMemReqIn, PCDMARMEMREQAUX pMemReqAux)
     1559{
     1560    /*
     1561     * Update the diagnostic reason (even if software wants to supress faults).
     1562     */
    15631563    PDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    15641564    pThis->enmDiag = enmDiag;
     
    15701570    if (!pMemReqAux->fFpd)
    15711571    {
     1572        /*
     1573         * Figure out the fault reason to report to software from our diagnostic code.
     1574         * The case labels below are sorted alphabetically for convenience.
     1575         */
     1576        VTDATFAULT enmAtFault;
     1577        bool const fLm = pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE;
     1578        switch (enmDiag)
     1579        {
     1580            /* LM (Legacy Mode) faults. */
     1581            case kDmarDiag_At_Lm_CtxEntry_Not_Present:       enmAtFault = VTDATFAULT_LCT_2;    break;
     1582            case kDmarDiag_At_Lm_CtxEntry_Read_Failed:       enmAtFault = VTDATFAULT_LCT_1;    break;
     1583            case kDmarDiag_At_Lm_CtxEntry_Rsvd:              enmAtFault = VTDATFAULT_LCT_3;    break;
     1584            case kDmarDiag_At_Lm_Pt_At_Block:                enmAtFault = VTDATFAULT_LCT_5;    break;
     1585            case kDmarDiag_At_Lm_Pt_Aw_Invalid:              enmAtFault = VTDATFAULT_LGN_1_3;  break;
     1586            case kDmarDiag_At_Lm_RootEntry_Not_Present:      enmAtFault = VTDATFAULT_LRT_2;    break;
     1587            case kDmarDiag_At_Lm_RootEntry_Read_Failed:      enmAtFault = VTDATFAULT_LRT_1;    break;
     1588            case kDmarDiag_At_Lm_RootEntry_Rsvd:             enmAtFault = VTDATFAULT_LRT_3;    break;
     1589            case kDmarDiag_At_Lm_Slpptr_Read_Failed:         enmAtFault = VTDATFAULT_LCT_4_3;  break;
     1590            case kDmarDiag_At_Lm_Tt_Invalid:                 enmAtFault = VTDATFAULT_LCT_4_2;  break;
     1591            case kDmarDiag_At_Lm_Ut_At_Block:                enmAtFault = VTDATFAULT_LCT_5;    break;
     1592            case kDmarDiag_At_Lm_Ut_Aw_Invalid:              enmAtFault = VTDATFAULT_LCT_4_1;  break;
     1593
     1594            /* RTA (Root Table Address) faults. */
     1595            case kDmarDiag_At_Rta_Adms_Not_Supported:        enmAtFault = VTDATFAULT_RTA_1_1;  break;
     1596            case kDmarDiag_At_Rta_Rsvd:                      enmAtFault = VTDATFAULT_RTA_1_2;  break;
     1597            case kDmarDiag_At_Rta_Smts_Not_Supported:        enmAtFault = VTDATFAULT_RTA_1_3;  break;
     1598
     1599            /* XM (Legacy mode or Scalable Mode) faults. */
     1600            case kDmarDiag_At_Xm_AddrIn_Invalid:             enmAtFault = fLm ? VTDATFAULT_LGN_1_1 : VTDATFAULT_SGN_5; break;
     1601            case kDmarDiag_At_Xm_AddrOut_Invalid:            enmAtFault = fLm ? VTDATFAULT_LGN_4 : VTDATFAULT_SGN_8;   break;
     1602            case kDmarDiag_At_Xm_Perm_Denied:                enmAtFault = fLm ? VTDATFAULT_LSL_2 : VTDATFAULT_SSL_2;   break;
     1603            case kDmarDiag_At_Xm_Pte_Rsvd:
     1604            case kDmarDiag_At_Xm_Pte_Sllps_Invalid:          enmAtFault = fLm ? VTDATFAULT_LSL_2 : VTDATFAULT_SSL_3;   break;
     1605            case kDmarDiag_At_Xm_Read_Pte_Failed:            enmAtFault = fLm ? VTDATFAULT_LSL_1 : VTDATFAULT_SSL_1;   break;
     1606
     1607            /* Shouldn't ever happen. */
     1608            default:
     1609            {
     1610                AssertLogRelMsgFailedReturnVoid(("%s: Invalid address translation fault diagnostic code %#x\n",
     1611                                                 DMAR_LOG_PFX, enmDiag));
     1612            }
     1613        }
     1614
     1615        /* Construct and record the error. */
    15721616        uint16_t const idDevice  = pMemReqIn->idDevice;
    15731617        uint8_t const  fType1    = pMemReqIn->enmReqType & RT_BIT(1);
     
    15921636        dmarPrimaryFaultRecord(pDevIns, uFrcdHi, uFrcdLo);
    15931637    }
    1594 }
    1595 
    1596 
    1597 /**
    1598  * Records an address translation fault.
    1599  *
    1600  * @param   pDevIns         The IOMMU device instance.
    1601  * @param   enmDiag         The diagnostic reason.
    1602  * @param   enmAtFault      The address translation fault reason.
    1603  * @param   pMemReqRemap    The DMA memory request remapping info.
    1604  */
    1605 static void dmarAtFaultRecord(PPDMDEVINS pDevIns, DMARDIAG enmDiag, VTDATFAULT enmAtFault, PCDMARMEMREQREMAP pMemReqRemap)
    1606 {
    1607     dmarAtFaultRecordEx(pDevIns, enmDiag, enmAtFault, &pMemReqRemap->In, &pMemReqRemap->Aux);
    16081638}
    16091639
     
    17611791            }
    17621792            else
    1763                 pThis->enmDiag = kDmarDiag_CcmdReg_NotSupported;
     1793                pThis->enmDiag = kDmarDiag_CcmdReg_Not_Supported;
    17641794            dmarRegChangeRaw64(pThis, VTD_MMIO_OFF_GSTS_REG, ~VTD_BF_CCMD_REG_CAIG_MASK, 0 /* fOrMask */);
    17651795        }
     
    18451875        /* Hardware treats bit 4 as RsvdZ in this situation, so clear it. */
    18461876        dmarRegChangeRaw32(pThis, offReg, ~RT_BIT(4), 0 /* fOrMask */);
    1847         dmarIqeFaultRecord(pDevIns, kDmarDiag_IqtReg_Qt_NotAligned, VTDIQEI_QUEUE_TAIL_MISALIGNED);
     1877        dmarIqeFaultRecord(pDevIns, kDmarDiag_IqtReg_Qt_Not_Aligned, VTDIQEI_QUEUE_TAIL_MISALIGNED);
    18481878    }
    18491879    return VINF_SUCCESS;
     
    20902120    }
    20912121
    2092     if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2093         dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lgn_4, VTDATFAULT_LGN_4, pMemReqIn, pMemReqAux);
    2094     else
    2095         dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Sgn_8, VTDATFAULT_SGN_8, pMemReqIn, pMemReqAux);
     2122    dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_AddrOut_Invalid, pMemReqIn, pMemReqAux);
    20962123    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    20972124}
     
    21382165    else
    21392166    {
    2140         if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2141             dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lgn_1_1, VTDATFAULT_LGN_1_1, pMemReqIn, pMemReqAux);
    2142         else
    2143             dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Sgn_5, VTDATFAULT_SGN_5, pMemReqIn, pMemReqAux);
     2167        dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_AddrIn_Invalid, pMemReqIn, pMemReqAux);
    21442168        return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    21452169    }
     
    21692193        else
    21702194        {
    2171             if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2172                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pMemReqIn, pMemReqAux);
    2173             else
    2174                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Ssl_2, VTDATFAULT_SSL_2, pMemReqIn, pMemReqAux);
     2195            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_Perm_Denied, pMemReqIn, pMemReqAux);
    21752196            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    21762197        }
     
    21832204        else
    21842205        {
    2185             if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2186                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lsl_2, VTDATFAULT_LSL_2, pMemReqIn, pMemReqAux);
    2187             else
    2188                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Ssl_3, VTDATFAULT_SSL_3, pMemReqIn, pMemReqAux);
     2206            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_Pte_Rsvd, pMemReqIn, pMemReqAux);
    21892207            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    21902208        }
     
    22122230            }
    22132231
    2214             if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2215                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lsl_2_LargePage, VTDATFAULT_LSL_2, pMemReqIn, pMemReqAux);
    2216             else
    2217                 dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Ssl_3_LargePage, VTDATFAULT_SSL_3, pMemReqIn, pMemReqAux);
     2232            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_Pte_Sllps_Invalid, pMemReqIn, pMemReqAux);
    22182233            return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    22192234        }
     
    22462261            else
    22472262            {
    2248                 if (pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE)
    2249                     dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Lsl_1, VTDATFAULT_LSL_1, pMemReqIn, pMemReqAux);
    2250                 else
    2251                     dmarAtFaultRecordEx(pDevIns, kDmarDiag_Atf_Ssl_1, VTDATFAULT_SSL_1, pMemReqIn, pMemReqAux);
     2263                dmarAtFaultRecord(pDevIns, kDmarDiag_At_Xm_Read_Pte_Failed, pMemReqIn, pMemReqAux);
    22522264                return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    22532265            }
     
    23732385static int dmarDrLegacyModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARMEMREQREMAP pMemReqRemap)
    23742386{
    2375     Assert(pMemReqRemap->Aux.fTtm == VTD_TTM_LEGACY_MODE);    /* Paranoia. */
     2387    PCDMARMEMREQIN  pMemReqIn  = &pMemReqRemap->In;
     2388    PDMARMEMREQAUX  pMemReqAux = &pMemReqRemap->Aux;
     2389    PDMARMEMREQOUT  pMemReqOut = &pMemReqRemap->Out;
     2390    Assert(pMemReqAux->fTtm == VTD_TTM_LEGACY_MODE);    /* Paranoia. */
    23762391
    23772392    /* Read the root-entry from guest memory. */
    2378     uint8_t const idxRootEntry = RT_HI_U8(pMemReqRemap->In.idDevice);
     2393    uint8_t const idxRootEntry = RT_HI_U8(pMemReqIn->idDevice);
    23792394    VTD_ROOT_ENTRY_T RootEntry;
    23802395    int rc = dmarDrReadRootEntry(pDevIns, uRtaddrReg, idxRootEntry, &RootEntry);
     
    23932408                /* Read the context-entry from guest memory. */
    23942409                RTGCPHYS const GCPhysCtxTable = uRootEntryQword0 & VTD_BF_0_ROOT_ENTRY_CTP_MASK;
    2395                 uint8_t const idxCtxEntry = RT_LO_U8(pMemReqRemap->In.idDevice);
     2410                uint8_t const idxCtxEntry = RT_LO_U8(pMemReqIn->idDevice);
    23962411                VTD_CONTEXT_ENTRY_T CtxEntry;
    23972412                rc = dmarDrReadCtxEntry(pDevIns, GCPhysCtxTable, idxCtxEntry, &CtxEntry);
     
    24022417
    24032418                    /* Note the FPD bit which software can use to supress translation faults from here on in. */
    2404                     pMemReqRemap->Aux.fFpd = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_FPD);
     2419                    pMemReqAux->fFpd = RT_BF_GET(uCtxEntryQword0, VTD_BF_0_CONTEXT_ENTRY_FPD);
    24052420
    24062421                    /* Check if the context-entry is present (must be done before validating reserved bits). */
     
    24132428                        {
    24142429                            /* Get the domain ID for this mapping. */
    2415                             pMemReqRemap->Out.idDomain = RT_BF_GET(uCtxEntryQword1, VTD_BF_1_CONTEXT_ENTRY_DID);
     2430                            pMemReqOut->idDomain = RT_BF_GET(uCtxEntryQword1, VTD_BF_1_CONTEXT_ENTRY_DID);
    24162431
    24172432                            /* Validate the translation type (TT). */
     
    24262441                                     * through SLPTPTR. Translated requests and Translation Requests are blocked.
    24272442                                     */
    2428                                     if (pMemReqRemap->In.enmAddrType == PCIADDRTYPE_UNTRANSLATED)
     2443                                    if (pMemReqIn->enmAddrType == PCIADDRTYPE_UNTRANSLATED)
    24292444                                    {
    24302445                                        /* Validate the address width and get the paging level. */
     
    24392454                                            {
    24402455                                                /* Finally... perform second-level translation. */
    2441                                                 pMemReqRemap->Aux.uSlptPtr     = SlptPtr;
    2442                                                 pMemReqRemap->Aux.cPagingLevel = cPagingLevel;
     2456                                                pMemReqAux->uSlptPtr     = SlptPtr;
     2457                                                pMemReqAux->cPagingLevel = cPagingLevel;
    24432458                                                return dmarDrMemRangeLookup(pDevIns, dmarDrSecondLevelTranslate, pMemReqRemap);
    24442459                                            }
    2445                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_3, VTDATFAULT_LCT_4_3, pMemReqRemap);
     2460                                            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Slpptr_Read_Failed, pMemReqIn, pMemReqAux);
    24462461                                        }
    24472462                                        else
    2448                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_1, VTDATFAULT_LCT_4_1, pMemReqRemap);
     2463                                            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Ut_Aw_Invalid, pMemReqIn, pMemReqAux);
    24492464                                    }
    24502465                                    else
    2451                                         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pMemReqRemap);
     2466                                        dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Ut_At_Block, pMemReqIn, pMemReqAux);
    24522467                                    break;
    24532468                                }
     
    24732488                                                return VINF_SUCCESS;
    24742489                                            }
    2475                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lgn_1_3, VTDATFAULT_LGN_1_3, pMemReqRemap);
     2490                                            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Pt_Aw_Invalid, pMemReqIn, pMemReqAux);
    24762491                                        }
    24772492                                        else
    2478                                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_5, VTDATFAULT_LCT_5, pMemReqRemap);
     2493                                            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Pt_At_Block, pMemReqIn, pMemReqAux);
    24792494                                        break;
    24802495                                    }
     
    24952510                                {
    24962511                                    /* Any other TT value is reserved. */
    2497                                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_4_2, VTDATFAULT_LCT_4_2, pMemReqRemap);
     2512                                    dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_Tt_Invalid, pMemReqIn, pMemReqAux);
    24982513                                    break;
    24992514                                }
     
    25012516                        }
    25022517                        else
    2503                             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_3, VTDATFAULT_LCT_3, pMemReqRemap);
     2518                            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_CtxEntry_Rsvd, pMemReqIn, pMemReqAux);
    25042519                    }
    25052520                    else
    2506                         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_2, VTDATFAULT_LCT_2, pMemReqRemap);
     2521                        dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_CtxEntry_Not_Present, pMemReqIn, pMemReqAux);
    25072522                }
    25082523                else
    2509                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lct_1, VTDATFAULT_LCT_1, pMemReqRemap);
     2524                    dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_CtxEntry_Read_Failed, pMemReqIn, pMemReqAux);
    25102525            }
    25112526            else
    2512                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_3, VTDATFAULT_LRT_3, pMemReqRemap);
     2527                dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_RootEntry_Rsvd, pMemReqIn, pMemReqAux);
    25132528        }
    25142529        else
    2515             dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_2, VTDATFAULT_LRT_2, pMemReqRemap);
     2530            dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_RootEntry_Not_Present, pMemReqIn, pMemReqAux);
    25162531    }
    25172532    else
    2518         dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Lrt_1, VTDATFAULT_LRT_1, pMemReqRemap);
     2533        dmarAtFaultRecord(pDevIns, kDmarDiag_At_Lm_RootEntry_Read_Failed, pMemReqIn, pMemReqAux);
    25192534    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    25202535}
     
    25312546static int dmarDrScalableModeRemapAddr(PPDMDEVINS pDevIns, uint64_t uRtaddrReg, PDMARMEMREQREMAP pMemReqRemap)
    25322547{
     2548    NOREF(pMemReqRemap);
     2549
    25332550    PCDMAR pThis = PDMDEVINS_2_DATA(pDevIns, PDMAR);
    25342551    if (pThis->fExtCapReg & VTD_BF_ECAP_REG_SMTS_MASK)
     
    25382555    }
    25392556
    2540     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_3, VTDATFAULT_RTA_1_3, pMemReqRemap);
    25412557    return VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    25422558}
     
    26382654            case VTD_TTM_SCALABLE_MODE:
    26392655            {
    2640                 rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, &MemReqRemap);
     2656                if (pThis->fExtCapReg & VTD_BF_ECAP_REG_SMTS_MASK)
     2657                    rc = dmarDrScalableModeRemapAddr(pDevIns, uRtaddrReg, &MemReqRemap);
     2658                else
     2659                {
     2660                    rc = VERR_IOMMU_ADDR_TRANSLATION_FAILED;
     2661                    dmarAtFaultRecord(pDevIns, kDmarDiag_At_Rta_Smts_Not_Supported, &MemReqRemap.In, &MemReqRemap.Aux);
     2662                }
    26412663                break;
    26422664            }
     
    26482670                    dmarDrTargetAbort(pDevIns);
    26492671                else
    2650                     dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_1, VTDATFAULT_RTA_1_1, &MemReqRemap);
     2672                    dmarAtFaultRecord(pDevIns, kDmarDiag_At_Rta_Adms_Not_Supported, &MemReqRemap.In, &MemReqRemap.Aux);
    26512673                break;
    26522674            }
     
    26552677            {
    26562678                rc = VERR_IOMMU_ADDR_TRANSLATION_FAILED;
    2657                 dmarAtFaultRecord(pDevIns, kDmarDiag_Atf_Rta_1_2, VTDATFAULT_RTA_1_2, &MemReqRemap);
     2679                dmarAtFaultRecord(pDevIns, kDmarDiag_At_Rta_Rsvd, &MemReqRemap.In, &MemReqRemap.Aux);
    26582680                break;
    26592681            }
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