VirtualBox

Changeset 108767 in vbox for trunk/src


Ignore:
Timestamp:
Mar 27, 2025 1:08:29 PM (3 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168194
Message:

VMM/GIC: bugref:10877 Work-in-progress CWRITER, CREADR bits and fixes to register descriptions for GICR SGI/PPI registers.

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

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

    r108764 r108767  
    187187static const char *gicReDistGetRegDescription(uint16_t offReg)
    188188{
     189    switch (offReg)
     190    {
     191        case GIC_REDIST_REG_CTLR_OFF:           return "GICR_CTLR";
     192        case GIC_REDIST_REG_IIDR_OFF:           return "GICR_IIDR";
     193        case GIC_REDIST_REG_TYPER_OFF:          return "GICR_TYPER";
     194        case GIC_REDIST_REG_TYPER_AFFINITY_OFF: return "GICR_TYPER_AFF";
     195        case GIC_REDIST_REG_STATUSR_OFF:        return "GICR_STATUSR";
     196        case GIC_REDIST_REG_WAKER_OFF:          return "GICR_WAKER";
     197        case GIC_REDIST_REG_MPAMIDR_OFF:        return "GICR_MPAMIDR";
     198        case GIC_REDIST_REG_PARTIDR_OFF:        return "GICR_PARTIDR";
     199        case GIC_REDIST_REG_SETLPIR_OFF:        return "GICR_SETLPIR";
     200        case GIC_REDIST_REG_CLRLPIR_OFF:        return "GICR_CLRLPIR";
     201        case GIC_REDIST_REG_PROPBASER_OFF:      return "GICR_PROPBASER";
     202        case GIC_REDIST_REG_PENDBASER_OFF:      return "GICR_PENDBASER";
     203        case GIC_REDIST_REG_INVLPIR_OFF:        return "GICR_INVLPIR";
     204        case GIC_REDIST_REG_INVALLR_OFF:        return "GICR_INVALLR";
     205        case GIC_REDIST_REG_SYNCR_OFF:          return "GICR_SYNCR";
     206        case GIC_REDIST_REG_PIDR2_OFF:          return "GICR_PIDR2";
     207        default:
     208            return "<UNKNOWN>";
     209    }
     210}
     211
     212
     213/**
     214 * Gets the description of an SGI/PPI redistributor register given it's register
     215 * offset.
     216 *
     217 * @returns The register description.
     218 * @param   offReg  The redistributor register offset.
     219 */
     220static const char *gicReDistGetSgiPpiRegDescription(uint16_t offReg)
     221{
    189222    if (GIC_IS_REG_IN_RANGE(offReg, GIC_REDIST_SGI_PPI_REG_IGROUPR0_OFF,          GIC_REDIST_SGI_PPI_REG_IGROUPRnE_RANGE_SIZE))    return "GICR_IGROUPn";
    190223    if (GIC_IS_REG_IN_RANGE(offReg, GIC_REDIST_SGI_PPI_REG_ISENABLER0_OFF,        GIC_REDIST_SGI_PPI_REG_ISENABLERnE_RANGE_SIZE))  return "GICR_ISENABLERn";
     
    196229    if (GIC_IS_REG_IN_RANGE(offReg, GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START, GIC_REDIST_SGI_PPI_REG_IPRIORITYRnE_RANGE_SIZE)) return "GICR_IPREIORITYn";
    197230    if (GIC_IS_REG_IN_RANGE(offReg, GIC_REDIST_SGI_PPI_REG_ICFGR0_OFF,            GIC_REDIST_SGI_PPI_REG_ICFGRnE_RANGE_SIZE))      return "GICR_ICFGRn";
     231    if (GIC_IS_REG_IN_RANGE(offReg, GIC_REDIST_SGI_PPI_REG_INMIR0_OFF,            GIC_REDIST_SGI_PPI_REG_INMIRnE_RANGE_SIZE))      return "GICR_INMIRn";
    198232    switch (offReg)
    199233    {
    200         case GIC_REDIST_REG_CTLR_OFF:           return "GICR_CTLR";
    201         case GIC_REDIST_REG_IIDR_OFF:           return "GICR_IIDR";
    202         case GIC_REDIST_REG_TYPER_OFF:          return "GICR_TYPER";
    203         case GIC_REDIST_REG_TYPER_AFFINITY_OFF: return "GICR_TYPER_AFF";
    204         case GIC_REDIST_REG_STATUSR_OFF:        return "GICR_STATUSR";
    205         case GIC_REDIST_REG_PIDR2_OFF:          return "GICR_PIDR2";
     234        case GIC_REDIST_SGI_PPI_REG_NSACR_OFF:      return "GICR_NSACR";
     235        case GIC_REDIST_SGI_PPI_REG_IGRPMODR0_OFF:  return "GICR_IGRPMODR0";
     236        case GIC_REDIST_SGI_PPI_REG_IGRPMODR1E_OFF: return "GICR_IGRPMODR1E";
     237        case GIC_REDIST_SGI_PPI_REG_IGRPMODR2E_OFF: return "GICR_IGRPMODR2E";
    206238        default:
    207239            return "<UNKNOWN>";
    208240    }
    209241}
    210 #endif
     242#endif /* LOG_ENABLED */
    211243
    212244
     
    23882420    }
    23892421
    2390     AssertReleaseMsgFailed(("offReg=%#x\n",  offReg));
     2422    AssertReleaseMsgFailed(("offReg=%#x (%s)\n", offReg, gicReDistGetSgiPpiRegDescription(offReg)));
    23912423    *puValue = 0;
    23922424    return VINF_SUCCESS;
     
    24152447            break;
    24162448        default:
    2417             AssertReleaseMsgFailed(("offReg=%#x uValue=%#RX32\n", offReg, uValue));
     2449            AssertReleaseMsgFailed(("offReg=%#x (%s) uValue=%#RX32\n", offReg, gicReDistGetRegDescription(offReg), uValue));
    24182450            break;
    24192451    }
     
    25102542    }
    25112543
    2512     AssertReleaseMsgFailed(("offReg=%#RX16\n", offReg));
     2544    AssertReleaseMsgFailed(("offReg=%#RX16 (%s)\n", offReg, gicReDistGetSgiPpiRegDescription(offReg)));
    25132545    return VERR_INTERNAL_ERROR_2;
    25142546}
     
    30213053 *
    30223054 * @param   pDevIns     The device instance.
     3055 * @remarks This is also called during VM reset, so do NOT remove values that are
     3056 *          cleared to zero!
    30233057 */
    30243058static void gicInit(PPDMDEVINS pDevIns)
     
    30513085 * @param   pDevIns     The device instance.
    30523086 * @param   pVCpu       The cross context virtual CPU structure.
     3087 * @remarks This is also called during VM reset, so do NOT remove values that are
     3088 *          cleared to zero!
    30533089 */
    30543090static void gicInitCpu(PPDMDEVINS pDevIns, PVMCPUCC pVCpu)
  • trunk/src/VBox/VMM/VMMAll/GITSAll.cpp

    r108765 r108767  
    178178        }
    179179
     180        case GITS_CTRL_REG_CBASER_OFF:
     181            *puValue = pGitsDev->uCmdBaseReg.s.Lo;
     182            break;
     183
     184        case GITS_CTRL_REG_CBASER_OFF + 4:
     185            *puValue = pGitsDev->uCmdBaseReg.s.Hi;
     186            break;
     187
    180188        default:
    181189            AssertReleaseMsgFailed(("offReg=%#x (%s)\n", offReg, gitsGetCtrlRegDescription(offReg)));
     
    219227            break;
    220228
     229        case GITS_CTRL_REG_CBASER_OFF:
     230            pGitsDev->uCmdBaseReg.s.Lo = uValue & RT_LO_U32(GITS_CTRL_REG_CBASER_RW_MASK);
     231            break;
     232
     233        case GITS_CTRL_REG_CBASER_OFF + 4:
     234            pGitsDev->uCmdBaseReg.s.Hi = uValue & RT_HI_U32(GITS_CTRL_REG_CBASER_RW_MASK);
     235            break;
     236
     237        case GITS_CTRL_REG_CWRITER_OFF:
     238            pGitsDev->uCmdWriteReg = uValue & RT_LO_U32(GITS_CTRL_REG_CWRITER_RW_MASK);
     239            break;
     240
     241        case GITS_CTRL_REG_CWRITER_OFF + 4:
     242            /* Upper 32-bits are all reserved, ignore write. Fedora 40 arm64 writes does this and probably other guests. */
     243            Assert(uValue == 0);
     244            break;
     245
    221246        default:
    222247            AssertReleaseMsgFailed(("offReg=%#x (%s) uValue=%#RX32\n", offReg, gitsGetCtrlRegDescription(offReg), uValue));
     
    244269    pGitsDev->fQuiescent            = true;
    245270    RT_ZERO(pGitsDev->aItsTableRegs);
     271    pGitsDev->uCmdBaseReg.u         = 0;
    246272}
    247273
  • trunk/src/VBox/VMM/include/GITSInternal.h

    r108762 r108767  
    8888    /** The ITS table descriptor registers. */
    8989    RTUINT64U               aItsTableRegs[8];
     90    /** The ITS command queue base registers. */
     91    RTUINT64U               uCmdBaseReg;
     92    /** The ITS command write register. */
     93    uint32_t                uCmdWriteReg;
     94    /** The ITS command read register. */
     95    uint32_t                uCmdReadReg;
    9096    /** @} */
    9197
     
    107113typedef GITSDEV const *PCGITSDEV;
    108114AssertCompileSizeAlignment(GITSDEV, 8);
     115AssertCompileMemberAlignment(GITSDEV, uArchRev, 8);
    109116
    110117DECL_HIDDEN_CALLBACK(void)         gitsInit(PGITSDEV pGitsDev);
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