VirtualBox

Changeset 81961 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Nov 18, 2019 7:06:25 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134758
Message:

DevHPET,PDM: Split structures and refactored registration. bugref:9218

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevHPET.cpp

    r81959 r81961  
    239239
    240240/**
    241  * The shared HPET state.
     241 * The shared HPET device state.
    242242 */
    243243typedef struct HPET
    244244{
    245     /** The HPET helpers - R3 Ptr. */
    246     PCPDMHPETHLPR3              pHpetHlpR3;
    247     /** The HPET helpers - R0 Ptr. */
    248     PCPDMHPETHLPR0              pHpetHlpR0;
    249     /** The HPET helpers - RC Ptr. */
    250     PCPDMHPETHLPRC              pHpetHlpRC;
    251     uint32_t                    u32Padding;
    252 
    253245    /** Timer structures. */
    254246    HPETTIMER                   aTimers[RT_MAX(HPET_NUM_TIMERS_PIIX, HPET_NUM_TIMERS_ICH9)];
     
    288280
    289281
     282/**
     283 * The ring-3 specific HPET device state.
     284 */
     285typedef struct HPETR3
     286{
     287    /** The HPET helpers. */
     288    PCPDMHPETHLPR3              pHpetHlp;
     289} HPETR3;
     290/** Pointer to the ring-3 specific HPET device state. */
     291typedef HPETR3 *PHPETR3;
     292
     293
     294/**
     295 * The ring-0 specific HPET device state.
     296 */
     297typedef struct HPETR0
     298{
     299    /** The HPET helpers. */
     300    PCPDMHPETHLPR0              pHpetHlp;
     301} HPETR0;
     302/** Pointer to the ring-0 specific HPET device state. */
     303typedef HPETR0 *PHPETR0;
     304
     305
     306/**
     307 * The raw-mode specific HPET device state.
     308 */
     309typedef struct HPETRC
     310{
     311    /** The HPET helpers. */
     312    PCPDMHPETHLPRC              pHpetHlp;
     313} HPETRC;
     314/** Pointer to the raw-mode specific HPET device state. */
     315typedef HPETRC *PHPETRC;
     316
     317
     318/** The HPET device state specific to the current context. */
     319typedef CTX_SUFF(HPET) HPETCC;
     320/** Pointer to the HPET device state specific to the current context. */
     321typedef CTX_SUFF(PHPET) PHPETCC;
     322
     323
    290324#ifndef VBOX_DEVICE_STRUCT_TESTCASE
    291325
     
    754788             * may request retry in R3 - so we must keep state intact.
    755789             */
    756             if (   ((iOldValue ^ u32NewValue) & HPET_CFG_LEGACY)
    757                 && pThis->pHpetHlpR3 != NIL_RTR3PTR)
     790            if ((iOldValue ^ u32NewValue) & HPET_CFG_LEGACY)
    758791            {
    759792#ifdef IN_RING3
    760                 rc = pThis->pHpetHlpR3->pfnSetLegacyMode(pDevIns, RT_BOOL(u32NewValue & HPET_CFG_LEGACY));
    761                 if (rc != VINF_SUCCESS)
     793                PHPETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
     794                if (pThisCC->pHpetHlp != NULL)
     795                {
     796                    rc = pThisCC->pHpetHlp->pfnSetLegacyMode(pDevIns, RT_BOOL(u32NewValue & HPET_CFG_LEGACY));
     797                    if (rc != VINF_SUCCESS)
     798                    {
     799                        DEVHPET_UNLOCK_BOTH(pDevIns, pThis);
     800                        break;
     801                    }
     802                }
    762803#else
    763804                rc = VINF_IOM_R3_MMIO_WRITE;
     805                DEVHPET_UNLOCK_BOTH(pDevIns, pThis);
     806                break;
    764807#endif
    765                 {
    766                     DEVHPET_UNLOCK_BOTH(pDevIns, pThis);
    767                     break;
    768                 }
    769808            }
    770809
     
    10411080           level-triggered mode yet. */
    10421081        if ((pHpetTimer->u64Config & HPET_TN_INT_TYPE) == HPET_TIMER_TYPE_EDGE)
    1043             pThis->pHpetHlpR3->pfnSetIrq(pDevIns, irq, PDM_IRQ_LEVEL_FLIP_FLOP);
     1082        {
     1083            PHPETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
     1084            AssertReturnVoid(pThisCC);
     1085            pThisCC->pHpetHlp->pfnSetIrq(pDevIns, irq, PDM_IRQ_LEVEL_FLIP_FLOP);
     1086        }
    10441087        else
    10451088            AssertFailed();
     
    12681311static DECLCALLBACK(void) hpetR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
    12691312{
    1270     PHPET pThis = PDMDEVINS_2_DATA(pDevIns, PHPET);
     1313    PHPETRC pThisRC = PDMINS_2_DATA_RC(pDevIns, PHPETRC);
    12711314    LogFlow(("hpetR3Relocate:\n"));
    1272     NOREF(offDelta);
    1273 
    1274     pThis->pHpetHlpRC   = pThis->pHpetHlpR3->pfnGetRCHelpers(pDevIns);
     1315
     1316    pThisRC->pHpetHlp += offDelta;
    12751317}
    12761318
     
    12811323static DECLCALLBACK(void) hpetR3Reset(PPDMDEVINS pDevIns)
    12821324{
    1283     PHPET pThis = PDMDEVINS_2_DATA(pDevIns, PHPET);
     1325    PHPET   pThis   = PDMDEVINS_2_DATA(pDevIns, PHPET);
     1326    PHPETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
    12841327    LogFlow(("hpetR3Reset:\n"));
    12851328
     
    13351378     * Notify the PIT/RTC devices.
    13361379     */
    1337     if (pThis->pHpetHlpR3)
    1338         pThis->pHpetHlpR3->pfnSetLegacyMode(pDevIns, false /*fActive*/);
     1380    if (pThisCC->pHpetHlp)
     1381        pThisCC->pHpetHlp->pfnSetLegacyMode(pDevIns, false /*fActive*/);
    13391382}
    13401383
     
    13471390    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    13481391    PHPET           pThis   = PDMDEVINS_2_DATA(pDevIns, PHPET);
     1392    PHPETCC         pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
    13491393    PCPDMDEVHLPR3   pHlp    = pDevIns->pHlpR3;
    13501394
     
    14091453    PDMHPETREG HpetReg;
    14101454    HpetReg.u32Version = PDM_HPETREG_VERSION;
    1411     rc = PDMDevHlpHPETRegister(pDevIns, &HpetReg, &pThis->pHpetHlpR3);
     1455    rc = PDMDevHlpHpetRegister(pDevIns, &HpetReg, &pThisCC->pHpetHlp);
    14121456    AssertRCReturn(rc, rc);
    14131457
     
    14211465    AssertRCReturn(rc, rc);
    14221466
    1423     if (pDevIns->fRCEnabled)
    1424     {
    1425         pThis->pHpetHlpRC = pThis->pHpetHlpR3->pfnGetRCHelpers(pDevIns);
    1426     }
    1427 
    1428     if (pDevIns->fR0Enabled)
    1429     {
    1430         pThis->pHpetHlpR0 = pThis->pHpetHlpR3->pfnGetR0Helpers(pDevIns);
    1431         AssertReturn(pThis->pHpetHlpR0 != NIL_RTR0PTR, VERR_INTERNAL_ERROR);
    1432     }
    1433 
    14341467    /*
    14351468     * Register SSM state and info item.
     
    14521485    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    14531486    PHPET   pThis   = PDMDEVINS_2_DATA(pDevIns, PHPET);
    1454     //PHPETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
     1487    PHPETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHPETCC);
    14551488
    14561489    int rc = PDMDevHlpSetDeviceCritSect(pDevIns, PDMDevHlpCritSectGetNop(pDevIns));
     1490    AssertRCReturn(rc, rc);
     1491
     1492    PDMHPETREG HpetReg;
     1493    HpetReg.u32Version = PDM_HPETREG_VERSION;
     1494    rc = PDMDevHlpHpetSetUpContext(pDevIns, &HpetReg, &pThisCC->pHpetHlp);
    14571495    AssertRCReturn(rc, rc);
    14581496
     
    14731511    /* .uReserved0 = */             0,
    14741512    /* .szName = */                 "hpet",
    1475     /* .fFlags = */                 PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ,
     1513    /* .fFlags = */                 PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ | PDM_DEVREG_FLAGS_NEW_STYLE,
    14761514    /* .fClass = */                 PDM_DEVREG_CLASS_PIT,
    14771515    /* .cMaxInstances = */          1,
    14781516    /* .uSharedVersion = */         42,
    14791517    /* .cbInstanceShared = */       sizeof(HPET),
    1480     /* .cbInstanceCC = */           0,
    1481     /* .cbInstanceRC = */           0,
     1518    /* .cbInstanceCC = */           sizeof(HPETCC),
     1519    /* .cbInstanceRC = */           sizeof(HPETRC),
    14821520    /* .cMaxPciDevices = */         0,
    14831521    /* .cMaxMsixVectors = */        0,
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