Changeset 40227 in vbox for trunk/src/VBox/HostDrivers
- Timestamp:
- Feb 23, 2012 11:15:37 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r38891 r40227 138 138 static void supdrvGipUpdatePerCpu(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, 139 139 RTCPUID idCpu, uint8_t idApic, uint64_t iTick); 140 static void supdrvGipInitCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pCpu, uint64_t u64NanoTS); 140 141 141 142 … … 5039 5040 uint16_t idApic = UINT16_MAX; 5040 5041 uint32_t i = 0; 5042 uint64_t u64NanoTS = 0; 5041 5043 5042 5044 AssertRelease(idCpu == RTMpCpuId()); … … 5059 5061 * Update the entry. 5060 5062 */ 5063 u64NanoTS = RTTimeSystemNanoTS() - pGip->u32UpdateIntervalNS; 5061 5064 i = supdrvGipCpuIndexFromCpuId(pGip, idCpu); 5065 supdrvGipInitCpu(pGip, &pGip->aCPUs[i], u64NanoTS); 5062 5066 idApic = ASMGetApicId(); 5063 5067 ASMAtomicUoWriteU16(&pGip->aCPUs[i].idApic, idApic); … … 5113 5117 * @param idCpu The cpu it applies to. 5114 5118 * @param pvUser Pointer to the device extension. 5119 * 5120 * @remarks This function -must- fire on the newly online'd CPU for the 5121 * RTMPEVENT_ONLINE case and can fire on any CPU for the 5122 * RTMPEVENT_OFFLINE case. 5115 5123 */ 5116 5124 static DECLCALLBACK(void) supdrvGipMpEvent(RTMPEVENT enmEvent, RTCPUID idCpu, void *pvUser) … … 5119 5127 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip; 5120 5128 5121 AssertRelease(idCpu == RTMpCpuId());5122 5129 AssertRelease(!RTThreadPreemptIsEnabled(NIL_RTTHREAD)); 5123 5130 … … 5130 5137 { 5131 5138 case RTMPEVENT_ONLINE: 5139 AssertRelease(idCpu == RTMpCpuId()); 5132 5140 supdrvGipMpEventOnline(pGip, idCpu); 5133 5141 break; … … 5328 5336 } 5329 5337 5338 5339 /** 5340 * Initializes per-CPU GIP information. 5341 * 5342 * @param pGip Pointer to the read-write kernel mapping of the GIP. 5343 * @param pCpu Pointer to which GIP CPU to initalize. 5344 * @param u64NanoTS The current nanosecond timestamp. 5345 */ 5346 static void supdrvGipInitCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pCpu, uint64_t u64NanoTS) 5347 { 5348 pCpu->u32TransactionId = 2; 5349 pCpu->u64NanoTS = u64NanoTS; 5350 pCpu->u64TSC = ASMReadTSC(); 5351 5352 pCpu->enmState = SUPGIPCPUSTATE_INVALID; 5353 pCpu->idCpu = NIL_RTCPUID; 5354 pCpu->iCpuSet = -1; 5355 pCpu->idApic = UINT16_MAX; 5356 5357 /* 5358 * We don't know the following values until we've executed updates. 5359 * So, we'll just pretend it's a 4 GHz CPU and adjust the history it on 5360 * the 2nd timer callout. 5361 */ 5362 pCpu->u64CpuHz = _4G + 1; /* tstGIP-2 depends on this. */ 5363 pCpu->u32UpdateIntervalTSC 5364 = pCpu->au32TSCHistory[0] 5365 = pCpu->au32TSCHistory[1] 5366 = pCpu->au32TSCHistory[2] 5367 = pCpu->au32TSCHistory[3] 5368 = pCpu->au32TSCHistory[4] 5369 = pCpu->au32TSCHistory[5] 5370 = pCpu->au32TSCHistory[6] 5371 = pCpu->au32TSCHistory[7] 5372 = (uint32_t)(_4G / pGip->u32UpdateHz); 5373 } 5330 5374 5331 5375 … … 5376 5420 5377 5421 for (i = 0; i < cCpus; i++) 5378 { 5379 pGip->aCPUs[i].u32TransactionId = 2; 5380 pGip->aCPUs[i].u64NanoTS = u64NanoTS; 5381 pGip->aCPUs[i].u64TSC = ASMReadTSC(); 5382 5383 pGip->aCPUs[i].enmState = SUPGIPCPUSTATE_INVALID; 5384 pGip->aCPUs[i].idCpu = NIL_RTCPUID; 5385 pGip->aCPUs[i].iCpuSet = -1; 5386 pGip->aCPUs[i].idApic = UINT16_MAX; 5387 5388 /* 5389 * We don't know the following values until we've executed updates. 5390 * So, we'll just pretend it's a 4 GHz CPU and adjust the history it on 5391 * the 2nd timer callout. 5392 */ 5393 pGip->aCPUs[i].u64CpuHz = _4G + 1; /* tstGIP-2 depends on this. */ 5394 pGip->aCPUs[i].u32UpdateIntervalTSC 5395 = pGip->aCPUs[i].au32TSCHistory[0] 5396 = pGip->aCPUs[i].au32TSCHistory[1] 5397 = pGip->aCPUs[i].au32TSCHistory[2] 5398 = pGip->aCPUs[i].au32TSCHistory[3] 5399 = pGip->aCPUs[i].au32TSCHistory[4] 5400 = pGip->aCPUs[i].au32TSCHistory[5] 5401 = pGip->aCPUs[i].au32TSCHistory[6] 5402 = pGip->aCPUs[i].au32TSCHistory[7] 5403 = /*pGip->aCPUs[i].u64CpuHz*/ (uint32_t)(_4G / uUpdateHz); 5404 } 5422 supdrvGipInitCpu(pGip, &pGip->aCPUs[i], u64NanoTS); 5405 5423 5406 5424 /*
Note:
See TracChangeset
for help on using the changeset viewer.