VirtualBox

Changeset 108941 in vbox


Ignore:
Timestamp:
Apr 11, 2025 8:30:04 AM (9 days ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168452
Message:

VMM/GIC: bugref:10877 LPI, ITS work-in-progress.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/gic-its.h

    r108919 r108941  
    320320/** GITS_BASER: Mask of valid read-write bits. */
    321321#define GITS_CTRL_REG_BASER_RW_MASK                             (UINT64_MAX & ~(  GITS_BF_CTRL_REG_BASER_ENTRY_SIZE_MASK \
    322                                                                                 | GITS_BF_CTRL_REG_BASER_TYPE_MASK))
     322                                                                                | GITS_BF_CTRL_REG_BASER_TYPE_MASK \
     323                                                                                | GITS_BF_CTRL_REG_BASER_INDIRECT_MASK))
    323324
    324325/** GITS_BASER: Table type - Unimplemented (not a table). */
  • trunk/src/VBox/VMM/VMMAll/GICAll.cpp

    r108882 r108941  
    31023102    pGicDev->fAffRoutingEnabled = true; /* GICv2 backwards compatibility is not implemented, so this is RA1/WI. */
    31033103
    3104     /* LPIs. */
    3105     RT_ZERO(pGicDev->bmLpiPending);
    3106     RT_ZERO(pGicDev->abLpiConfig);
    3107     pGicDev->uLpiConfigBaseReg.u = 0;
    3108     pGicDev->fEnableLpis = false;
    3109 
    31103104    /* GITS. */
    31113105    PGITSDEV pGitsDev = &pGicDev->Gits;
    31123106    gitsInit(pGitsDev);
     3107
     3108    /* LPIs. */
     3109    RT_ZERO(pGicDev->abLpiConfig);
     3110    RT_ZERO(pGicDev->bmLpiPending);
     3111    pGicDev->uLpiConfigBaseReg.u = 0;
     3112    pGicDev->fEnableLpis = false;
    31133113}
    31143114
  • trunk/src/VBox/VMM/VMMAll/GITSAll.cpp

    r108918 r108941  
    6969 * during compile time. */
    7070#define GITSDIAG_DESC(a_Name)                       RT_CONCAT(kGitsDiag_, a_Name) < kGitsDiag_End ? RT_STR(a_Name) : "Ignored"
    71 /** @} */
     71
     72/** @def GITS_SET_REG_U64_FULL
     73 * Sets a 64-bit GITS register.
     74 * @param   a_uReg      The 64-bit register to set.
     75 * @param   a_uValue    The 64-bit value being written.
     76 * @param   a_fRwMask   The 64-bit mask of valid read-write bits.
     77 */
     78#define GITS_SET_REG_U64_FULL(a_uReg, a_uValue, a_fRwMask) \
     79    do \
     80    { \
     81        AssertCompile(sizeof(a_uReg) == sizeof(uint64_t)); \
     82        AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \
     83        (a_uReg) = ((a_uReg) & ~(a_fRwMask)) | ((a_uValue) & (a_fRwMask)); \
     84    } while (0)
     85
     86/** @def GITS_SET_REG_U64_LO
     87 * Sets the lower half of a 64-bit GITS register.
     88 * @param   a_uReg      The lower half of a 64-bit register to set.
     89 * @param   a_uValue    The value being written (only lower 32-bits are used).
     90 * @param   a_fRwMask   The 64-bit mask of valid read-write bits.
     91 */
     92#define GITS_SET_REG_U64_LO(a_uReg, a_uValue, a_fRwMask) \
     93    do \
     94    { \
     95        AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \
     96        AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \
     97        (a_uReg) = ((a_uReg) & ~(RT_LO_U32(a_fRwMask))) | ((uint32_t)(a_uValue) & (RT_LO_U32(a_fRwMask))); \
     98    } while (0)
     99
     100/** @def GITS_SET_REG_U64_HI
     101 * Sets the upper half of a 64-bit GITS register.
     102 * @param   a_uReg      The upper half of the 64-bit register to set.
     103 * @param   a_uValue    The value being written (only lower 32-bits are used).
     104 * @param   a_fRwMask   The 64-bit mask of valid read-write bits.
     105 */
     106#define GITS_SET_REG_U64_HI(a_uReg, a_uValue, a_fRwMask) \
     107    do \
     108    { \
     109        AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \
     110        AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \
     111        (a_uReg) = ((a_uReg) & ~(RT_HI_U32(a_fRwMask))) | ((uint32_t)(a_uValue) & (RT_HI_U32(a_fRwMask))); \
     112    } while (0)
     113
     114/** @def GITS_SET_REG_U32_FULL
     115 * Sets a 32-bit GITS register.
     116 * @param   a_uReg      The 32-bit register to set.
     117 * @param   a_uValue    The 32-bit value being written (only lower 32-bits are
     118 *                      used).
     119 * @param   a_fRwMask   The mask of valid read-write bits (only lower 32-bits are
     120 *                      used).
     121 */
     122#define GITS_SET_REG_U32(a_uReg, a_uValue, a_fRwMask) \
     123    do \
     124    { \
     125        AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \
     126        (a_uReg) = ((a_uReg) & ~(a_fRwMask)) | ((uint32_t)(a_uValue) & (uint32_t)(a_fRwMask)); \
     127    } while (0)
    72128
    73129
     
    311367    if (GITS_IS_REG_IN_RANGE(offReg, GITS_CTRL_REG_BASER_OFF_FIRST, GITS_CTRL_REG_BASER_RANGE_SIZE))
    312368    {
    313         uint16_t const cbReg  = sizeof(uint64_t);
    314         uint16_t const idxReg = (offReg - GITS_CTRL_REG_BASER_OFF_FIRST) / cbReg;
     369        uint16_t const cbReg   = sizeof(uint64_t);
     370        uint16_t const idxReg  = (offReg - GITS_CTRL_REG_BASER_OFF_FIRST) / cbReg;
     371        uint64_t const fRwMask = GITS_CTRL_REG_BASER_RW_MASK;
    315372        if (!(offReg & 7))
    316373        {
    317374            if (cb == 8)
    318                 pGitsDev->aItsTableRegs[idxReg].u = uValue & GITS_CTRL_REG_BASER_RW_MASK;
     375                GITS_SET_REG_U64_FULL(pGitsDev->aItsTableRegs[idxReg].u, uValue, fRwMask);
    319376            else
    320                 pGitsDev->aItsTableRegs[idxReg].s.Lo = uValue & RT_LO_U32(GITS_CTRL_REG_BASER_RW_MASK);
     377                GITS_SET_REG_U64_LO(pGitsDev->aItsTableRegs[idxReg].s.Lo, uValue, fRwMask);
    321378        }
    322379        else
    323380        {
    324381            Assert(cb == 4);
    325             pGitsDev->aItsTableRegs[idxReg].s.Hi = uValue & RT_HI_U32(GITS_CTRL_REG_BASER_RW_MASK);
     382            GITS_SET_REG_U64_HI(pGitsDev->aItsTableRegs[idxReg].s.Hi, uValue, fRwMask);
    326383        }
    327384        return;
     
    333390            Assert(cb == 4);
    334391            Assert(!(pGitsDev->uTypeReg.u & GITS_BF_CTRL_REG_TYPER_UMSI_IRQ_MASK));
    335             pGitsDev->uCtrlReg = uValue & GITS_BF_CTRL_REG_CTLR_RW_MASK;
     392            GITS_SET_REG_U32(pGitsDev->uCtrlReg, uValue, GITS_BF_CTRL_REG_CTLR_RW_MASK);
    336393            if (RT_BF_GET(uValue, GITS_BF_CTRL_REG_CTLR_ENABLED))
    337394                pGitsDev->uCtrlReg &= GITS_BF_CTRL_REG_CTLR_QUIESCENT_MASK;
     
    340397
    341398        case GITS_CTRL_REG_CBASER_OFF:
    342             uValue &= GITS_CTRL_REG_CBASER_RW_MASK;
    343399            if (cb == 8)
    344                 pGitsDev->uCmdBaseReg.u = uValue;
     400                GITS_SET_REG_U64_FULL(pGitsDev->uCmdBaseReg.u, uValue, GITS_CTRL_REG_CBASER_RW_MASK);
    345401            else
    346                 pGitsDev->uCmdBaseReg.s.Lo = (uint32_t)uValue;
     402                GITS_SET_REG_U64_LO(pGitsDev->uCmdBaseReg.s.Lo, uValue, GITS_CTRL_REG_CBASER_RW_MASK);
    347403            gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev);
    348404            break;
     
    350406        case GITS_CTRL_REG_CBASER_OFF + 4:
    351407            Assert(cb == 4);
    352             pGitsDev->uCmdBaseReg.s.Hi = uValue & RT_HI_U32(GITS_CTRL_REG_CBASER_RW_MASK);
     408            GITS_SET_REG_U64_HI(pGitsDev->uCmdBaseReg.s.Hi, uValue, GITS_CTRL_REG_CBASER_RW_MASK);
    353409            gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev);
    354410            break;
    355411
    356412        case GITS_CTRL_REG_CWRITER_OFF:
    357             pGitsDev->uCmdWriteReg = uValue & RT_LO_U32(GITS_CTRL_REG_CWRITER_RW_MASK);
     413            GITS_SET_REG_U32(pGitsDev->uCmdWriteReg, uValue, GITS_CTRL_REG_CWRITER_RW_MASK);
    358414            gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev);
    359415            break;
     
    387443    Log4Func(("\n"));
    388444
    389     pGitsDev->uCtrlReg   = RT_BF_MAKE(GITS_BF_CTRL_REG_CTLR_QUIESCENT,  1);
     445    /* GITS_CTLR.*/
     446    pGitsDev->uCtrlReg = RT_BF_MAKE(GITS_BF_CTRL_REG_CTLR_QUIESCENT,  1);
     447
     448    /* GITS_TYPER. */
    390449    pGitsDev->uTypeReg.u = RT_BF_MAKE(GITS_BF_CTRL_REG_TYPER_PHYSICAL,  1)     /* Physical LPIs supported. */
    391450                       /*| RT_BF_MAKE(GITS_BF_CTRL_REG_TYPER_VIRTUAL,   0) */  /* Virtual LPIs not supported. */
     
    410469                                                                                  GITS_CTLR.Enabled and GITS_BASER<n>.Valid. */
    411470    Assert(RT_ELEMENTS(pGitsDev->auCtes) >= RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_HCC));
     471
     472    /* GITS_BASER<n>. */
    412473    RT_ZERO(pGitsDev->aItsTableRegs);
    413 
    414474    pGitsDev->aItsTableRegs[0].u = RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_ENTRY_SIZE, GITS_ITE_SIZE - 1)
    415475                                 | RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_TYPE,       GITS_BASER_TYPE_DEVICES)
    416476                                 | RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_VALID,      1);
    417477
    418     pGitsDev->uCmdBaseReg.u   = 0;
    419     pGitsDev->uCmdReadReg     = 0;
    420     pGitsDev->uCmdWriteReg    = 0;
     478    /* GITS_CBASER, GITS_CREADR, GITS_CWRITER. */
     479    pGitsDev->uCmdBaseReg.u = 0;
     480    pGitsDev->uCmdReadReg   = 0;
     481    pGitsDev->uCmdWriteReg  = 0;
     482
     483    /* Collection Table. */
    421484    RT_ZERO(pGitsDev->auCtes);
    422485
     486    /* Misc. stuff. */
    423487    pGitsDev->cCmdQueueErrors = 0;
    424488}
     
    426490
    427491#ifdef IN_RING3
    428 DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp, const char *pszArgs)
    429 {
    430     RT_NOREF(pszArgs);
    431 
     492DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp)
     493{
    432494    pHlp->pfnPrintf(pHlp, "GIC ITS:\n");
    433495
  • trunk/src/VBox/VMM/VMMR3/GICR3.cpp

    r108884 r108941  
    287287static DECLCALLBACK(void) gicR3DbgInfoIts(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs)
    288288{
    289     PGIC pGic = VM_TO_GIC(pVM);
     289    NOREF(pszArgs);
     290    PGIC       pGic    = VM_TO_GIC(pVM);
     291    PPDMDEVINS pDevIns = pGic->CTX_SUFF(pDevIns);
     292    PCGICDEV   pGicDev = PDMDEVINS_2_DATA(pDevIns, PCGICDEV);
     293    if (pGicDev->hMmioGits != NIL_IOMMMIOHANDLE)
     294        gitsR3DbgInfo(&pGicDev->Gits, pHlp);
     295    else
     296        pHlp->pfnPrintf(pHlp, "GIC ITS is not mapped/configured for the VM\n");
     297}
     298
     299
     300/**
     301 * Dumps the GIC LPI information.
     302 *
     303 * @param   pVM         The cross context VM structure.
     304 * @param   pHlp        The info helpers.
     305 * @param   pszArgs     Arguments, ignored.
     306 */
     307static DECLCALLBACK(void) gicR3DbgInfoLpi(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs)
     308{
     309    NOREF(pszArgs);
     310    PGIC       pGic     = VM_TO_GIC(pVM);
    290311    PPDMDEVINS pDevIns  = pGic->CTX_SUFF(pDevIns);
    291312    PCGICDEV   pGicDev  = PDMDEVINS_2_DATA(pDevIns, PCGICDEV);
    292     if (pGicDev->hMmioGits != NIL_IOMMMIOHANDLE)
    293         gitsR3DbgInfo(&pGicDev->Gits, pHlp, pszArgs);
    294     else
    295         pHlp->pfnPrintf(pHlp, "GIC ITS is not mapped/configured for the VM\n");
     313    if (!pGicDev->fLpi)
     314    {
     315        pHlp->pfnPrintf(pHlp, "GIC LPI support is not enabled for the VM\n");
     316        return;
     317    }
     318    pHlp->pfnPrintf(pHlp, "GIC LPIs:\n");
     319    pHlp->pfnPrintf(pHlp, "  Enabled            = %RTbool\n", pGicDev->fEnableLpis);
     320
     321    /* GICR_PENDBASER. */
     322    {
     323        uint64_t const uReg = pGicDev->uLpiPendingBaseReg.u;
     324        pHlp->pfnPrintf(pHlp, "  uLpiPendingBaseReg = %#RX64\n", uReg);
     325        pHlp->pfnPrintf(pHlp, "    Inner cache        = %#x\n",     RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_INNER_CACHE));
     326        pHlp->pfnPrintf(pHlp, "    Shareability       = %#x\n",     RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_SHAREABILITY));
     327        pHlp->pfnPrintf(pHlp, "    Phys addr          = %#RX64\n",  uReg & GIC_BF_REDIST_REG_PENDBASER_PHYS_ADDR_MASK);
     328        pHlp->pfnPrintf(pHlp, "    Outer cache        = %#x\n",     RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_OUTER_CACHE));
     329        pHlp->pfnPrintf(pHlp, "    Pending Table Zero = %RTbool\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_PTZ));
     330    }
     331
     332    /* GICR_PROPBASER. */
     333    {
     334        uint64_t const uReg   = pGicDev->uLpiConfigBaseReg.u;
     335        uint8_t const cIdBits = RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_ID_BITS);
     336        pHlp->pfnPrintf(pHlp, "  uLpiConfigBaseReg  = %#RX64\n", uReg);
     337        pHlp->pfnPrintf(pHlp, "    ID bits            = %#x (%u bits)\n", cIdBits, cIdBits);
     338        pHlp->pfnPrintf(pHlp, "    Inner cache        = %#x\n",    RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_INNER_CACHE));
     339        pHlp->pfnPrintf(pHlp, "    Shareability       = %#x\n",    RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_SHAREABILITY));
     340        pHlp->pfnPrintf(pHlp, "    Phys addr          = %#RX64\n", uReg & GIC_BF_REDIST_REG_PROPBASER_PHYS_ADDR_MASK);
     341        pHlp->pfnPrintf(pHlp, "    Outer cache        = %#x\n",    RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_OUTER_CACHE));
     342    }
     343    /** @todo Dump LPI config and LPI pending registers. */
    296344}
    297345
     
    9571005    DBGFR3InfoRegisterInternalEx(pVM, "gicredist", "Dumps GIC redistributor information.", gicR3DbgInfoReDist, DBGFINFO_FLAGS_ALL_EMTS);
    9581006    DBGFR3InfoRegisterInternalEx(pVM, "gicits",    "Dumps GIC ITS information.",           gicR3DbgInfoIts,    DBGFINFO_FLAGS_ALL_EMTS);
     1007    DBGFR3InfoRegisterInternalEx(pVM, "giclpi",    "Dumps GIC LPI information.",           gicR3DbgInfoLpi,    DBGFINFO_FLAGS_ALL_EMTS);
    9591008
    9601009    /*
  • trunk/src/VBox/VMM/include/GITSInternal.h

    r108914 r108941  
    202202
    203203#ifdef IN_RING3
    204 DECL_HIDDEN_CALLBACK(void)         gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp, const char *pszArgs);
     204DECL_HIDDEN_CALLBACK(void)         gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp);
    205205DECL_HIDDEN_CALLBACK(int)          gitsR3CmdQueueProcess(PPDMDEVINS pDevIns, PGITSDEV pGitsDev, void *pvBuf, uint32_t cbBuf);
    206206#endif
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