VirtualBox

Ignore:
Timestamp:
May 8, 2025 12:02:48 PM (11 days ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168783
Message:

VMM/GIC: bugref:10877 GITS command-queue, work-in-progress.

File:
1 edited

Legend:

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

    r109205 r109206  
    3737#include <VBox/vmm/pdmdev.h>
    3838#include <VBox/vmm/dbgf.h>
     39#include <VBox/vmm/vm.h>        /* pVM->cCpus */
    3940#include <iprt/errcore.h>       /* VINF_SUCCESS */
    4041#include <iprt/string.h>        /* RT_ZERO */
     
    6869
    6970    /* Command queue: INVALL. */
     71    GITSDIAG_DESC(CmdQueue_Cmd_Invall_Cte_Unmapped),
    7072    GITSDIAG_DESC(CmdQueue_Cmd_Invall_Icid_Invalid),
    7173
     
    940942                        case GITS_CMD_ID_INV:
    941943                        {
    942                             uint64_t const uReg = pGitsDev->aItsTableRegs[0].u;
    943                             AssertMsgFailed(("aItsTableRegs[0].u=%#RX64 (%#RGp %#RGp) Valid=%RTbool\n", uReg,
    944                                              uReg & GITS_BF_CTRL_REG_BASER_PHYS_ADDR_MASK, gitsGetBaseRegPhysAddr(uReg),
    945                                              RT_BOOL(RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_VALID))));
    946                             NOREF(uReg);
     944                            /* Reading the table is likely to take the same time as reading just one entry. */
     945                            gicDistReadLpiConfigTableFromMem(pDevIns);
    947946                            break;
    948947                        }
     
    958957                            uint64_t const uDw2  = pCmd->au64[2].u;
    959958                            uint16_t const uIcId = RT_BF_GET(uDw2, GITS_BF_CMD_INVALL_DW2_IC_ID);
    960                             if (RT_LIKELY(uIcId < RT_ELEMENTS(pGitsDev->aCtes)))
    961                                 gicDistReadLpiConfigTableFromMem(pDevIns);
     959                            PCVMCC         pVM   = PDMDevHlpGetVM(pDevIns);
     960                            if (uIcId < RT_ELEMENTS(pGitsDev->aCtes))
     961                            {
     962                                if (pGitsDev->aCtes[uIcId].idTargetCpu < pVM->cCpus)
     963                                    gicDistReadLpiConfigTableFromMem(pDevIns);
     964                                else
     965                                    gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Cmd_Invall_Cte_Unmapped,
     966                                                         false /* fStall */);
     967                            }
    962968                            else
    963969                                gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Cmd_Invall_Icid_Invalid,
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