Changeset 37414 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jun 10, 2011 3:53:59 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 72213
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/TMAll.cpp
r37324 r37414 802 802 { 803 803 return (PTMTIMERRC)MMHyperCCToRC(pTimer->CTX_SUFF(pVM), pTimer); 804 } 805 806 807 /** 808 * Locks the timer clock. 809 * 810 * @returns VINF_SUCCESS on success, @a rcBusy if busy, and VERR_NOT_SUPPORTED 811 * if the clock does not have a lock. 812 * @param pTimer The timer which clock lock we wish to take. 813 * @param rcBusy What to return in ring-0 and raw-mode context 814 * if the lock is busy. 815 * 816 * @remarks Currently only supported on timers using the virtual sync clock. 817 */ 818 VMMDECL(int) TMTimerLock(PTMTIMER pTimer, int rcBusy) 819 { 820 AssertPtr(pTimer); 821 AssertReturn(pTimer->enmClock == TMCLOCK_VIRTUAL_SYNC, VERR_NOT_SUPPORTED); 822 return PDMCritSectEnter(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock, rcBusy); 823 } 824 825 826 /** 827 * Unlocks a timer clock locked by TMTimerLock. 828 * 829 * @param pTimer The timer which clock to unlock. 830 */ 831 VMMDECL(void) TMTimerUnlock(PTMTIMER pTimer) 832 { 833 AssertPtr(pTimer); 834 AssertReturnVoid(pTimer->enmClock == TMCLOCK_VIRTUAL_SYNC); 835 PDMCritSectLeave(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock); 836 } 837 838 839 /** 840 * Checks if the current thread owns the timer clock lock. 841 * 842 * @returns @c true if its the owner, @c false if not. 843 * @param pTimer The timer handle. 844 */ 845 VMMDECL(bool) TMTimerIsLockOwner(PTMTIMER pTimer) 846 { 847 AssertPtr(pTimer); 848 AssertReturn(pTimer->enmClock == TMCLOCK_VIRTUAL_SYNC, false); 849 return PDMCritSectIsOwner(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock); 804 850 } 805 851 -
trunk/src/VBox/VMM/VMMR0/VMMR0.def
r37321 r37414 50 50 TMTimerGetFreq 51 51 TMTimerIsActive 52 TMTimerIsLockOwner 53 TMTimerLock 52 54 TMTimerSet 53 55 TMTimerSetRelative … … 57 59 TMTimerSetFrequencyHint 58 60 TMTimerStop 61 TMTimerUnlock 59 62 VMMGetSvnRev 60 63 vmmR0LoggerFlush -
trunk/src/VBox/VMM/VMMR3/TM.cpp
r37358 r37414 130 130 #include <VBox/vmm/pdmapi.h> 131 131 #include <VBox/vmm/iom.h> 132 #include <VBox/vmm/dbgftrace.h> 132 133 #include "TMInternal.h" 133 134 #include <VBox/vmm/vm.h> … … 2076 2077 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncRunStoppedAlready); 2077 2078 u64Now = pVM->tm.s.u64VirtualSync; 2078 #if def DEBUG_bird2079 #if 0 //def DEBUG_bird 2079 2080 Assert(u64Now <= pNext->u64Expire); 2080 2081 #endif 2082 if (u64Now > pNext->u64Expire) 2083 DBGFTRACE_U64_TAG2(pVM, u64Now - pNext->u64Expire, "stopped after timer expired", pNext->pszDesc); 2081 2084 } 2082 2085 else … … 2179 2182 2180 2183 /* advance the clock - don't permit timers to be out of order or armed in the 'past'. */ 2184 if (pTimer->u64Expire < u64Prev) 2185 DBGFTRACE_U64_TAG2(pVM, u64Prev - pTimer->u64Expire, "timer expires in the past", pNext->pszDesc); 2181 2186 #ifdef DEBUG_bird 2182 2187 #ifdef VBOX_STRICT 2183 AssertMsg(pTimer->u64Expire >= u64Prev, ("%'RU64 < %'RU64 %s\n", pTimer->u64Expire, u64Prev, pTimer->pszDesc));2188 //AssertMsg(pTimer->u64Expire >= u64Prev, ("%'RU64 < %'RU64 %s\n", pTimer->u64Expire, u64Prev, pTimer->pszDesc)); 2184 2189 u64Prev = pTimer->u64Expire; 2185 2190 #endif … … 2190 2195 /* fire */ 2191 2196 TM_SET_STATE(pTimer, TMTIMERSTATE_EXPIRED_DELIVER); 2197 DBGFTRACE_U64_TAG(pVM, pVM->tm.s.u64VirtualSync, pTimer->pszDesc); 2192 2198 switch (pTimer->enmType) 2193 2199 { … … 2230 2236 Assert(u64VirtualNow2 >= u64VirtualNow); 2231 2237 #ifdef DEBUG_bird 2232 AssertMsg(pVM->tm.s.u64VirtualSync >= u64Now, ("%'RU64 < %'RU64\n", pVM->tm.s.u64VirtualSync, u64Now));2238 //AssertMsg(pVM->tm.s.u64VirtualSync >= u64Now, ("%'RU64 < %'RU64\n", pVM->tm.s.u64VirtualSync, u64Now)); 2233 2239 #endif 2240 if (pVM->tm.s.u64VirtualSync < u64Now) 2241 DBGFTRACE_U64_TAG(pVM, u64Now - pVM->tm.s.u64VirtualSync, "u64VirtualSync < u64Now"); 2242 2234 2243 const uint64_t offSlack = pVM->tm.s.u64VirtualSync - u64Now; 2235 2244 STAM_STATS({ … … 2275 2284 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncCatchUp, false); 2276 2285 Log4(("TM: %'RU64/-%'8RU64: caught up [pt]\n", u64VirtualNow2 - offNew, offLag)); 2286 DBGFTRACE_U64_TAG(pVM, u64VirtualNow2 - offNew, "vs caught up [pt]"); 2277 2287 } 2278 2288 else if (offLag <= pVM->tm.s.u64VirtualSyncCatchUpGiveUpThreshold) … … 2288 2298 ASMAtomicWriteU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage, pVM->tm.s.aVirtualSyncCatchUpPeriods[i].u32Percentage); 2289 2299 Log4(("TM: %'RU64/%'8RU64: adj %u%%\n", u64VirtualNow2 - offNew, offLag, pVM->tm.s.u32VirtualSyncCatchUpPercentage)); 2300 DBGFTRACE_U64_TAG(pVM, pVM->tm.s.u32VirtualSyncCatchUpPercentage, "vs adj"); 2290 2301 } 2302 else 2303 DBGFTRACE_U64_TAG(pVM, u64VirtualNow2 - offNew, "vs resuming catch up"); 2291 2304 pVM->tm.s.u64VirtualSyncCatchUpPrev = u64VirtualNow2; 2292 2305 } … … 2300 2313 Log4(("TM: %'RU64/%'8RU64: give up %u%%\n", u64VirtualNow2 - offNew, offLag, pVM->tm.s.u32VirtualSyncCatchUpPercentage)); 2301 2314 LogRel(("TM: Giving up catch-up attempt at a %'RU64 ns lag; new total: %'RU64 ns\n", offLag, offNew)); 2315 DBGFTRACE_U64_TAG(pVM, u64VirtualNow2 - offNew, "vs gave up"); 2302 2316 } 2303 2317 } … … 2316 2330 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncCatchUp, true); 2317 2331 Log4(("TM: %'RU64/%'8RU64: catch-up %u%%\n", u64VirtualNow2 - offNew, offLag, pVM->tm.s.u32VirtualSyncCatchUpPercentage)); 2332 DBGFTRACE_U64_TAG(pVM, pVM->tm.s.u32VirtualSyncCatchUpPercentage, "vs start"); 2318 2333 } 2319 2334 else … … 2324 2339 Log4(("TM: %'RU64/%'8RU64: give up\n", u64VirtualNow2 - offNew, offLag)); 2325 2340 LogRel(("TM: Not bothering to attempt catching up a %'RU64 ns lag; new total: %'RU64\n", offLag, offNew)); 2341 DBGFTRACE_U64_TAG(pVM, u64VirtualNow2 - offNew, "vs don't bother"); 2326 2342 } 2327 2343 } 2344 else 2345 DBGFTRACE_U64_TAG(pVM, u64VirtualNow2 - offNew, "vs resuming"); 2328 2346 2329 2347 /* -
trunk/src/VBox/VMM/VMMRC/VMMRC.def
r35335 r37414 46 46 TMTimerGetFreq 47 47 TMTimerIsActive 48 TMTimerIsLockOwner 49 TMTimerLock 48 50 TMTimerSet 49 51 TMTimerSetRelative … … 53 55 TMTimerSetFrequencyHint 54 56 TMTimerStop 57 TMTimerUnlock 55 58 TRPMGCHandlerGeneric 56 59 TRPMGCHandlerInterupt
Note:
See TracChangeset
for help on using the changeset viewer.