Changeset 37538 in vbox
- Timestamp:
- Jun 17, 2011 12:59:37 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevHPET.cpp
r37537 r37538 49 49 #define HPET_NUM_TIMERS_ICH9 4 50 50 51 /* 52 * 10000000 femtoseconds == 10ns 53 */ 54 #define HPET_CLK_PERIOD 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). 58 58 */ 59 59 #define HPET_CLK_PERIOD_ICH9 UINT32_C(69841279) … … 107 107 /** Extract the timer count from the capabilities. 108 108 * @todo Check if the mask is correct. */ 109 #define HPET_CAP_GET_TIMERS(a_u 64) ( ((a_u64) >> 8) & 0xf )109 #define HPET_CAP_GET_TIMERS(a_u32) ( ((a_u32) >> 8) & 0xf ) 110 110 111 111 /** The version of the saved state. */ … … 231 231 * @{ */ 232 232 /** Capabilities. */ 233 uint64_t u64Capabilities; 233 uint32_t u32Capabilities; 234 /** HPET_PERIOD - . */ 235 uint32_t u32Period; 234 236 /** Configuration. */ 235 237 uint64_t u64HpetConfig; … … 277 279 DECLINLINE(uint64_t) hpetTicksToNs(HpetState *pThis, uint64_t value) 278 280 { 279 return (ASMMultU64ByU32DivByU32(value, (uint32_t)(pThis->u64Capabilities >> 32), FS_PER_NS));281 return ASMMultU64ByU32DivByU32(value, pThis->u32Period, FS_PER_NS); 280 282 } 281 283 282 284 DECLINLINE(uint64_t) nsToHpetTicks(HpetState const *pThis, uint64_t u64Value) 283 285 { 284 return (ASMMultU64ByU32DivByU32(u64Value, FS_PER_NS, (uint32_t)(pThis->u64Capabilities >> 32)));286 return ASMMultU64ByU32DivByU32(u64Value, FS_PER_NS, pThis->u32Period); 285 287 } 286 288 … … 404 406 { 405 407 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; 407 409 if (u64Period > 0 && u64Period < u32Freq) 408 410 TMTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pTimer), u32Freq / (uint32_t)u64Period); … … 429 431 Assert(PDMCritSectIsOwner(&pThis->csLock)); 430 432 431 if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u 64Capabilities))433 if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u32Capabilities)) 432 434 { 433 435 static unsigned s_cOccurences = 0; … … 497 499 Assert(!PDMCritSectIsOwner(&pThis->csLock) || TMTimerIsLockOwner(pThis->aTimers[0].CTX_SUFF(pTimer))); 498 500 499 if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u 64Capabilities))501 if (iTimerNo >= HPET_CAP_GET_TIMERS(pThis->u32Capabilities)) 500 502 { 501 503 LogRel(("HPET: using timer above configured range: %d\n", iTimerNo)); … … 637 639 case HPET_ID: 638 640 DEVHPET_LOCK_RETURN(pThis, VINF_IOM_HC_MMIO_READ); 639 u32Value = (uint32_t)pThis->u64Capabilities;641 u32Value = pThis->u32Capabilities; 640 642 DEVHPET_UNLOCK(pThis); 641 643 Log(("read HPET_ID: %#x\n", u32Value)); … … 644 646 case HPET_PERIOD: 645 647 DEVHPET_LOCK_RETURN(pThis, VINF_IOM_HC_MMIO_READ); 646 u32Value = (uint32_t)(pThis->u64Capabilities >> 32);648 u32Value = pThis->u32Period; 647 649 DEVHPET_UNLOCK(pThis); 648 650 Log(("read HPET_PERIOD: %#x\n", u32Value)); … … 754 756 pThis->u64HpetConfig = hpetUpdateMasked(u32NewValue, iOldValue, HPET_CFG_WRITE_MASK); 755 757 756 uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u 64Capabilities);758 uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u32Capabilities); 757 759 if (hpetBitJustSet(iOldValue, u32NewValue, HPET_CFG_ENABLE)) 758 760 { … … 1115 1117 " legacy-mode=%s timer-count=%u\n", 1116 1118 pThis->u64HpetConfig, pThis->u64Isr, 1117 pThis->u64HpetOffset, pThis->u64HpetCounter, RT_HI_U32(pThis->u64Capabilities),1119 pThis->u64HpetOffset, pThis->u64HpetCounter, pThis->u32Period, 1118 1120 !!(pThis->u64HpetConfig & HPET_CFG_LEGACY) ? "on " : "off", 1119 HPET_CAP_GET_TIMERS(pThis->u 64Capabilities));1121 HPET_CAP_GET_TIMERS(pThis->u32Capabilities)); 1120 1122 pHlp->pfnPrintf(pHlp, 1121 1123 "Timers:\n"); … … 1141 1143 HpetState *pThis = PDMINS_2_DATA(pDevIns, HpetState *); 1142 1144 1143 SSMR3PutU8(pSSM, HPET_CAP_GET_TIMERS(pThis->u 64Capabilities));1145 SSMR3PutU8(pSSM, HPET_CAP_GET_TIMERS(pThis->u32Capabilities)); 1144 1146 1145 1147 return VINF_SSM_DONT_CALL_AGAIN; … … 1162 1164 * The state. 1163 1165 */ 1164 uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u 64Capabilities);1166 uint32_t const cTimers = HPET_CAP_GET_TIMERS(pThis->u32Capabilities); 1165 1167 for (uint32_t iTimer = 0; iTimer < cTimers; iTimer++) 1166 1168 { … … 1175 1177 1176 1178 SSMR3PutU64(pSSM, pThis->u64HpetOffset); 1177 SSMR3PutU64(pSSM, pThis->u64Capabilities); 1179 uint64_t u64CapPer = RT_MAKE_U64(pThis->u32Capabilities, pThis->u32Period); 1180 SSMR3PutU64(pSSM, u64CapPer); 1178 1181 SSMR3PutU64(pSSM, pThis->u64HpetConfig); 1179 1182 SSMR3PutU64(pSSM, pThis->u64Isr); … … 1225 1228 1226 1229 SSMR3GetU64(pSSM, &pThis->u64HpetOffset); 1227 uint64_t u64Cap abilities;1228 SSMR3GetU64(pSSM, &u64Cap abilities);1230 uint64_t u64CapPer; 1231 SSMR3GetU64(pSSM, &u64CapPer); 1229 1232 SSMR3GetU64(pSSM, &pThis->u64HpetConfig); 1230 1233 SSMR3GetU64(pSSM, &pThis->u64Isr); … … 1232 1235 if (RT_FAILURE(rc)) 1233 1236 return rc; 1234 if (HPET_CAP_GET_TIMERS( u64Capabilities) != cTimers)1237 if (HPET_CAP_GET_TIMERS(RT_LO_U32(u64CapPer)) != cTimers) 1235 1238 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); 1238 1242 1239 1243 /* … … 1248 1252 { 1249 1253 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; 1251 1255 if (u64Period > 0 && u64Period < u32Freq) 1252 1256 TMTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pTimer), u32Freq / (uint32_t)u64Period); … … 1324 1328 pThis->u64HpetOffset = 0; 1325 1329 1326 uint32_t u32Vendor = 0x8086;1327 1330 /* 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 */ 1331 1334 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; 1333 1336 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 */ 1335 1339 AssertCompile(HPET_NUM_TIMERS_ICH9 <= RT_ELEMENTS(pThis->aTimers)); 1336 1340 AssertCompile(HPET_NUM_TIMERS_PIIX <= RT_ELEMENTS(pThis->aTimers)); 1337 1341 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; 1340 1343 1341 1344 /*
Note:
See TracChangeset
for help on using the changeset viewer.