VirtualBox

Ignore:
Timestamp:
Mar 12, 2025 9:39:41 AM (6 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167919
Message:

VMM/GIC: bugref:10404 Fixed illegal register access after re-enabling extended SPIs.

File:
1 edited

Legend:

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

    r108527 r108529  
    703703    Assert(pGicDev->fAffRoutingEnabled);
    704704
    705     /* Hardware does not map the first 32 registers (corresponding to SGIs and PPIs). */
    706     idxReg += GIC_INTID_RANGE_SPI_START;
    707     AssertReturn(idxReg < RT_ELEMENTS(pGicDev->au32IntrRouting), VERR_BUFFER_OVERFLOW);
     705    AssertMsgReturn(idxReg < RT_ELEMENTS(pGicDev->au32IntrRouting), ("idxReg=%u\n", idxReg), VERR_BUFFER_OVERFLOW);
    708706    Assert(idxReg < sizeof(pGicDev->bmIntrRoutingMode) * 8);
    709707    if (!(idxReg % 2))
     
    889887    {
    890888        uint16_t const idxPriority = idxReg * sizeof(uint32_t);
    891         AssertReturn(idxPriority < RT_ELEMENTS(pGicDev->abIntrPriority) - sizeof(uint32_t), VERR_BUFFER_OVERFLOW);
     889        AssertReturn(idxPriority <= RT_ELEMENTS(pGicDev->abIntrPriority) - sizeof(uint32_t), VERR_BUFFER_OVERFLOW);
    892890        AssertCompile(sizeof(*puValue) == sizeof(uint32_t));
    893891        *puValue = *(uint32_t *)&pGicDev->abIntrPriority[idxPriority];
     
    920918    {
    921919        uint16_t const idxPriority = idxReg * sizeof(uint32_t);
    922         AssertReturn(idxPriority < RT_ELEMENTS(pGicDev->abIntrPriority) - sizeof(uint32_t), VERR_BUFFER_OVERFLOW);
     920        AssertReturn(idxPriority <= RT_ELEMENTS(pGicDev->abIntrPriority) - sizeof(uint32_t), VERR_BUFFER_OVERFLOW);
    923921        AssertCompile(sizeof(uValue) == sizeof(uint32_t));
    924922        *(uint32_t *)&pGicDev->abIntrPriority[idxPriority] = uValue;
     
    18411839        if (offReg - GIC_DIST_REG_IROUTERn_OFF_START < GIC_DIST_REG_IROUTERn_RANGE_SIZE)
    18421840        {
    1843             uint16_t const idxReg = (offReg - GIC_DIST_REG_IROUTERn_OFF_START) / cbReg;
     1841            /* Hardware does not map the first 32 registers (corresponding to SGIs and PPIs). */
     1842            uint16_t const idxExt = GIC_INTID_RANGE_SPI_START;
     1843            uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERn_OFF_START) / sizeof(uint64_t);
    18441844            return gicDistReadIntrRoutingReg(pGicDev, idxReg, puValue);
    18451845        }
     
    18471847        {
    18481848            uint16_t const idxExt = RT_ELEMENTS(pGicDev->au32IntrRouting) / 2;
    1849             uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERnE_OFF_START) / cbReg;
     1849            uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERnE_OFF_START) / sizeof(uint64_t);
    18501850            return gicDistReadIntrRoutingReg(pGicDev, idxReg, puValue);
    18511851        }
     
    20802080    if (offReg - GIC_DIST_REG_IROUTERn_OFF_START < GIC_DIST_REG_IROUTERn_RANGE_SIZE)
    20812081    {
    2082         uint16_t const idxReg = (offReg - GIC_DIST_REG_IROUTERn_OFF_START) / cbReg;
     2082        /* Hardware does not map the first 32 registers (corresponding to SGIs and PPIs). */
     2083        uint16_t const idxExt = GIC_INTID_RANGE_SPI_START;
     2084        uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERn_OFF_START) / sizeof(uint64_t);
    20832085        return gicDistWriteIntrRoutingReg(pGicDev, idxReg, uValue);
    20842086    }
     
    20862088    {
    20872089        uint16_t const idxExt = RT_ELEMENTS(pGicDev->au32IntrRouting) / 2;
    2088         uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERnE_OFF_START) / cbReg;
     2090        uint16_t const idxReg = idxExt + (offReg - GIC_DIST_REG_IROUTERnE_OFF_START) / sizeof(uint64_t);
    20892091        return gicDistWriteIntrRoutingReg(pGicDev, idxReg, uValue);
    20902092    }
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