Changeset 53800 in vbox for trunk/src/VBox/HostDrivers
- Timestamp:
- Jan 14, 2015 12:51:28 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 97608
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r53568 r53800 137 137 # define DO_NOT_START_GIP 138 138 #endif 139 140 /** Whether the application of TSC-deltas is required. */141 #define GIP_ARE_TSC_DELTAS_APPLICABLE(a_pDevExt) \142 ((a_pDevExt)->pGip->u32Mode == SUPGIPMODE_INVARIANT_TSC && !((a_pDevExt)->fOsTscDeltasInSync))143 144 139 145 140 /******************************************************************************* … … 5896 5891 static int supdrvTscDeltaThreadInit(PSUPDRVDEVEXT pDevExt) 5897 5892 { 5898 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pDevExt ));5893 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pDevExt->pGip)); 5899 5894 5900 5895 int rc = RTSpinlockCreate(&pDevExt->hTscDeltaSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, "VBoxTscSpnLck"); … … 6078 6073 ASMSetFlags(uFlags); 6079 6074 6080 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6075 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6081 6076 { 6082 6077 int rc; … … 6156 6151 u64NanoTS = RTTimeSystemNanoTS(); 6157 6152 ASMSetFlags(uFlags); 6158 SUPTscDeltaApply(pGip, &u64Tsc, idApic, &fDeltaApplied); 6153 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6154 SUPTscDeltaApply(pGip, &u64Tsc, idApic, &fDeltaApplied); 6159 6155 u64DeltaNanoTS = u64NanoTS - pDevExt->u64NanoTSAnchor; 6160 6156 u64DeltaTsc = u64Tsc - pDevExt->u64TscAnchor; … … 6230 6226 pDevExt->u64NanoTSAnchor = RTTimeSystemNanoTS(); 6231 6227 ASMSetFlags(uFlags); 6232 SUPTscDeltaApply(pGip, &pDevExt->u64TscAnchor, idApic, &fDeltaApplied); 6228 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6229 SUPTscDeltaApply(pGip, &pDevExt->u64TscAnchor, idApic, &fDeltaApplied); 6233 6230 6234 6231 #ifdef SUPDRV_USE_TSC_DELTA_THREAD … … 6333 6330 supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), RT_NS_1SEC / u32Interval /*=Hz*/, u32Interval, cCpus); 6334 6331 6335 if (RT_UNLIKELY( p DevExt->fOsTscDeltasInSync6332 if (RT_UNLIKELY( pGip->fOsTscDeltasInSync 6336 6333 && pGip->u32Mode == SUPGIPMODE_ASYNC_TSC 6337 6334 && !supdrvOSGetForcedAsyncTscMode(pDevExt))) … … 6343 6340 6344 6341 #ifdef SUPDRV_USE_TSC_DELTA_THREAD 6345 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6342 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6346 6343 { 6347 6344 /* Initialize TSC-delta measurement thread before executing any Mp event callbacks. */ … … 6359 6356 uint16_t iCpu; 6360 6357 #ifndef SUPDRV_USE_TSC_DELTA_THREAD 6361 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6358 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6362 6359 { 6363 6360 /* … … 6533 6530 u64NanoTS = RTTimeSystemNanoTS(); 6534 6531 6535 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6532 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6536 6533 { 6537 6534 /* … … 6678 6675 * update the state and it'll get serviced when the thread's listening interval times out. 6679 6676 */ 6680 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6677 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6681 6678 { 6682 6679 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock); … … 6737 6734 6738 6735 /* Reset the TSC delta, we will recalculate it lazily. */ 6739 if (GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))6736 if (GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 6740 6737 ASMAtomicWriteS64(&pGip->aCPUs[i].i64TSCDelta, INT64_MAX); 6741 6738 … … 7101 7098 pGipCpuWorker = &pGip->aCPUs[idxWorker]; 7102 7099 7103 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt));7100 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)); 7104 7101 7105 7102 if (pGipCpuWorker->idCpu == idMaster) … … 7162 7159 uint32_t cOnlineCpus = pGip->cOnlineCpus; 7163 7160 7164 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt));7161 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)); 7165 7162 7166 7163 /* … … 7410 7407 pCpu->u64TSC = ASMReadTSC(); 7411 7408 pCpu->u64TSCSample = GIP_TSC_DELTA_RSVD; 7412 pCpu->i64TSCDelta = p DevExt->fOsTscDeltasInSync ? 0 : INT64_MAX;7409 pCpu->i64TSCDelta = pGip->fOsTscDeltasInSync ? 0 : INT64_MAX; 7413 7410 7414 7411 ASMAtomicWriteSize(&pCpu->enmState, SUPGIPCPUSTATE_INVALID); … … 7462 7459 * We only bother with TSC-deltas on invariant CPUs for now. 7463 7460 */ 7464 p DevExt->fOsTscDeltasInSync = supdrvIsInvariantTsc() && supdrvOSAreTscDeltasInSync();7461 pGip->fOsTscDeltasInSync = supdrvIsInvariantTsc() && supdrvOSAreTscDeltasInSync(); 7465 7462 7466 7463 /* … … 7879 7876 pGip = pDevExt->pGip; 7880 7877 7881 if (!GIP_ARE_TSC_DELTAS_APPLICABLE(p DevExt))7878 if (!GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)) 7882 7879 return VINF_SUCCESS; 7883 7880 … … 7951 7948 AssertReturn(pReq, VERR_INVALID_PARAMETER); 7952 7949 AssertReturn(pDevExt->pGip, VERR_INVALID_PARAMETER); 7950 7953 7951 pGip = pDevExt->pGip; 7952 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pGip)); 7954 7953 7955 7954 cTries = 4; … … 7973 7972 AssertMsgReturn(iCpu < pGip->cCpus, ("iCpu=%u cCpus=%u\n", iCpu, pGip->cCpus), VERR_INVALID_CPU_INDEX); 7974 7973 7975 Assert(GIP_ARE_TSC_DELTAS_APPLICABLE(pDevExt));7976 7974 rc2 = supdrvMeasureTscDeltaOne(pDevExt, iCpu); 7977 7975 if (RT_SUCCESS(rc2)) -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r53464 r53800 710 710 /** Aligned pointer to the TSC delta sync. struct. */ 711 711 PSUPTSCDELTASYNC pTscDeltaSync; 712 /** Whether the host OS has already normalized the hardware TSC deltas across713 * CPUs. */714 bool fOsTscDeltasInSync;715 712 /** @} */ 716 713
Note:
See TracChangeset
for help on using the changeset viewer.