VirtualBox

Changeset 108914 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Apr 9, 2025 11:14:15 AM (4 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168389
Message:

VMM/GIC: bugref:10877 GIC ITS command-queue, stall queue only when we haven't incremented read offset.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/GITSAll.cpp

    r108912 r108914  
    7979{
    8080    GITSDIAG_DESC(None),
    81     GITSDIAG_DESC(CmdQueue_Unknown_Cmd),
    82     GITSDIAG_DESC(CmdQueue_Invalid_PhysAddr),
     81    GITSDIAG_DESC(CmdQueue_Basic_Unknown_Cmd),
     82    GITSDIAG_DESC(CmdQueue_Basic_Invalid_PhysAddr),
     83    GITSDIAG_DESC(CmdQueue_Cmd_Mapc_Icid_Overflow),
    8384    /* kGitsDiag_End */
    8485};
     
    161162
    162163    /* Record the error and stall the queue. */
    163     pGitsDev->uCmdQueueError = enmError;
     164    pGitsDev->enmDiag = enmError;
     165    pGitsDev->cCmdQueueErrors++;
    164166    if (fStallQueue)
    165167        pGitsDev->uCmdReadReg |= GITS_BF_CTRL_REG_CREADR_STALLED_MASK;
     
    415417    pGitsDev->uCmdWriteReg  = 0;
    416418    RT_ZERO(pGitsDev->auCtes);
     419
     420    pGitsDev->cCmdQueueErrors = 0;
    417421}
    418422
     
    430434        const char *const pszDiag  = enmDiag < RT_ELEMENTS(g_apszGitsDiagDesc) ? g_apszGitsDiagDesc[enmDiag] : "(Unknown)";
    431435        uint32_t const    uCtrlReg = pGitsDev->uCtrlReg;
    432         pHlp->pfnPrintf(pHlp, "  Error              = %#RX32 (%s)\n", enmDiag, pszDiag);
    433         pHlp->pfnPrintf(pHlp, "  uArchRev           = %u\n",      pGitsDev->uArchRev);
    434         pHlp->pfnPrintf(pHlp, "  uCtrlReg           = %#RX32\n",  uCtrlReg);
    435         pHlp->pfnPrintf(pHlp, "    Enabled            = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_ENABLED));
    436         pHlp->pfnPrintf(pHlp, "    UMSI IRQ           = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_UMSI_IRQ));
    437         pHlp->pfnPrintf(pHlp, "    Quiescent          = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_QUIESCENT));
     436        pHlp->pfnPrintf(pHlp, "  uArchRev           = %u\n",          pGitsDev->uArchRev);
     437        pHlp->pfnPrintf(pHlp, "  Errors             = %RU64\n",       pGitsDev->cCmdQueueErrors);
     438        pHlp->pfnPrintf(pHlp, "  Diagnostic         = %#RX32 (%s)\n", enmDiag, pszDiag);
     439        pHlp->pfnPrintf(pHlp, "  GITS_CTLR          = %#RX32\n",      uCtrlReg);
     440        pHlp->pfnPrintf(pHlp, "    Enabled            = %RTbool\n",   RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_ENABLED));
     441        pHlp->pfnPrintf(pHlp, "    UMSI IRQ           = %RTbool\n",   RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_UMSI_IRQ));
     442        pHlp->pfnPrintf(pHlp, "    Quiescent          = %RTbool\n",   RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_QUIESCENT));
    438443    }
    439444
     
    452457        uint8_t const  idxType     = RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_TYPE);
    453458        const char *pszType        = s_apszType[idxType];
    454         pHlp->pfnPrintf(pHlp, "  aItsTableReg[%u]    = %#RX64\n", i, uReg);
     459        pHlp->pfnPrintf(pHlp, "  GITS_BASER[%u]      = %#RX64\n", i, uReg);
    455460        pHlp->pfnPrintf(pHlp, "    Size               = %#x (pages=%u total=%.Rhcb)\n", uSize, cPages, cbItsTable);
    456461        pHlp->pfnPrintf(pHlp, "    Page size          = %#x (%.Rhcb)\n", idxPageSize, s_acbPageSize[idxPageSize]);
     
    470475        uint8_t const uSize   = RT_BF_GET(uReg, GITS_BF_CTRL_REG_CBASER_SIZE);
    471476        uint16_t const cPages = uSize > 0 ? uSize + 1 : 0;
    472         pHlp->pfnPrintf(pHlp, "  uCmdBaseReg        = %#RX64\n", uReg);
     477        pHlp->pfnPrintf(pHlp, "  GITS_CBASER        = %#RX64\n", uReg);
    473478        pHlp->pfnPrintf(pHlp, "    Size               = %#x (pages=%u total=%.Rhcb)\n", uSize, cPages, _4K * cPages);
    474479        pHlp->pfnPrintf(pHlp, "    Shareability       = %#x\n",      RT_BF_GET(uReg, GITS_BF_CTRL_REG_CBASER_SHAREABILITY));
     
    482487    {
    483488        uint32_t const uReg = pGitsDev->uCmdReadReg;
    484         pHlp->pfnPrintf(pHlp, "  uCmdReadReg        = 0x%05RX32 (stalled=%RTbool offset=%RU32)\n", uReg,
     489        pHlp->pfnPrintf(pHlp, "  GITS_CREADR        = 0x%05RX32 (stalled=%RTbool offset=%RU32)\n", uReg,
    485490                        RT_BF_GET(uReg, GITS_BF_CTRL_REG_CREADR_STALLED), uReg & GITS_BF_CTRL_REG_CREADR_OFFSET_MASK);
    486491    }
     
    489494    {
    490495        uint32_t const uReg = pGitsDev->uCmdWriteReg;
    491         pHlp->pfnPrintf(pHlp, "  uCmdWriteReg       = 0x%05RX32 (  retry=%RTbool offset=%RU32)\n", uReg,
     496        pHlp->pfnPrintf(pHlp, "  GITS_CWRITER       = 0x%05RX32 (  retry=%RTbool offset=%RU32)\n", uReg,
    492497                        RT_BF_GET(uReg, GITS_BF_CTRL_REG_CWRITER_RETRY), uReg & GITS_BF_CTRL_REG_CWRITER_OFFSET_MASK);
    493498    }
     
    565570                /* Indicate to the guest we've fetched all commands. */
    566571                GITS_CRIT_SECT_ENTER(pDevIns);
    567                 pGitsDev->uCmdReadReg  = offWrite;
     572                pGitsDev->uCmdReadReg = offWrite;
    568573                pGitsDev->uCmdWriteReg &= ~GITS_BF_CTRL_REG_CWRITER_RETRY_MASK;
    569574
     
    584589                            uint16_t const uTargetCpuId      = RT_BF_GET(uDw2, GITS_BF_CMD_MAPC_DW2_RDBASE);
    585590                            uint16_t const uIntrCollectionId = RT_BF_GET(uDw2, GITS_BF_CMD_MAPC_DW2_IC_ID);
    586                             AssertRelease(uIntrCollectionId < RT_ELEMENTS(pGitsDev->auCtes)); /** @todo later figure ideal/correct CT size. */
    587591
    588592                            GITS_CRIT_SECT_ENTER(pDevIns);
    589                             Assert(!RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_PTA));
    590                             pGitsDev->auCtes[uIntrCollectionId] = RT_BF_MAKE(GITS_BF_CTE_VALID,  fValid)
    591                                                                 | RT_BF_MAKE(GITS_BF_CTE_RDBASE, uTargetCpuId);
     593                            if (RT_LIKELY(uIntrCollectionId < RT_ELEMENTS(pGitsDev->auCtes)))
     594                            {
     595                                Assert(!RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_PTA));
     596                                pGitsDev->auCtes[uIntrCollectionId] = RT_BF_MAKE(GITS_BF_CTE_VALID,  fValid)
     597                                                                    | RT_BF_MAKE(GITS_BF_CTE_RDBASE, uTargetCpuId);
     598                            }
     599                            else
     600                                gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Cmd_Mapc_Icid_Overflow,
     601                                                     false /* fStall */);
    592602                            GITS_CRIT_SECT_LEAVE(pDevIns);
    593603                            STAM_COUNTER_INC(&pGitsDev->StatCmdMapc);
     
    596606
    597607                        case GITS_CMD_ID_SYNC:
    598                         {
    599608                            /* Nothing to do since all previous commands have committed their changes to device state. */
     609                            STAM_COUNTER_INC(&pGitsDev->StatCmdInvall);
     610                            break;
     611
     612                        case GITS_CMD_ID_INVALL:
     613                            /* Nothing to do as we currently do not cache interrupt mappings. */
    600614                            STAM_COUNTER_INC(&pGitsDev->StatCmdSync);
    601615                            break;
    602                         }
    603 
    604                         case GITS_CMD_ID_INVALL:
    605                         {
    606                             /* Nothing to do as we currently do not cache interrupt mappings. */
    607                             STAM_COUNTER_INC(&pGitsDev->StatCmdInvall);
    608                             break;
    609                         }
    610616
    611617                        default:
    612618                        {
    613                             gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Unknown_Cmd, true /* fStall */);
     619                            /* Record an internal error but do NOT stall queue as we have already advanced the read offset. */
     620                            gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Basic_Unknown_Cmd, false /* fStall */);
    614621                            AssertReleaseMsgFailed(("Cmd=%#x (%s) idxCmd=%u cCmds=%u offRead=%#RX32 offWrite=%#RX32\n",
    615622                                                    uCmdId, gitsGetCommandName(uCmdId), idxCmd, cCmds, offRead, offWrite));
     
    622629
    623630            /* Failed to read command queue from the physical address specified by the guest, stall queue and retry later. */
    624             gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Invalid_PhysAddr, true /* fStall */);
     631            gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Basic_Invalid_PhysAddr, true /* fStall */);
    625632            return VINF_TRY_AGAIN;
    626633        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette