VirtualBox

Changeset 37538 in vbox


Ignore:
Timestamp:
Jun 17, 2011 12:59:37 PM (14 years ago)
Author:
vboxsync
Message:

DevHPET: Split the u64Capabilities into u32Capabilities and u32Period.

File:
1 edited

Legend:

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

    r37537 r37538  
    4949#define HPET_NUM_TIMERS_ICH9        4
    5050
    51 /*
    52  * 10000000 femtoseconds == 10ns
    53  */
    54 #define HPET_CLK_PERIOD             UINT32_C(10000000)
    55 
    56 /*
    57  * 69841279 femtoseconds == 69.84 ns (1 / 14.31818MHz)
     51/** HPET clock period for PIIX4 / PIIX3.
     52 * 10000000 femtoseconds == 10ns.
     53 */
     54#define HPET_CLK_PERIOD_PIIX        UINT32_C(10000000)
     55
     56/** HPET clock period for ICH9.
     57 * 69841279 femtoseconds == 69.84 ns (1 / 14.31818MHz).
    5858 */
    5959#define HPET_CLK_PERIOD_ICH9        UINT32_C(69841279)
     
    107107/** Extract the timer count from the capabilities.
    108108 * @todo Check if the mask is correct.  */
    109 #define HPET_CAP_GET_TIMERS(a_u64)          ( ((a_u64) >> 8) & 0xf )
     109#define HPET_CAP_GET_TIMERS(a_u32)          ( ((a_u32) >> 8) & 0xf )
    110110
    111111/** The version of the saved state. */
     
    231231     * @{ */
    232232    /** Capabilities. */
    233     uint64_t             u64Capabilities;
     233    uint32_t             u32Capabilities;
     234    /** HPET_PERIOD - . */
     235    uint32_t             u32Period;
    234236    /** Configuration. */
    235237    uint64_t             u64HpetConfig;
     
    277279DECLINLINE(uint64_t) hpetTicksToNs(HpetState *pThis, uint64_t value)
    278280{
    279     return (ASMMultU64ByU32DivByU32(value,  (uint32_t)(pThis->u64Capabilities >> 32), FS_PER_NS));
     281    return ASMMultU64ByU32DivByU32(value,  pThis->u32Period, FS_PER_NS);
    280282}
    281283
    282284DECLINLINE(uint64_t) nsToHpetTicks(HpetState const *pThis, uint64_t u64Value)
    283285{
    284     return (ASMMultU64ByU32DivByU32(u64Value, FS_PER_NS, (uint32_t)(pThis->u64Capabilities >> 32)));
     286    return ASMMultU64ByU32DivByU32(u64Value, FS_PER_NS, pThis->u32Period);
    285287}
    286288
     
    404406    {
    405407        uint64_t const u64Period = pHpetTimer->u64Period;
    406         uint32_t const u32Freq   = RT_HI_U32(pHpetTimer->CTX_SUFF(pHpet)->u64Capabilities);
     408        uint32_t const u32Freq   = pHpetTimer->CTX_SUFF(pHpet)->u32Period;
    407409        if (u64Period > 0 && u64Period < u32Freq)
    408410            TMTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pTimer), u32Freq / (uint32_t)u64Period);
     
    429431    Assert(PDMCritSectIsOwner(&pThis->csLock));
    430432
    431     if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u64Capabilities))
     433    if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u32Capabilities))
    432434    {
    433435        static unsigned s_cOccurences = 0;
     
    497499    Assert(!PDMCritSectIsOwner(&pThis->csLock) || TMTimerIsLockOwner(pThis->aTimers[0].CTX_SUFF(pTimer)));
    498500
    499     if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u64Capabilities))
     501    if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u32Capabilities))
    500502    {
    501503        LogRel(("HPET: using timer above configured range: %d\n", iTimerNo));
     
    637639        case HPET_ID:
    638640            DEVHPET_LOCK_RETURN(pThis, VINF_IOM_HC_MMIO_READ);
    639             u32Value = (uint32_t)pThis->u64Capabilities;
     641            u32Value = pThis->u32Capabilities;
    640642            DEVHPET_UNLOCK(pThis);
    641643            Log(("read HPET_ID: %#x\n", u32Value));
     
    644646        case HPET_PERIOD:
    645647            DEVHPET_LOCK_RETURN(pThis, VINF_IOM_HC_MMIO_READ);
    646             u32Value = (uint32_t)(pThis->u64Capabilities >> 32);
     648            u32Value = pThis->u32Period;
    647649            DEVHPET_UNLOCK(pThis);
    648650            Log(("read HPET_PERIOD: %#x\n", u32Value));
     
    754756            pThis->u64HpetConfig = hpetUpdateMasked(u32NewValue, iOldValue, HPET_CFG_WRITE_MASK);
    755757
    756             uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u64Capabilities);
     758            uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u32Capabilities);
    757759            if (hpetBitJustSet(iOldValue, u32NewValue, HPET_CFG_ENABLE))
    758760            {
     
    11151117                    " legacy-mode=%s  timer-count=%u\n",
    11161118                    pThis->u64HpetConfig, pThis->u64Isr,
    1117                     pThis->u64HpetOffset, pThis->u64HpetCounter, RT_HI_U32(pThis->u64Capabilities),
     1119                    pThis->u64HpetOffset, pThis->u64HpetCounter, pThis->u32Period,
    11181120                    !!(pThis->u64HpetConfig & HPET_CFG_LEGACY) ? "on " : "off",
    1119                     HPET_CAP_GET_TIMERS(pThis->u64Capabilities));
     1121                    HPET_CAP_GET_TIMERS(pThis->u32Capabilities));
    11201122    pHlp->pfnPrintf(pHlp,
    11211123                    "Timers:\n");
     
    11411143    HpetState *pThis = PDMINS_2_DATA(pDevIns, HpetState *);
    11421144
    1143     SSMR3PutU8(pSSM, HPET_CAP_GET_TIMERS(pThis->u64Capabilities));
     1145    SSMR3PutU8(pSSM, HPET_CAP_GET_TIMERS(pThis->u32Capabilities));
    11441146
    11451147    return VINF_SSM_DONT_CALL_AGAIN;
     
    11621164     * The state.
    11631165     */
    1164     uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u64Capabilities);
     1166    uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u32Capabilities);
    11651167    for (uint32_t iTimer = 0; iTimer < cTimers; iTimer++)
    11661168    {
     
    11751177
    11761178    SSMR3PutU64(pSSM, pThis->u64HpetOffset);
    1177     SSMR3PutU64(pSSM, pThis->u64Capabilities);
     1179    uint64_t u64CapPer = RT_MAKE_U64(pThis->u32Capabilities, pThis->u32Period);
     1180    SSMR3PutU64(pSSM, u64CapPer);
    11781181    SSMR3PutU64(pSSM, pThis->u64HpetConfig);
    11791182    SSMR3PutU64(pSSM, pThis->u64Isr);
     
    12251228
    12261229    SSMR3GetU64(pSSM, &pThis->u64HpetOffset);
    1227     uint64_t u64Capabilities;
    1228     SSMR3GetU64(pSSM, &u64Capabilities);
     1230    uint64_t u64CapPer;
     1231    SSMR3GetU64(pSSM, &u64CapPer);
    12291232    SSMR3GetU64(pSSM, &pThis->u64HpetConfig);
    12301233    SSMR3GetU64(pSSM, &pThis->u64Isr);
     
    12321235    if (RT_FAILURE(rc))
    12331236        return rc;
    1234     if (HPET_CAP_GET_TIMERS(u64Capabilities) != cTimers)
     1237    if (HPET_CAP_GET_TIMERS(RT_LO_U32(u64CapPer)) != cTimers)
    12351238        return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Capabilities does not match timer count: cTimers=%#x caps=%#x"),
    1236                                 cTimers, HPET_CAP_GET_TIMERS(u64Capabilities));
    1237     pThis->u64Capabilities = u64Capabilities;
     1239                                cTimers, (unsigned)HPET_CAP_GET_TIMERS(u64CapPer));
     1240    pThis->u32Capabilities  = RT_LO_U32(u64CapPer);
     1241    pThis->u32Period        = RT_HI_U32(u64CapPer);
    12381242
    12391243    /*
     
    12481252        {
    12491253            uint64_t const u64Period = pHpetTimer->u64Period;
    1250             uint32_t const u32Freq   = RT_HI_U32(pHpetTimer->CTX_SUFF(pHpet)->u64Capabilities);
     1254            uint32_t const u32Freq   = pHpetTimer->CTX_SUFF(pHpet)->u32Period;
    12511255            if (u64Period > 0 && u64Period < u32Freq)
    12521256                TMTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pTimer), u32Freq / (uint32_t)u64Period);
     
    13241328    pThis->u64HpetOffset  = 0;
    13251329
    1326     uint32_t u32Vendor = 0x8086;
    13271330    /* 64-bit main counter; 3 timers supported; LegacyReplacementRoute. */
    1328     uint32_t u32Caps = (1 << 15)              /* LEG_RT_CAP       - LegacyReplacementRoute capable. */
    1329                      | (1 << 13)              /* COUNTER_SIZE_CAP - Main counter is 64-bit capable. */
    1330                      | 1;                     /* REV_ID           - Revision, must not be 0 */
     1331    pThis->u32Capabilities = (1 << 15)        /* LEG_RT_CAP       - LegacyReplacementRoute capable. */
     1332                           | (1 << 13)        /* COUNTER_SIZE_CAP - Main counter is 64-bit capable. */
     1333                           | 1;               /* REV_ID           - Revision, must not be 0 */
    13311334    if (pThis->fIch9)                         /* NUM_TIM_CAP      - Number of timers -1. */
    1332         u32Caps |= (HPET_NUM_TIMERS_ICH9 - 1) << 8;
     1335        pThis->u32Capabilities |= (HPET_NUM_TIMERS_ICH9 - 1) << 8;
    13331336    else
    1334         u32Caps |= (HPET_NUM_TIMERS_PIIX - 1) << 8;
     1337        pThis->u32Capabilities |= (HPET_NUM_TIMERS_PIIX - 1) << 8;
     1338    pThis->u32Capabilities |= UINT32_C(0x80860000); /* VENDOR */
    13351339    AssertCompile(HPET_NUM_TIMERS_ICH9 <= RT_ELEMENTS(pThis->aTimers));
    13361340    AssertCompile(HPET_NUM_TIMERS_PIIX <= RT_ELEMENTS(pThis->aTimers));
    13371341
    1338     pThis->u64Capabilities = (u32Vendor << 16) | u32Caps;
    1339     pThis->u64Capabilities |= ((uint64_t)(pThis->fIch9 ? HPET_CLK_PERIOD_ICH9 : HPET_CLK_PERIOD) << 32);
     1342    pThis->u32Period = pThis->fIch9 ? HPET_CLK_PERIOD_ICH9 : HPET_CLK_PERIOD_PIIX;
    13401343
    13411344    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette