VirtualBox

Changeset 107957 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jan 28, 2025 8:38:40 AM (3 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167204
Message:

VMM/GIC: bugref:10404 Some register renaming, minor bits.

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

Legend:

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

    r107929 r107957  
    300300
    301301/**
    302  * Updates the internal IRQ state and sets or clears the appropirate force action flags.
     302 * Updates the internal IRQ state and sets or clears the appropriate force action
     303 * flags.
    303304 *
    304305 * @returns Strict VBox status code.
     
    385386{
    386387    VMCPU_ASSERT_EMT(pVCpu);
    387     PGICDEV pThis  = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
     388    PGICDEV pThis = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
    388389
    389390    if (offReg >= GIC_DIST_REG_IROUTERn_OFF_START && offReg <= GIC_DIST_REG_IROUTERn_OFF_LAST)
     
    437438            AssertReleaseFailed();
    438439            break;
    439         case GIC_DIST_REG_IPRIORITYn_OFF_START:
    440         case GIC_DIST_REG_IPRIORITYn_OFF_START + 4: /* These are banked for the PEs and access the redistributor. */
     440        case GIC_DIST_REG_IPRIORITYRn_OFF_START:
     441        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 4: /* These are banked for the PEs and access the redistributor. */
    441442        {
    442443            PGICCPU pGicVCpu = VMCPU_TO_GICCPU(pVCpu);
    443444
    444445            /* Figure out the register which is written. */
    445             uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYn_OFF_START;
     446            uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYRn_OFF_START;
    446447            Assert(idxPrio <= RT_ELEMENTS(pThis->abIntPriority) - sizeof(uint32_t));
    447448
     
    453454            break;
    454455        }
    455         case GIC_DIST_REG_IPRIORITYn_OFF_START + 32: /* Only 32 lines for now. */
     456        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 32: /* Only 32 lines for now. */
    456457        {
    457458            /* Figure out the register which is written. */
    458             uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYn_OFF_START - 32;
     459            uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYRn_OFF_START - 32;
    459460            Assert(idxPrio <= RT_ELEMENTS(pThis->abIntPriority) - sizeof(uint32_t));
    460461
     
    491492            break;
    492493        case GIC_DIST_REG_PIDR2_OFF:
    493             *puValue = GIC_REDIST_REG_PIDR2_ARCH_REV_SET(GIC_REDIST_REG_PIDR2_ARCH_REV_GICV3);
     494            Assert(pThis->uArchRev <= GIC_DIST_REG_PIDR2_ARCH_REV_GICV4);
     495            *puValue = GIC_DIST_REG_PIDR2_ARCH_REV_SET(pThis->uArchRev);
    494496            break;
    495497        case GIC_DIST_REG_IIDR_OFF:
     
    519521{
    520522    VMCPU_ASSERT_EMT(pVCpu); RT_NOREF(pVCpu);
    521     PGICDEV pThis  = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
    522     PVMCC    pVM   = PDMDevHlpGetVM(pDevIns);
     523    PGICDEV pThis = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
     524    PVMCC   pVM   = PDMDevHlpGetVM(pDevIns);
    523525
    524526    if (offReg >= GIC_DIST_REG_IROUTERn_OFF_START && offReg <= GIC_DIST_REG_IROUTERn_OFF_LAST)
     
    586588            rcStrict = gicDistUpdateIrqState(pVM, pThis);
    587589            break;
    588         case GIC_DIST_REG_IPRIORITYn_OFF_START: /* These are banked for the PEs and access the redistributor. */
    589         case GIC_DIST_REG_IPRIORITYn_OFF_START + 4:
    590         case GIC_DIST_REG_IPRIORITYn_OFF_START + 8:
    591         case GIC_DIST_REG_IPRIORITYn_OFF_START + 12:
    592         case GIC_DIST_REG_IPRIORITYn_OFF_START + 16:
    593         case GIC_DIST_REG_IPRIORITYn_OFF_START + 20:
    594         case GIC_DIST_REG_IPRIORITYn_OFF_START + 24:
    595         case GIC_DIST_REG_IPRIORITYn_OFF_START + 28:
     590        case GIC_DIST_REG_IPRIORITYRn_OFF_START: /* These are banked for the PEs and access the redistributor. */
     591        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 4:
     592        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 8:
     593        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 12:
     594        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 16:
     595        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 20:
     596        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 24:
     597        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 28:
    596598        {
    597599            PGICCPU pGicVCpu = VMCPU_TO_GICCPU(pVCpu);
    598600
    599601            /* Figure out the register which is written. */
    600             uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYn_OFF_START;
     602            uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYRn_OFF_START;
    601603            Assert(idxPrio <= RT_ELEMENTS(pGicVCpu->abIntPriority) - sizeof(uint32_t));
    602604            for (uint32_t i = idxPrio; i < idxPrio + sizeof(uint32_t); i++)
     
    607609            break;
    608610        }
    609         case GIC_DIST_REG_IPRIORITYn_OFF_START + 32: /* Only 32 lines for now. */
    610         case GIC_DIST_REG_IPRIORITYn_OFF_START + 36:
    611         case GIC_DIST_REG_IPRIORITYn_OFF_START + 40:
    612         case GIC_DIST_REG_IPRIORITYn_OFF_START + 44:
    613         case GIC_DIST_REG_IPRIORITYn_OFF_START + 48:
    614         case GIC_DIST_REG_IPRIORITYn_OFF_START + 52:
    615         case GIC_DIST_REG_IPRIORITYn_OFF_START + 56:
    616         case GIC_DIST_REG_IPRIORITYn_OFF_START + 60:
     611        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 32: /* Only 32 lines for now. */
     612        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 36:
     613        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 40:
     614        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 44:
     615        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 48:
     616        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 52:
     617        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 56:
     618        case GIC_DIST_REG_IPRIORITYRn_OFF_START + 60:
    617619        {
    618620            /* Figure out the register which is written. */
    619             uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYn_OFF_START - 32;
     621            uint8_t idxPrio = offReg - GIC_DIST_REG_IPRIORITYRn_OFF_START - 32;
    620622            Assert(idxPrio <= RT_ELEMENTS(pThis->abIntPriority) - sizeof(uint32_t));
    621623            for (uint32_t i = idxPrio; i < idxPrio + sizeof(uint32_t); i++)
     
    686688DECLINLINE(VBOXSTRICTRC) gicReDistRegisterRead(PPDMDEVINS pDevIns, PVMCPUCC pVCpu, uint32_t idRedist, uint16_t offReg, uint32_t *puValue)
    687689{
    688     RT_NOREF(pDevIns);
     690    PGICDEV pThis = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
    689691
    690692    switch (offReg)
     
    702704            break;
    703705        case GIC_REDIST_REG_PIDR2_OFF:
    704             *puValue = GIC_REDIST_REG_PIDR2_ARCH_REV_SET(GIC_REDIST_REG_PIDR2_ARCH_REV_GICV3);
     706            Assert(pThis->uArchRev <= GIC_DIST_REG_PIDR2_ARCH_REV_GICV4);
     707            *puValue = GIC_REDIST_REG_PIDR2_ARCH_REV_SET(pThis->uArchRev);
    705708            break;
    706709        default:
     
    741744            *puValue = ASMAtomicReadU32(&pThis->bmIntActive);
    742745            break;
    743         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START:
    744         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START +  4:
    745         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START +  8:
    746         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 12:
    747         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 16:
    748         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 20:
    749         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 24:
    750         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 28:
     746        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START:
     747        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START +  4:
     748        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START +  8:
     749        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 12:
     750        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 16:
     751        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 20:
     752        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 24:
     753        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 28:
    751754        {
    752755            /* Figure out the register which is written. */
    753             uint8_t idxPrio = offReg - GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START;
     756            uint8_t idxPrio = offReg - GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START;
    754757            Assert(idxPrio <= RT_ELEMENTS(pThis->abIntPriority) - sizeof(uint32_t));
    755758
     
    875878            rcStrict = gicReDistUpdateIrqState(pThis, pVCpu);
    876879            break;
    877         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START:
    878         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START +  4:
    879         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START +  8:
    880         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 12:
    881         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 16:
    882         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 20:
    883         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 24:
    884         case GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START + 28:
     880        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START:
     881        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START +  4:
     882        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START +  8:
     883        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 12:
     884        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 16:
     885        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 20:
     886        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 24:
     887        case GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START + 28:
    885888        {
    886             /* Figure out the register whch is written. */
    887             uint8_t idxPrio = offReg - GIC_REDIST_SGI_PPI_REG_IPRIORITYn_OFF_START;
     889            /* Figure out the register which is written. */
     890            uint8_t idxPrio = offReg - GIC_REDIST_SGI_PPI_REG_IPRIORITYRn_OFF_START;
    888891            Assert(idxPrio <= RT_ELEMENTS(pThis->abIntPriority) - sizeof(uint32_t));
    889892            for (uint32_t i = idxPrio; i < idxPrio + sizeof(uint32_t); i++)
     
    14161419
    14171420    /*
    1418      * Determine the redistributor being targeted. Each redistributor takes GIC_REDIST_REG_FRAME_SIZE + GIC_REDIST_SGI_PPI_REG_FRAME_SIZE bytes
     1421     * Determine the redistributor being targeted. Each redistributor takes
     1422     * GIC_REDIST_REG_FRAME_SIZE + GIC_REDIST_SGI_PPI_REG_FRAME_SIZE bytes
    14191423     * and the redistributors are adjacent.
    14201424     */
     
    14561460
    14571461    /*
    1458      * Determine the redistributor being targeted. Each redistributor takes GIC_REDIST_REG_FRAME_SIZE + GIC_REDIST_SGI_PPI_REG_FRAME_SIZE bytes
     1462     * Determine the redistributor being targeted. Each redistributor takes
     1463     * GIC_REDIST_REG_FRAME_SIZE + GIC_REDIST_SGI_PPI_REG_FRAME_SIZE bytes
    14591464     * and the redistributors are adjacent.
    14601465     */
  • trunk/src/VBox/VMM/VMMR3/GICR3.cpp

    r107929 r107957  
    5050*   Defined Constants And Macros                                                                                                 *
    5151*********************************************************************************************************************************/
    52 /** Some ancient version... */
     52/** GIC saved state version. */
    5353#define GIC_SAVED_STATE_VERSION                     1
    5454
     
    396396     * Validate GIC settings.
    397397     */
    398     PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "DistributorMmioBase|RedistributorMmioBase|ItsMmioBase|ItLinesNumber", "");
     398    PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "DistributorMmioBase|RedistributorMmioBase|ItsMmioBase"
     399                                           "|ArchRev"
     400                                           "|ArchExtNmi"
     401                                           "|ItLinesNumber", "");
    399402
    400403#if 0
     
    407410    int rc;
    408411#endif
     412
     413    /** @devcfgm{gic, ArchRev, uint8_t, 3}
     414     * Configures the GIC architecture revision (GICD_PIDR2.ArchRev and
     415     * GICR_PIDR2.ArchRev).
     416     *
     417     * Currently we only support GICv3. */
     418    rc = pHlp->pfnCFGMQueryU8Def(pCfg, "ArchRev", &pGicDev->uArchRev, 3);
     419    AssertLogRelRCReturn(rc, rc);
     420    if (pGicDev->uArchRev == 3)
     421    { /* likely */ }
     422    else
     423        return PDMDevHlpVMSetError(pDevIns, VERR_INVALID_PARAMETER, RT_SRC_POS,
     424                                   N_("Configuration error: \"ArchRev\" %u is not supported"), pGicDev->uArchRev);
     425
     426    /** @devcfgm{gic, ArchExtNmi, bool, false}
     427     * Configures whether NMIs are supported (GICD_TYPER.NMI). */
     428    rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "ArchExtNmi", &pGicDev->fNmi, false);
     429    AssertLogRelRCReturn(rc, rc);
     430    if (   !pGicDev->fNmi
     431        || pGicDev->uArchRev >= 3)
     432    { /* likely */ }
     433    else
     434        return PDMDevHlpVMSetError(pDevIns, VERR_INVALID_PARAMETER, RT_SRC_POS,
     435                                   N_("Configuration error: \"ArchExtNmi\" requires architecture revision v3 or newer"));
    409436
    410437    /** @devcfgm{gic, ItLinesNumber, uint16_t, 1}
     
    413440     * For the INTID range 32-1023, configures the maximum SPI supported. Valid values
    414441     * are [1, 31] which equates to interrupt IDs [63, 1023]. A value of 0 indicates no
    415      * SPIs are supported, we do not allow configuring this value as it's expected most
     442     * SPIs are supported. We do not allow configuring this value as it's expected most
    416443     * guests would assume support for SPIs. */
    417444    rc = pHlp->pfnCFGMQueryU16Def(pCfg, "ItLinesNumber", &pGicDev->uItLinesNumber, 1 /* 63 interrupt IDs */);
  • trunk/src/VBox/VMM/include/GICInternal.h

    r107929 r107957  
    5656#endif
    5757
    58 #define VMCPU_TO_GICCPU(a_pVCpu)             (&(a_pVCpu)->gic.s)
    59 #define VM_TO_GIC(a_pVM)                     (&(a_pVM)->gic.s)
    60 #define VM_TO_GICDEV(a_pVM)                  CTX_SUFF(VM_TO_GIC(a_pVM)->pGicDev)
     58#define VMCPU_TO_GICCPU(a_pVCpu)            (&(a_pVCpu)->gic.s)
     59#define VM_TO_GIC(a_pVM)                    (&(a_pVM)->gic.s)
     60#define VM_TO_GICDEV(a_pVM)                 CTX_SUFF(VM_TO_GIC(a_pVM)->pGicDev)
    6161#ifdef IN_RING3
    6262# define VMCPU_TO_DEVINS(a_pVCpu)           ((a_pVCpu)->pVMR3->gic.s.pDevInsR3)
     
    105105    /** @name Configurables.
    106106     * @{ */
    107     /** The GICD_TYPER.ItsLinesNumber bits. */
     107    /** The maximum SPI supported (GICD_TYPER.ItsLinesNumber). */
    108108    uint16_t                    uItLinesNumber;
     109    /** The GIC architecture (GICD_PIDR2.ArchRev and GICR_PIDR2.ArchRev). */
     110    uint8_t                     uArchRev;
     111    /** Whether NMIs are supported (GICD_TYPER.NMI). */
     112    bool                        fNmi;
    109113    /** @} */
    110114} GICDEV;
     
    172176    /** The interrupt controller Binary Point Register for Group 1 interrupts. */
    173177    uint8_t                     bBinaryPointGrp1;
    174     /** The running poriorities caused by preemption. */
     178    /** The running priorities caused by preemption. */
    175179    volatile uint8_t            abRunningPriorities[256];
    176180    /** The index to the current running priority. */
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