VirtualBox

Changeset 83542 in vbox for trunk/src


Ignore:
Timestamp:
Apr 3, 2020 5:51:10 PM (5 years ago)
Author:
vboxsync
Message:

AMD IOMMU: bugref:9654 Bits.

File:
1 edited

Legend:

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

    r83519 r83542  
    2525
    2626#include "VBoxDD.h"
     27#include <iprt/x86.h>
    2728
    2829
     
    10821083    /** The 64-bit unsigned integer view. */
    10831084    uint64_t    u64;
    1084 } IOMMU_EXCL_BASE_T;
    1085 AssertCompileSize(IOMMU_EXCL_BASE_T, 8);
     1085} IOMMU_EXCL_RANGE_BAR_T;
     1086AssertCompileSize(IOMMU_EXCL_RANGE_BAR_T, 8);
    10861087
    10871088/**
     
    11301131        uint32_t    u2DualEvtLogSup : 2;          /**< Bits 29:28 - DualEventLogSup: Dual Event Log Support. */
    11311132        uint32_t    u2Rsvd1 : 2;                  /**< Bits 31:30 - Reserved. */
    1132 
    11331133        uint32_t    u5MaxPasidSup : 5;            /**< Bits 36:32 - PASMax: Maximum PASID Supported. */
    11341134        uint32_t    u1UserSupervisorSup : 1;      /**< Bit  37    - USSup: User/Supervisor Page Protection Support. */
     
    11551155    /** The 64-bit unsigned integer view. */
    11561156    uint64_t    u64;
    1157 } IOMMU_EFR_T;
    1158 AssertCompileSize(IOMMU_EFR_T, 8);
     1157} IOMMU_EXT_FEAT_T;
     1158AssertCompileSize(IOMMU_EXT_FEAT_T, 8);
    11591159
    11601160/**
     
    12071207    struct
    12081208    {
    1209         uint32_t   u1HwEventValid : 1;      /**< Bit 0      - HEV: Hardware Event Valid. */
    1210         uint32_t   u1HwEventOverflow : 1;   /**< Bit 1      - HEO: Hardware Event Overflow. */
    1211         uint32_t   u30Rsvd0 : 30;           /**< Bits 31:2  - Reserved. */
    1212         uint32_t   u32Rsvd0;                /**< Bits 63:32 - Reserved. */
     1209        uint32_t   u1Valid : 1;     /**< Bit 0      - HEV: Hardware Event Valid. */
     1210        uint32_t   u1Overflow : 1;  /**< Bit 1      - HEO: Hardware Event Overflow. */
     1211        uint32_t   u30Rsvd0 : 30;   /**< Bits 31:2  - Reserved. */
     1212        uint32_t   u32Rsvd0;        /**< Bits 63:32 - Reserved. */
    12131213    } n;
    12141214    /** The 64-bit unsigned integer view. */
     
    12931293    struct
    12941294    {
    1295         uint32_t    u24DevSpecFeatSup : 24;     /**< Bits 23:0  - DevSpecificFeatSupp: Implementation specific features. */
    1296         uint32_t    u4RevMinor : 4;             /**< Bits 27:24 - RevMinor: Minor revision identifier. */
    1297         uint32_t    u4RevMajor : 4;             /**< Bits 31:28 - RevMajor: Major revision identifier. */
    1298         uint32_t    u32Rsvd0;                   /**< Bits 63:32 - Reserved.*/
     1295        uint32_t    u24DevSpecFeat : 24;     /**< Bits 23:0  - DevSpecificFeatSupp: Implementation specific features. */
     1296        uint32_t    u4RevMinor : 4;          /**< Bits 27:24 - RevMinor: Minor revision identifier. */
     1297        uint32_t    u4RevMajor : 4;          /**< Bits 31:28 - RevMajor: Major revision identifier. */
     1298        uint32_t    u32Rsvd0;                /**< Bits 63:32 - Reserved.*/
    12991299    } n;
    13001300    /** The 64-bit unsigned integer view. */
     
    13111311    struct
    13121312    {
    1313         uint32_t    u24DevSpecFeatSup : 24;     /**< Bits 23:0  - DevSpecificFeatCntrl: Implementation specific control. */
    1314         uint32_t    u4RevMinor : 4;             /**< Bits 27:24 - RevMinor: Minor revision identifier. */
    1315         uint32_t    u4RevMajor : 4;             /**< Bits 31:28 - RevMajor: Major revision identifier. */
    1316         uint32_t    u32Rsvd0;                   /**< Bits 63:32 - Reserved.*/
     1313        uint32_t    u24DevSpecCtrl : 24;     /**< Bits 23:0  - DevSpecificFeatCntrl: Implementation specific control. */
     1314        uint32_t    u4RevMinor : 4;          /**< Bits 27:24 - RevMinor: Minor revision identifier. */
     1315        uint32_t    u4RevMajor : 4;          /**< Bits 31:28 - RevMajor: Major revision identifier. */
     1316        uint32_t    u32Rsvd0;                /**< Bits 63:32 - Reserved.*/
    13171317    } n;
    13181318    /** The 64-bit unsigned integer view. */
     
    13471347    struct
    13481348    {
    1349         uint32_t    u5MsiNum : 5;           /**< Bits 4:0   - MsiNum: MSI Vector used for interrupt messages generated by the IOMMU. */
     1349        uint32_t    u5MsiNumEvtLog : 5;     /**< Bits 4:0   - MsiNum: Event Log MSI message number. */
    13501350        uint32_t    u3GstVirtAddrSize: 3;   /**< Bits 7:5   - GVAsize: Guest Virtual Address Size. */
    13511351        uint32_t    u7PhysAddrSize : 7;     /**< Bits 14:8  - PAsize: Physical Address Size. */
     
    13951395    struct
    13961396    {
    1397         uint32_t    u2Rsvd : 2;         /**< Bits 1:0   - Reserved. */
    1398         uint32_t    u30MsiAddrLo : 30;  /**< Bits 31:2  - MsiAddr: MSI Address (Lo). */
    1399         uint32_t    u32MsiAddrHi;       /**< Bits 63:32 - MsiAddr: MSI Address (Hi). */
     1397        RT_GCC_EXTENSION uint64_t   u2Rsvd : 2;       /**< Bits 1:0   - Reserved. */
     1398        RT_GCC_EXTENSION uint64_t   u62MsiAddr : 62;  /**< Bits 31:2  - MsiAddr: MSI Address. */
    14001399    } n;
    14011400    /** The 32-bit unsigned integer view. */
     
    17421741    struct
    17431742    {
    1744         uint32_t    u3AutoRespCode : 4;     /**< Bits 3:0   - PprAutoRespCode: PPR log Auto Response Code. */
     1743        uint32_t    u4AutoRespCode : 4;     /**< Bits 3:0   - PprAutoRespCode: PPR log Auto Response Code. */
    17451744        uint32_t    u1AutoRespMaskGen : 1;  /**< Bit  4     - PprAutoRespMaskGn: PPR log Auto Response Mask Gen. */
    17461745        uint32_t    u27Rsvd0 : 27;          /**< Bits 31:5  - Reserved. */
     
    18011800    EVT_LOG_BAR_T               EvtLogBaseAddr;     /**< Event log base address register. */
    18021801    IOMMU_CTRL_T                Ctrl;               /**< IOMMU control register. */
    1803     IOMMU_EXCL_BASE_T           ExclBase;           /**< IOMMU exclusion base register. */
     1802    IOMMU_EXCL_RANGE_BAR_T      ExclRangeBaseAddr;  /**< IOMMU exclusion range base register. */
    18041803    IOMMU_EXCL_RANGE_LIMIT_T    ExclRangeLimit;     /**< IOMMU exclusion range limit. */
    1805     IOMMU_EFR_T                 ExtFeat;            /**< IOMMU extended feature register. */
     1804    IOMMU_EXT_FEAT_T            ExtFeat;            /**< IOMMU extended feature register. */
    18061805    /** @} */
    18071806
     
    19781977        case IOMMU_MMIO_OFF_EVT_LOG_BAR:          *puResult = pThis->EvtLogBaseAddr.u64;        break;
    19791978        case IOMMU_MMIO_OFF_CTRL:                 *puResult = pThis->Ctrl.u64;                  break;
    1980         case IOMMU_MMIO_OFF_EXCL_BAR:             *puResult = pThis->ExclBase.u64;              break;
     1979        case IOMMU_MMIO_OFF_EXCL_BAR:             *puResult = pThis->ExclRangeBaseAddr.u64;     break;
    19811980        case IOMMU_MMIO_OFF_EXCL_RANGE_LIMIT:     *puResult = pThis->ExclRangeLimit.u64;        break;
    19821981        case IOMMU_MMIO_OFF_EXT_FEAT:             *puResult = pThis->ExtFeat.u64;               break;
     
    21092108
    21102109# ifdef IN_RING3
     2110static void iommuAmdR3DecodeBufferLength(uint8_t uEncodedLen, uint32_t *pcEntries, uint32_t *pcbBuffer)
     2111{
     2112    if (uEncodedLen >= 8)
     2113    {
     2114        *pcEntries = 2 << (uEncodedLen - 1);
     2115        *pcbBuffer = *pcEntries << 4;
     2116    }
     2117    else
     2118    {
     2119        *pcEntries = 0;
     2120        *pcbBuffer = 0;
     2121    }
     2122}
     2123
     2124
     2125/**
     2126 * @callback_method_impl{FNDBGFHANDLERDEV}
     2127 */
     2128static DECLCALLBACK(void) iommuAmdR3DbgInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2129{
     2130    PCIOMMU pThis = PDMDEVINS_2_DATA(pDevIns, PIOMMU);
     2131    Assert(pThis);
     2132
     2133    LogFlow((IOMMU_LOG_PFX ": iommuAmdR3DbgInfo: pThis=%p pszArgs=%s\n", pThis, pszArgs));
     2134#if 0
     2135    bool const fVerbose = !strncmp(pszArgs, RT_STR_TUPLE("verbose") ? true : false;
     2136#else
     2137    NOREF(pszArgs);
     2138#endif
     2139
     2140    pHlp->pfnPrintf(pHlp, "AMD-IOMMU:\n");
     2141    /* Device Table Base Address. */
     2142    {
     2143        DEV_TAB_BAR_T const DevTabBar = pThis->DevTabBaseAddr;
     2144        pHlp->pfnPrintf(pHlp, "  Device Table BAR                        = %#RX64\n", DevTabBar.u64);
     2145        pHlp->pfnPrintf(pHlp, "    Size                                    = %u (%u bytes)\n", DevTabBar.n.u9Size,
     2146                    (DevTabBar.n.u9Size + 1) * _4K);
     2147        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", DevTabBar.n.u40DevTabBase);
     2148    }
     2149    /* Command Buffer Base Address Register. */
     2150    {
     2151        CMD_BUF_BAR_T const CmdBufBar = pThis->CmdBufBaseAddr;
     2152        uint32_t      cEntries;
     2153        uint32_t      cbBuffer;
     2154        uint8_t const uEncodedLen = CmdBufBar.n.u4CmdLen;
     2155        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2156        pHlp->pfnPrintf(pHlp, "  Command buffer BAR                      = %#RX64\n", CmdBufBar.u64);
     2157        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", CmdBufBar.n.u40CmdBase);
     2158        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2159                        cbBuffer);
     2160    }
     2161    /* Event Log Base Address Register. */
     2162    {
     2163        EVT_LOG_BAR_T const EvtLogBar = pThis->EvtLogBaseAddr;
     2164        uint32_t      cEntries;
     2165        uint32_t      cbBuffer;
     2166        uint8_t const uEncodedLen = EvtLogBar.n.u4EvtLen;
     2167        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2168        pHlp->pfnPrintf(pHlp, "  Event log BAR                           = %#RX64\n", EvtLogBar.u64);
     2169        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", EvtLogBar.n.u40EvtBase);
     2170        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2171                        cbBuffer);
     2172    }
     2173    /* IOMMU Control Register. */
     2174    {
     2175        IOMMU_CTRL_T const Ctrl = pThis->Ctrl;
     2176        pHlp->pfnPrintf(pHlp, "  Control                                 = %#RX64\n", Ctrl.u64);
     2177        pHlp->pfnPrintf(pHlp, "    IOMMU enable                            = %RTbool\n", Ctrl.n.u1IommuEn);
     2178        pHlp->pfnPrintf(pHlp, "    HT Tunnel translation enable            = %RTbool\n", Ctrl.n.u1HtTunEn);
     2179        pHlp->pfnPrintf(pHlp, "    Event log enable                        = %RTbool\n", Ctrl.n.u1EvtLogEn);
     2180        pHlp->pfnPrintf(pHlp, "    Event log interrupt enable              = %RTbool\n", Ctrl.n.u1EvtIntrEn);
     2181        pHlp->pfnPrintf(pHlp, "    Completion wait interrupt enable        = %RTbool\n", Ctrl.n.u1EvtIntrEn);
     2182        pHlp->pfnPrintf(pHlp, "    Invalidation timeout                    = %u\n",      Ctrl.n.u3InvTimeOut);
     2183        pHlp->pfnPrintf(pHlp, "    Pass posted write                       = %RTbool\n", Ctrl.n.u1PassPW);
     2184        pHlp->pfnPrintf(pHlp, "    Respose Pass posted write               = %RTbool\n", Ctrl.n.u1ResPassPW);
     2185        pHlp->pfnPrintf(pHlp, "    Coherent                                = %RTbool\n", Ctrl.n.u1Coherent);
     2186        pHlp->pfnPrintf(pHlp, "    Isochronous                             = %RTbool\n", Ctrl.n.u1Isoc);
     2187        pHlp->pfnPrintf(pHlp, "    Command buffer enable                   = %RTbool\n", Ctrl.n.u1CmdBufEn);
     2188        pHlp->pfnPrintf(pHlp, "    PPR log enable                          = %RTbool\n", Ctrl.n.u1PprLogEn);
     2189        pHlp->pfnPrintf(pHlp, "    PPR interrupt enable                    = %RTbool\n", Ctrl.n.u1PprIntrEn);
     2190        pHlp->pfnPrintf(pHlp, "    PPR enable                              = %RTbool\n", Ctrl.n.u1PprEn);
     2191        pHlp->pfnPrintf(pHlp, "    Guest translation eanble                = %RTbool\n", Ctrl.n.u1GstTranslateEn);
     2192        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC enable               = %RTbool\n", Ctrl.n.u1GstVirtApicEn);
     2193        pHlp->pfnPrintf(pHlp, "    CRW                                     = %#x\n",     Ctrl.n.u4Crw);
     2194        pHlp->pfnPrintf(pHlp, "    SMI filter enable                       = %RTbool\n", Ctrl.n.u1SmiFilterEn);
     2195        pHlp->pfnPrintf(pHlp, "    Self-writeback disable                  = %RTbool\n", Ctrl.n.u1SelfWriteBackDis);
     2196        pHlp->pfnPrintf(pHlp, "    SMI filter log enable                   = %RTbool\n", Ctrl.n.u1SmiFilterLogEn);
     2197        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC mode enable          = %#x\n",     Ctrl.n.u3GstVirtApicModeEn);
     2198        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC GA log enable        = %RTbool\n", Ctrl.n.u1GstLogEn);
     2199        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC interrupt enable     = %RTbool\n", Ctrl.n.u1GstIntrEn);
     2200        pHlp->pfnPrintf(pHlp, "    Dual PPR log enable                     = %#x\n",     Ctrl.n.u2DualPprLogEn);
     2201        pHlp->pfnPrintf(pHlp, "    Dual event log enable                   = %#x\n",     Ctrl.n.u2DualEvtLogEn);
     2202        pHlp->pfnPrintf(pHlp, "    Device table segmentation enable        = %#x\n",     Ctrl.n.u3DevTabSegEn);
     2203        pHlp->pfnPrintf(pHlp, "    Privilege abort enable                  = %#x\n",     Ctrl.n.u2PrivAbortEn);
     2204        pHlp->pfnPrintf(pHlp, "    PPR auto response enable                = %RTbool\n", Ctrl.n.u1PprAutoRespEn);
     2205        pHlp->pfnPrintf(pHlp, "    MARC enable                             = %RTbool\n", Ctrl.n.u1MarcEn);
     2206        pHlp->pfnPrintf(pHlp, "    Block StopMark enable                   = %RTbool\n", Ctrl.n.u1BlockStopMarkEn);
     2207        pHlp->pfnPrintf(pHlp, "    PPR auto response always-on enable      = %RTbool\n", Ctrl.n.u1PprAutoRespAlwaysOnEn);
     2208        pHlp->pfnPrintf(pHlp, "    Domain IDPNE                            = %RTbool\n", Ctrl.n.u1DomainIDPNE);
     2209        pHlp->pfnPrintf(pHlp, "    Enhanced PPR handling                   = %RTbool\n", Ctrl.n.u1EnhancedPpr);
     2210        pHlp->pfnPrintf(pHlp, "    Host page table access/dirty bit update = %#x\n",     Ctrl.n.u2HstAccDirtyBitUpdate);
     2211        pHlp->pfnPrintf(pHlp, "    Guest page table dirty bit disable      = %RTbool\n", Ctrl.n.u1GstDirtyUpdateDis);
     2212        pHlp->pfnPrintf(pHlp, "    x2APIC enable                           = %RTbool\n", Ctrl.n.u1X2ApicEn);
     2213        pHlp->pfnPrintf(pHlp, "    x2APIC interrupt enable                 = %RTbool\n", Ctrl.n.u1X2ApicIntrGenEn);
     2214        pHlp->pfnPrintf(pHlp, "    Guest page table access bit update      = %RTbool\n", Ctrl.n.u1GstAccessUpdateDis);
     2215    }
     2216    /* Exclusion Base Address Register. */
     2217    {
     2218        IOMMU_EXCL_RANGE_BAR_T const ExclRangeBar = pThis->ExclRangeBaseAddr;
     2219        pHlp->pfnPrintf(pHlp, "  Exclusion BAR                           = %#RX64\n", ExclRangeBar.u64);
     2220        pHlp->pfnPrintf(pHlp, "    Exclusion enable                        = %RTbool\n", ExclRangeBar.n.u1ExclEnable);
     2221        pHlp->pfnPrintf(pHlp, "    Allow all devices                       = %RTbool\n", ExclRangeBar.n.u1AllowAll);
     2222        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", ExclRangeBar.n.u40ExclRangeBase);
     2223    }
     2224    /* Exclusion Range Limit Register. */
     2225    {
     2226        IOMMU_EXCL_RANGE_LIMIT_T const ExclRangeLimit = pThis->ExclRangeLimit;
     2227        pHlp->pfnPrintf(pHlp, "  Exclusion Range Limit                   = %#RX64\n", ExclRangeLimit.u64);
     2228        pHlp->pfnPrintf(pHlp, "    Range limit                             = %#RX64\n", ExclRangeLimit.n.u40ExclLimit);
     2229    }
     2230    /* Extended Feature Register. */
     2231    {
     2232        IOMMU_EXT_FEAT_T ExtFeat = pThis->ExtFeat;
     2233        pHlp->pfnPrintf(pHlp, "  Extended Feature Register               = %#RX64\n", ExtFeat.u64);
     2234        pHlp->pfnPrintf(pHlp, "    Prefetch support                        = %RTbool\n", ExtFeat.n.u1PrefetchSup);
     2235        pHlp->pfnPrintf(pHlp, "    PPR support                             = %RTbool\n", ExtFeat.n.u1PprSup);
     2236        pHlp->pfnPrintf(pHlp, "    x2APIC support                          = %RTbool\n", ExtFeat.n.u1X2ApicSup);
     2237        pHlp->pfnPrintf(pHlp, "    NX and privilege level support          = %RTbool\n", ExtFeat.n.u1NoExecuteSup);
     2238        pHlp->pfnPrintf(pHlp, "    Guest translation support               = %RTbool\n", ExtFeat.n.u1GstTranslateSup);
     2239        pHlp->pfnPrintf(pHlp, "    Invalidate-All command support          = %RTbool\n", ExtFeat.n.u1InvAllSup);
     2240        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC support              = %RTbool\n", ExtFeat.n.u1GstVirtApicSup);
     2241        pHlp->pfnPrintf(pHlp, "    Hardware error register support         = %RTbool\n", ExtFeat.n.u1HwErrorSup);
     2242        pHlp->pfnPrintf(pHlp, "    Performance counters support            = %RTbool\n", ExtFeat.n.u1PerfCounterSup);
     2243        pHlp->pfnPrintf(pHlp, "    Host address translation size           = %#x\n",     ExtFeat.n.u2HostAddrTranslateSize);
     2244        pHlp->pfnPrintf(pHlp, "    Guest address translation size          = %#x\n",     ExtFeat.n.u2GstAddrTranslateSize);
     2245        pHlp->pfnPrintf(pHlp, "    Guest CR3 root table level support      = %#x\n",     ExtFeat.n.u2GstCr3RootTblLevel);
     2246        pHlp->pfnPrintf(pHlp, "    SMI filter register support             = %#x\n",     ExtFeat.n.u2SmiFilterSup);
     2247        pHlp->pfnPrintf(pHlp, "    SMI filter register count               = %#x\n",     ExtFeat.n.u3SmiFilterCount);
     2248        pHlp->pfnPrintf(pHlp, "    Guest virtual-APIC modes support        = %#x\n",     ExtFeat.n.u3GstVirtApicModeSup);
     2249        pHlp->pfnPrintf(pHlp, "    Dual PPR log support                    = %#x\n",     ExtFeat.n.u2DualPprLogSup);
     2250        pHlp->pfnPrintf(pHlp, "    Dual event log support                  = %#x\n",     ExtFeat.n.u2DualEvtLogSup);
     2251        pHlp->pfnPrintf(pHlp, "    Maximum PASID                           = %#x\n",     ExtFeat.n.u5MaxPasidSup);
     2252        pHlp->pfnPrintf(pHlp, "    User/supervisor page protection support = %RTbool\n", ExtFeat.n.u1UserSupervisorSup);
     2253        pHlp->pfnPrintf(pHlp, "    Device table segments supported         = %u\n",      (ExtFeat.n.u2DevTabSegSup << 1));
     2254        pHlp->pfnPrintf(pHlp, "    PPR log overflow early warning support  = %RTbool\n", ExtFeat.n.u1PprLogOverflowWarn);
     2255        pHlp->pfnPrintf(pHlp, "    PPR auto response support               = %RTbool\n", ExtFeat.n.u1PprAutoRespSup);
     2256        pHlp->pfnPrintf(pHlp, "    MARC support                            = %#x\n",     ExtFeat.n.u2MarcSup);
     2257        pHlp->pfnPrintf(pHlp, "    Block StopMark message support          = %RTbool\n", ExtFeat.n.u1BlockStopMarkSup);
     2258        pHlp->pfnPrintf(pHlp, "    Performance optimization support        = %RTbool\n", ExtFeat.n.u1PerfOptSup);
     2259        pHlp->pfnPrintf(pHlp, "    MSI capability MMIO access support      = %RTbool\n", ExtFeat.n.u1MsiCapMmioSup);
     2260        pHlp->pfnPrintf(pHlp, "    Guest I/O protection support            = %RTbool\n", ExtFeat.n.u1GstIoSup);
     2261        pHlp->pfnPrintf(pHlp, "    Host access support                     = %RTbool\n", ExtFeat.n.u1HostAccessSup);
     2262        pHlp->pfnPrintf(pHlp, "    Enhanced PPR handling support           = %RTbool\n", ExtFeat.n.u1EnhancedPprSup);
     2263        pHlp->pfnPrintf(pHlp, "    Attribute forward supported             = %RTbool\n", ExtFeat.n.u1AttrForwardSup);
     2264        pHlp->pfnPrintf(pHlp, "    Host dirty support                      = %RTbool\n", ExtFeat.n.u1HostDirtySup);
     2265        pHlp->pfnPrintf(pHlp, "    Invalidate IOTLB type support           = %RTbool\n", ExtFeat.n.u1InvIoTlbTypeSup);
     2266        pHlp->pfnPrintf(pHlp, "    Guest page table access bit hw disable  = %RTbool\n", ExtFeat.n.u1GstUpdateDisSup);
     2267        pHlp->pfnPrintf(pHlp, "    Force physical dest for remapped intr.  = %RTbool\n", ExtFeat.n.u1ForcePhysDstSup);
     2268    }
     2269    /* PPR Log Base Address Register. */
     2270    {
     2271        PPR_LOG_BAR_T PprLogBar = pThis->PprLogBaseAddr;
     2272        uint32_t      cEntries;
     2273        uint32_t      cbBuffer;
     2274        uint8_t const uEncodedLen = PprLogBar.n.u4PprLogLen;
     2275        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2276        pHlp->pfnPrintf(pHlp, "  PPR Log BAR                             = %#RX64\n",   PprLogBar.u64);
     2277        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", PprLogBar.n.u40PprLogBase);
     2278        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2279                        cbBuffer);
     2280    }
     2281    /* Hardware Event (Hi) Register. */
     2282    {
     2283        IOMMU_HW_EVT_HI_T HwEvtHi = pThis->HwEvtHi;
     2284        pHlp->pfnPrintf(pHlp, "  Hardware Event (Hi)                     = %#RX64\n",   HwEvtHi.u64);
     2285        pHlp->pfnPrintf(pHlp, "    First operand                           = %#RX64\n", HwEvtHi.n.u60FirstOperand);
     2286        pHlp->pfnPrintf(pHlp, "    Event code                              = %#RX8\n",  HwEvtHi.n.u4EvtCode);
     2287    }
     2288    /* Hardware Event (Lo) Register. */
     2289    pHlp->pfnPrintf(pHlp, "  Hardware Event (Lo)                         = %#RX64\n", pThis->HwEvtLo);
     2290    /* Hardware Event Status. */
     2291    {
     2292        IOMMU_HW_EVT_STATUS_T HwEvtStatus = pThis->HwEvtStatus;
     2293        pHlp->pfnPrintf(pHlp, "  Hardware Event Status                   = %#RX64\n",    HwEvtStatus.u64);
     2294        pHlp->pfnPrintf(pHlp, "    Valid                                   = %RTbool\n", HwEvtStatus.n.u1Valid);
     2295        pHlp->pfnPrintf(pHlp, "    Overflow                                = %RTbool\n", HwEvtStatus.n.u1Overflow);
     2296    }
     2297    /* Guest Virtual-APIC Log Base Address Register. */
     2298    {
     2299        GALOG_BAR_T const GALogBar = pThis->GALogBaseAddr;
     2300        uint32_t      cEntries;
     2301        uint32_t      cbBuffer;
     2302        uint8_t const uEncodedLen = GALogBar.n.u4GALogLen;
     2303        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2304        pHlp->pfnPrintf(pHlp, "  Guest Log BAR                           = %#RX64\n",    GALogBar.u64);
     2305        pHlp->pfnPrintf(pHlp, "    Base address                            = %RTbool\n", GALogBar.n.u40GALogBase);
     2306        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2307                        cbBuffer);
     2308    }
     2309    /* Guest Virtual-APIC Log Tail Address Register. */
     2310    {
     2311        GALOG_TAIL_ADDR_T GALogTail = pThis->GALogTailAddr;
     2312        pHlp->pfnPrintf(pHlp, "  Guest Log Tail Address                  = %#RX64\n",   GALogTail.u64);
     2313        pHlp->pfnPrintf(pHlp, "    Tail address                            = %#RX64\n", GALogTail.n.u40GALogTailAddr);
     2314    }
     2315    /* PPR Log B Base Address Register. */
     2316    {
     2317        PPR_LOG_B_BAR_T PprLogBBar = pThis->PprLogBBaseAddr;
     2318        uint32_t      cEntries;
     2319        uint32_t      cbBuffer;
     2320        uint8_t const uEncodedLen = PprLogBBar.n.u4PprLogLen;
     2321        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2322        pHlp->pfnPrintf(pHlp, "  PPR Log B BAR                           = %#RX64\n",   PprLogBBar.u64);
     2323        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", PprLogBBar.n.u40PprLogBase);
     2324        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2325                        cbBuffer);
     2326    }
     2327    /* Event Log B Base Address Register. */
     2328    {
     2329        EVT_LOG_B_BAR_T EvtLogBBar = pThis->EvtLogBBaseAddr;
     2330        uint32_t      cEntries;
     2331        uint32_t      cbBuffer;
     2332        uint8_t const uEncodedLen = EvtLogBBar.n.u4EvtLen;
     2333        iommuAmdR3DecodeBufferLength(uEncodedLen, &cEntries, &cbBuffer);
     2334        pHlp->pfnPrintf(pHlp, "  Event Log B BAR                         = %#RX64\n",   EvtLogBBar.u64);
     2335        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", EvtLogBBar.n.u40EvtBase);
     2336        pHlp->pfnPrintf(pHlp, "    Length                                  = %u (%u entries, %u bytes)\n", uEncodedLen, cEntries,
     2337                        cbBuffer);
     2338    }
     2339    /* Device Table Segment Registers. */
     2340    for (unsigned i = 0; i < RT_ELEMENTS(pThis->DevTabSeg); i++)
     2341    {
     2342        DEV_TAB_SEG_BAR_T const DevTabSeg = pThis->DevTabSeg[i];
     2343        pHlp->pfnPrintf(pHlp, "  Device Table Segment BAR [%u]            = %#RX64\n",  DevTabSeg.u64);
     2344        pHlp->pfnPrintf(pHlp, "    Base address                            = %#RX64\n", DevTabSeg.n.u40DevTabBase);
     2345        pHlp->pfnPrintf(pHlp, "    Size                                    = %#x (%u bytes)\n", DevTabSeg.n.u8Size,
     2346                        (DevTabSeg.n.u8Size + 1) << X86_PAGE_4K_SHIFT);
     2347    }
     2348    /* Device-Specific Feature Extension Register. */
     2349    {
     2350        DEV_SPECIFIC_FEAT_T const DevSpecificFeat = pThis->DevSpecificFeat;
     2351        pHlp->pfnPrintf(pHlp, "  Device-specific Feature                 = %#RX64\n",   DevSpecificFeat.u64);
     2352        pHlp->pfnPrintf(pHlp, "    Feature                                 = %#RX32\n", DevSpecificFeat.n.u24DevSpecFeat);
     2353        pHlp->pfnPrintf(pHlp, "    Minor revision ID                       = %#x\n",    DevSpecificFeat.n.u4RevMinor);
     2354        pHlp->pfnPrintf(pHlp, "    Major revision ID                       = %#x\n",    DevSpecificFeat.n.u4RevMajor);
     2355    }
     2356    /* Device-Specific Control Extension Register. */
     2357    {
     2358        DEV_SPECIFIC_CTRL_T const DevSpecificCtrl = pThis->DevSpecificCtrl;
     2359        pHlp->pfnPrintf(pHlp, "  Device-specific Control                 = %#RX64\n",   DevSpecificCtrl.u64);
     2360        pHlp->pfnPrintf(pHlp, "    Control                                 = %#RX32\n", DevSpecificCtrl.n.u24DevSpecCtrl);
     2361        pHlp->pfnPrintf(pHlp, "    Minor revision ID                       = %#x\n",    DevSpecificCtrl.n.u4RevMinor);
     2362        pHlp->pfnPrintf(pHlp, "    Major revision ID                       = %#x\n",    DevSpecificCtrl.n.u4RevMajor);
     2363    }
     2364    /* Device-Specific Status Extension Register. */
     2365    {
     2366        DEV_SPECIFIC_STATUS_T const DevSpecificStatus = pThis->DevSpecificStatus;
     2367        pHlp->pfnPrintf(pHlp, "  Device-specific Control                 = %#RX64\n",   DevSpecificStatus.u64);
     2368        pHlp->pfnPrintf(pHlp, "    Status                                  = %#RX32\n", DevSpecificStatus.n.u24DevSpecStatus);
     2369        pHlp->pfnPrintf(pHlp, "    Minor revision ID                       = %#x\n",    DevSpecificStatus.n.u4RevMinor);
     2370        pHlp->pfnPrintf(pHlp, "    Major revision ID                       = %#x\n",    DevSpecificStatus.n.u4RevMajor);
     2371    }
     2372    /* MSI Miscellaneous Information Register (Lo and Hi). */
     2373    {
     2374        MSI_MISC_INFO_T const MsiMiscInfo = pThis->MsiMiscInfo;
     2375        pHlp->pfnPrintf(pHlp, "  MSI Misc. Info. Register                = %#RX64\n",    MsiMiscInfo.u64);
     2376        pHlp->pfnPrintf(pHlp, "    Event Log MSI number                    = %#x\n",     MsiMiscInfo.n.u5MsiNumEvtLog);
     2377        pHlp->pfnPrintf(pHlp, "    Guest Virtual-Address Size              = %#x\n",     MsiMiscInfo.n.u3GstVirtAddrSize);
     2378        pHlp->pfnPrintf(pHlp, "    Physical Address Size                   = %#x\n",     MsiMiscInfo.n.u7PhysAddrSize);
     2379        pHlp->pfnPrintf(pHlp, "    Virtual-Address Size                    = %#x\n",     MsiMiscInfo.n.u7VirtAddrSize);
     2380        pHlp->pfnPrintf(pHlp, "    HT Transport ATS Range Reserved         = %RTbool\n", MsiMiscInfo.n.u1HtAtsResv);
     2381        pHlp->pfnPrintf(pHlp, "    PPR MSI number                          = %#x\n",     MsiMiscInfo.n.u5MsiNumPpr);
     2382        pHlp->pfnPrintf(pHlp, "    GA Log MSI number                       = %#x\n",     MsiMiscInfo.n.u5MsiNumGa);
     2383    }
     2384    /* MSI Capability Header. */
     2385    {
     2386        MSI_CAP_HDR_T const MsiCapHdr = pThis->MsiCapHdr;
     2387        pHlp->pfnPrintf(pHlp, "  MSI Capability Header                   = %#RX32\n",    MsiCapHdr.u32);
     2388        pHlp->pfnPrintf(pHlp, "    Capability ID                           = %#x\n",     MsiCapHdr.n.u8MsiCapId);
     2389        pHlp->pfnPrintf(pHlp, "    Capability Ptr (PCI config offset)      = %#x\n",     MsiCapHdr.n.u8MsiCapPtr);
     2390        pHlp->pfnPrintf(pHlp, "    Enable                                  = %RTbool\n", MsiCapHdr.n.u1MsiEnable);
     2391        pHlp->pfnPrintf(pHlp, "    Multi-message capability                = %#x\n",     MsiCapHdr.n.u3MsiMultiMessCap);
     2392        pHlp->pfnPrintf(pHlp, "    Multi-message enable                    = %#x\n",     MsiCapHdr.n.u3MsiMultiMessEn);
     2393    }
     2394    /* MSI Address Register (Lo and Hi). */
     2395    {
     2396        MSI_ADDR_T const MsiAddr = pThis->MsiAddr;
     2397        pHlp->pfnPrintf(pHlp, "  MSI Address                             = %#RX64\n",   MsiAddr.u64);
     2398        pHlp->pfnPrintf(pHlp, "    Address                                 = %#RX64\n", MsiAddr.n.u62MsiAddr);
     2399    }
     2400    /* MSI Data. */
     2401    {
     2402        MSI_DATA_T const MsiData = pThis->MsiData;
     2403        pHlp->pfnPrintf(pHlp, "  MSI Data                                = %#RX32\n", MsiData.u32);
     2404        pHlp->pfnPrintf(pHlp, "    Data                                    = %#x\n",  MsiData.n.u16MsiData);
     2405    }
     2406    /* MSI Mapping Capability Header. */
     2407    {
     2408        MSI_MAP_CAP_HDR_T const MsiMapCapHdr = pThis->MsiMapCapHdr;
     2409        pHlp->pfnPrintf(pHlp, "  MSI Mapping Capability Header           = %#RX32\n",    MsiMapCapHdr.u32);
     2410        pHlp->pfnPrintf(pHlp, "    Capability ID                           = %#x\n",     MsiMapCapHdr.n.u8MsiMapCapId);
     2411        pHlp->pfnPrintf(pHlp, "    Map enable                              = %RTbool\n", MsiMapCapHdr.n.u1MsiMapEn);
     2412        pHlp->pfnPrintf(pHlp, "    Map fixed                               = %RTbool\n", MsiMapCapHdr.n.u1MsiMapFixed);
     2413        pHlp->pfnPrintf(pHlp, "    Map capability type                     = %#x\n",     MsiMapCapHdr.n.u5MapCapType);
     2414    }
     2415    /* Performance Optimization Control Register. */
     2416    {
     2417        IOMMU_PERF_OPT_CTRL_T const PerfOptCtrl = pThis->PerfOptCtrl;
     2418        pHlp->pfnPrintf(pHlp, "  Performance Optimization Control        = %#RX32\n",    PerfOptCtrl.u32);
     2419        pHlp->pfnPrintf(pHlp, "    Enable                                  = %RTbool\n", PerfOptCtrl.n.u1PerfOptEn);
     2420    }
     2421    /* XT (x2APIC) General Interrupt Control Register. */
     2422    {
     2423        IOMMU_XT_GEN_INTR_CTRL_T const XtGenIntrCtrl = pThis->XtGenIntrCtrl;
     2424        pHlp->pfnPrintf(pHlp, "  XT General Interrupt Control            = %#RX64\n", XtGenIntrCtrl.u64);
     2425        pHlp->pfnPrintf(pHlp, "    Interrupt destination mode              = %s\n",
     2426                        !XtGenIntrCtrl.n.u1X2ApicIntrDstMode ? "physical" : "logical");
     2427        pHlp->pfnPrintf(pHlp, "    Interrupt destination                   = %#RX64\n",
     2428                        RT_MAKE_U64(XtGenIntrCtrl.n.u24X2ApicIntrDstLo, XtGenIntrCtrl.n.u7X2ApicIntrDstHi));
     2429        pHlp->pfnPrintf(pHlp, "    Interrupt vector                        = %#x\n", XtGenIntrCtrl.n.u8X2ApicIntrVector);
     2430        pHlp->pfnPrintf(pHlp, "    Interrupt delivery mode                 = %#x\n",
     2431                        !XtGenIntrCtrl.n.u8X2ApicIntrVector ? "fixed" : "arbitrated");
     2432    }
     2433    /* XT (x2APIC) PPR Interrupt Control Register. */
     2434    {
     2435        IOMMU_XT_PPR_INTR_CTRL_T const XtPprIntrCtrl = pThis->XtPprIntrCtrl;
     2436        pHlp->pfnPrintf(pHlp, "  XT PPR Interrupt Control                = %#RX64\n", XtPprIntrCtrl.u64);
     2437        pHlp->pfnPrintf(pHlp, "   Interrupt destination mode               = %s\n",
     2438                        !XtPprIntrCtrl.n.u1X2ApicIntrDstMode ? "physical" : "logical");
     2439        pHlp->pfnPrintf(pHlp, "   Interrupt destination                    = %#RX64\n",
     2440                        RT_MAKE_U64(XtPprIntrCtrl.n.u24X2ApicIntrDstLo, XtPprIntrCtrl.n.u7X2ApicIntrDstHi));
     2441        pHlp->pfnPrintf(pHlp, "   Interrupt vector                         = %#x\n", XtPprIntrCtrl.n.u8X2ApicIntrVector);
     2442        pHlp->pfnPrintf(pHlp, "   Interrupt delivery mode                  = %#x\n",
     2443                        !XtPprIntrCtrl.n.u8X2ApicIntrVector ? "fixed" : "arbitrated");
     2444    }
     2445    /* XT (X2APIC) GA Log Interrupt Control Register. */
     2446    {
     2447        IOMMU_XT_GALOG_INTR_CTRL_T const XtGALogIntrCtrl = pThis->XtGALogIntrCtrl;
     2448        pHlp->pfnPrintf(pHlp, "  XT PPR Interrupt Control                = %#RX64\n", XtGALogIntrCtrl.u64);
     2449        pHlp->pfnPrintf(pHlp, "    Interrupt destination mode              = %s\n",
     2450                        !XtGALogIntrCtrl.n.u1X2ApicIntrDstMode ? "physical" : "logical");
     2451        pHlp->pfnPrintf(pHlp, "    Interrupt destination                   = %#RX64\n",
     2452                        RT_MAKE_U64(XtGALogIntrCtrl.n.u24X2ApicIntrDstLo, XtGALogIntrCtrl.n.u7X2ApicIntrDstHi));
     2453        pHlp->pfnPrintf(pHlp, "    Interrupt vector                        = %#x\n", XtGALogIntrCtrl.n.u8X2ApicIntrVector);
     2454        pHlp->pfnPrintf(pHlp, "    Interrupt delivery mode                 = %#x\n",
     2455                        !XtGALogIntrCtrl.n.u8X2ApicIntrVector ? "fixed" : "arbitrated");
     2456    }
     2457    /* MARC Registers. */
     2458    {
     2459        for (unsigned i = 0; i < RT_ELEMENTS(pThis->aMarcApers); i++)
     2460        {
     2461            pHlp->pfnPrintf(pHlp, " MARC Aperature %u:\n", i);
     2462            MARC_APER_BAR_T const MarcAperBar = pThis->aMarcApers[i].Base;
     2463            pHlp->pfnPrintf(pHlp, "   Base    = %#RX64 (addr: %#RX64)\n", MarcAperBar.u64, MarcAperBar.n.u40MarcBaseAddr);
     2464
     2465            MARC_APER_RELOC_T const MarcAperReloc = pThis->aMarcApers[i].Reloc;
     2466            pHlp->pfnPrintf(pHlp, "   Reloc   = %#RX64 (addr: %#RX64, read-only: %RTbool, enable: %RTbool)\n",
     2467                            MarcAperReloc.u64, MarcAperReloc.n.u40MarcRelocAddr, MarcAperReloc.n.u1ReadOnly,
     2468                            MarcAperReloc.n.u1RelocEn);
     2469
     2470            MARC_APER_LEN_T const MarcAperLen = pThis->aMarcApers[i].Length;
     2471            pHlp->pfnPrintf(pHlp, "   Length  = %u pages\n", MarcAperLen.n.u40MarcLength);
     2472        }
     2473    }
     2474    /* Reserved Register. */
     2475    pHlp->pfnPrintf(pHlp, "  Reserved Register                           = %#RX64\n", pThis->RsvdReg);
     2476    /* Command Buffer Head Pointer Register. */
     2477    {
     2478        CMD_BUF_HEAD_PTR_T const CmdBufHeadPtr = pThis->CmdBufHeadPtr;
     2479        pHlp->pfnPrintf(pHlp, "  Command Buffer Head Pointer             = %#RX64\n", CmdBufHeadPtr.u64);
     2480        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  CmdBufHeadPtr.n.u15Ptr);
     2481    }
     2482    /* Command Buffer Tail Pointer Register. */
     2483    {
     2484        CMD_BUF_HEAD_PTR_T const CmdBufTailPtr = pThis->CmdBufTailPtr;
     2485        pHlp->pfnPrintf(pHlp, "  Command Buffer Tail Pointer             = %#RX64\n", CmdBufTailPtr.u64);
     2486        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  CmdBufTailPtr.n.u15Ptr);
     2487    }
     2488    /* Event Log Head Pointer Register. */
     2489    {
     2490        EVT_LOG_HEAD_PTR_T const EvtLogHeadPtr = pThis->EvtLogHeadPtr;
     2491        pHlp->pfnPrintf(pHlp, "  Event Log Head Pointer                  = %#RX64\n", EvtLogHeadPtr.u64);
     2492        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  EvtLogHeadPtr.n.u15Ptr);
     2493    }
     2494    /* Event Log Tail Pointer Register. */
     2495    {
     2496        EVT_LOG_TAIL_PTR_T const EvtLogTailPtr = pThis->EvtLogTailPtr;
     2497        pHlp->pfnPrintf(pHlp, "  Event Log Head Pointer                  = %#RX64\n", EvtLogTailPtr.u64);
     2498        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  EvtLogTailPtr.n.u15Ptr);
     2499    }
     2500    /* Status Register. */
     2501    {
     2502        IOMMU_STATUS_T const Status = pThis->Status;
     2503        pHlp->pfnPrintf(pHlp, "  Status Register                         = %#RX64\n", Status.u64);
     2504        pHlp->pfnPrintf(pHlp, "    Event log overflow                      = %RTbool\n", Status.n.u1EvtOverflow);
     2505        pHlp->pfnPrintf(pHlp, "    Event log interrupt                     = %RTbool\n", Status.n.u1EvtLogIntr);
     2506        pHlp->pfnPrintf(pHlp, "    Completion wait interrupt               = %RTbool\n", Status.n.u1CompWaitIntr);
     2507        pHlp->pfnPrintf(pHlp, "    Event log running                       = %RTbool\n", Status.n.u1EvtLogRunning);
     2508        pHlp->pfnPrintf(pHlp, "    Command buffer running                  = %RTbool\n", Status.n.u1CmdBufRunning);
     2509        pHlp->pfnPrintf(pHlp, "    PPR overflow                            = %RTbool\n", Status.n.u1PprOverflow);
     2510        pHlp->pfnPrintf(pHlp, "    PPR interrupt                           = %RTbool\n", Status.n.u1PprIntr);
     2511        pHlp->pfnPrintf(pHlp, "    PPR log running                         = %RTbool\n", Status.n.u1PprLogRunning);
     2512        pHlp->pfnPrintf(pHlp, "    Guest log running                       = %RTbool\n", Status.n.u1GstLogRunning);
     2513        pHlp->pfnPrintf(pHlp, "    Guest log interrupt                     = %RTbool\n", Status.n.u1GstLogIntr);
     2514        pHlp->pfnPrintf(pHlp, "    PPR log B overflow                      = %RTbool\n", Status.n.u1PprOverflowB);
     2515        pHlp->pfnPrintf(pHlp, "    PPR log active                          = %RTbool\n", Status.n.u1PprLogActive);
     2516        pHlp->pfnPrintf(pHlp, "    Event log B overflow                    = %RTbool\n", Status.n.u1EvtOverflowB);
     2517        pHlp->pfnPrintf(pHlp, "    Event log active                        = %RTbool\n", Status.n.u1EvtLogActive);
     2518        pHlp->pfnPrintf(pHlp, "    PPR log B overflow early warning        = %RTbool\n", Status.n.u1PprOverflowEarlyB);
     2519        pHlp->pfnPrintf(pHlp, "    PPR log overflow early warning          = %RTbool\n", Status.n.u1PprOverflowEarly);
     2520    }
     2521    /* PPR Log Head Pointer. */
     2522    {
     2523        PPR_LOG_HEAD_PTR_T const PprLogHeadPtr = pThis->PprLogHeadPtr;
     2524        pHlp->pfnPrintf(pHlp, "  PPR Log Head Pointer                    = %#RX64\n", PprLogHeadPtr.u64);
     2525        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  PprLogHeadPtr.n.u15Ptr);
     2526    }
     2527    /* PPR Log Tail Pointer. */
     2528    {
     2529        PPR_LOG_TAIL_PTR_T const PprLogTailPtr = pThis->PprLogTailPtr;
     2530        pHlp->pfnPrintf(pHlp, "  PPR Log Tail Pointer                    = %#RX64\n", PprLogTailPtr.u64);
     2531        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  PprLogTailPtr.n.u15Ptr);
     2532    }
     2533    /* Guest Virtual-APIC Log Head Pointer. */
     2534    {
     2535        GALOG_HEAD_PTR_T const GALogHeadPtr = pThis->GALogHeadPtr;
     2536        pHlp->pfnPrintf(pHlp, "  Guest Virtual-APIC Log Head Pointer     = %#RX64\n", GALogHeadPtr.u64);
     2537        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  GALogHeadPtr.n.u12GALogPtr);
     2538    }
     2539    /* Guest Virtual-APIC Log Tail Pointer. */
     2540    {
     2541        GALOG_HEAD_PTR_T const GALogTailPtr = pThis->GALogTailPtr;
     2542        pHlp->pfnPrintf(pHlp, "  Guest Virtual-APIC Log Tail Pointer     = %#RX64\n", GALogTailPtr.u64);
     2543        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  GALogTailPtr.n.u12GALogPtr);
     2544    }
     2545    /* PPR Log B Head Pointer. */
     2546    {
     2547        PPR_LOG_B_HEAD_PTR_T const PprLogBHeadPtr = pThis->PprLogBHeadPtr;
     2548        pHlp->pfnPrintf(pHlp, "  PPR Log B Head Pointer                  = %#RX64\n", PprLogBHeadPtr.u64);
     2549        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  PprLogBHeadPtr.n.u15Ptr);
     2550    }
     2551    /* PPR Log B Tail Pointer. */
     2552    {
     2553        PPR_LOG_B_TAIL_PTR_T const PprLogBTailPtr = pThis->PprLogBTailPtr;
     2554        pHlp->pfnPrintf(pHlp, "  PPR Log B Tail Pointer                  = %#RX64\n", PprLogBTailPtr.u64);
     2555        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  PprLogBTailPtr.n.u15Ptr);
     2556    }
     2557    /* Event Log B Head Pointer. */
     2558    {
     2559        EVT_LOG_B_HEAD_PTR_T const EvtLogBHeadPtr = pThis->EvtLogBHeadPtr;
     2560        pHlp->pfnPrintf(pHlp, "  Event Log B Head Pointer                = %#RX64\n", EvtLogBHeadPtr.u64);
     2561        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  EvtLogBHeadPtr.n.u15Ptr);
     2562    }
     2563    /* Event Log B Tail Pointer. */
     2564    {
     2565        EVT_LOG_B_TAIL_PTR_T const EvtLogBTailPtr = pThis->EvtLogBTailPtr;
     2566        pHlp->pfnPrintf(pHlp, "  Event Log B Tail Pointer                = %#RX64\n", EvtLogBTailPtr.u64);
     2567        pHlp->pfnPrintf(pHlp, "    Pointer                                 = %#x\n",  EvtLogBTailPtr.n.u15Ptr);
     2568    }
     2569    /* PPR Log Auto Response Register. */
     2570    {
     2571        PPR_LOG_AUTO_RESP_T const PprLogAutoResp = pThis->PprLogAutoResp;
     2572        pHlp->pfnPrintf(pHlp, "  PPR Log Auto Response Register          = %#RX64\n",     PprLogAutoResp.u64);
     2573        pHlp->pfnPrintf(pHlp, "    Code                                    = %#x\n",      PprLogAutoResp.n.u4AutoRespCode);
     2574        pHlp->pfnPrintf(pHlp, "    Mask Gen.                               = %RTbool\n",  PprLogAutoResp.n.u1AutoRespMaskGen);
     2575    }
     2576    /* PPR Log Overflow Early Warning Indicator Register. */
     2577    {
     2578        PPR_LOG_OVERFLOW_EARLY_T const PprLogOverflowEarly = pThis->PprLogOverflowEarly;
     2579        pHlp->pfnPrintf(pHlp, "  PPR Log overflow early warning          = %#RX64\n",    PprLogOverflowEarly.u64);
     2580        pHlp->pfnPrintf(pHlp, "    Threshold                               = %#x\n",     PprLogOverflowEarly.n.u15Threshold);
     2581        pHlp->pfnPrintf(pHlp, "    Interrupt enable                        = %RTbool\n", PprLogOverflowEarly.n.u1IntrEn);
     2582        pHlp->pfnPrintf(pHlp, "    Enable                                  = %RTbool\n", PprLogOverflowEarly.n.u1Enable);
     2583    }
     2584    /* PPR Log Overflow Early Warning Indicator Register. */
     2585    {
     2586        PPR_LOG_OVERFLOW_EARLY_T const PprLogBOverflowEarly = pThis->PprLogBOverflowEarly;
     2587        pHlp->pfnPrintf(pHlp, "  PPR Log B overflow early warning        = %#RX64\n",    PprLogBOverflowEarly.u64);
     2588        pHlp->pfnPrintf(pHlp, "    Threshold                               = %#x\n",     PprLogBOverflowEarly.n.u15Threshold);
     2589        pHlp->pfnPrintf(pHlp, "    Interrupt enable                        = %RTbool\n", PprLogBOverflowEarly.n.u1IntrEn);
     2590        pHlp->pfnPrintf(pHlp, "    Enable                                  = %RTbool\n", PprLogBOverflowEarly.n.u1Enable);
     2591    }
     2592}
     2593
     2594
    21112595/**
    21122596 * @callback_method_impl{FNSSMDEVSAVEEXEC}
     
    23052789                                NULL, iommuAmdR3SaveExec, NULL,
    23062790                                NULL, iommuAmdR3LoadExec, NULL);
     2791    AssertRCReturn(rc, rc);
     2792
     2793    /*
     2794     * Register debugger info item.
     2795     */
     2796    rc = PDMDevHlpDBGFInfoRegister(pDevIns, "iommu", "Display IOMMU state.", iommuAmdR3DbgInfo);
    23072797    AssertRCReturn(rc, rc);
    23082798
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