Changeset 87771 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Feb 16, 2021 6:05:41 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142825
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/TMAll.cpp
r87770 r87771 57 57 * @todo needs reworking later as it uses PDMDEVINSR0::pDevInsR0RemoveMe. */ 58 58 # ifdef IN_RING3 59 # define TMTIMER_GET_CRITSECT( pTimer) ((pTimer)->pCritSect)59 # define TMTIMER_GET_CRITSECT(a_pVM, a_pTimer) ((a_pTimer)->pCritSect) 60 60 # else 61 # define TMTIMER_GET_CRITSECT( pTimer) tmRZTimerGetCritSect(pTimer)61 # define TMTIMER_GET_CRITSECT(a_pVM, a_pTimer) tmRZTimerGetCritSect(a_pVM, a_pTimer) 62 62 # endif 63 63 #endif … … 67 67 * the timer. */ 68 68 #ifdef VBOX_STRICT 69 # define TMTIMER_ASSERT_CRITSECT( pTimer) \69 # define TMTIMER_ASSERT_CRITSECT(a_pVM, a_pTimer) \ 70 70 do { \ 71 if (( pTimer)->pCritSect) \71 if ((a_pTimer)->pCritSect) \ 72 72 { \ 73 73 VMSTATE enmState; \ 74 PPDMCRITSECT pCritSect = TMTIMER_GET_CRITSECT( pTimer); \74 PPDMCRITSECT pCritSect = TMTIMER_GET_CRITSECT(a_pVM, a_pTimer); \ 75 75 AssertMsg( pCritSect \ 76 76 && ( PDMCritSectIsOwner(pCritSect) \ 77 || (enmState = ( pTimer)->CTX_SUFF(pVM)->enmVMState) == VMSTATE_CREATING \77 || (enmState = (a_pVM)->enmVMState) == VMSTATE_CREATING \ 78 78 || enmState == VMSTATE_RESETTING \ 79 79 || enmState == VMSTATE_RESETTING_LS ),\ 80 ("pTimer=%p (%s) pCritSect=%p (%s)\n", pTimer, R3STRING(pTimer->pszDesc), \81 ( pTimer)->pCritSect, R3STRING(PDMR3CritSectName((pTimer)->pCritSect)) )); \80 ("pTimer=%p (%s) pCritSect=%p (%s)\n", a_pTimer, R3STRING(a_pTimer->pszDesc), \ 81 (a_pTimer)->pCritSect, R3STRING(PDMR3CritSectName((a_pTimer)->pCritSect)) )); \ 82 82 } \ 83 83 } while (0) 84 84 #else 85 # define TMTIMER_ASSERT_CRITSECT(p Timer) do { } while (0)85 # define TMTIMER_ASSERT_CRITSECT(pVM, pTimer) do { } while (0) 86 86 #endif 87 87 … … 105 105 { \ 106 106 VMSTATE enmState; \ 107 PPDMCRITSECT pCritSect = TMTIMER_GET_CRITSECT(p Timer); \107 PPDMCRITSECT pCritSect = TMTIMER_GET_CRITSECT(pVM, pTimer); \ 108 108 AssertMsg( pCritSect \ 109 109 && ( !PDMCritSectIsOwner(pCritSect) \ … … 126 126 * @todo This needs a redo! 127 127 */ 128 DECLINLINE(PPDMCRITSECT) tmRZTimerGetCritSect(P TMTIMER pTimer)128 DECLINLINE(PPDMCRITSECT) tmRZTimerGetCritSect(PVMCC pVM, PTMTIMER pTimer) 129 129 { 130 130 if (pTimer->enmType == TMTIMERTYPE_DEV) … … 140 140 return (PPDMCRITSECT)((uintptr_t)pDevInsR0->pvInstanceDataR0 + offCritSect); 141 141 } 142 return (PPDMCRITSECT)MMHyperR3ToCC( (pTimer)->CTX_SUFF(pVM), pTimer->pCritSect);142 return (PPDMCRITSECT)MMHyperR3ToCC(pVM, pTimer->pCritSect); 143 143 } 144 144 #endif /* VBOX_STRICT && IN_RING0 */ … … 358 358 * Schedule the queue which was changed. 359 359 */ 360 DECLINLINE(void) tmSchedule(PTMTIMER pTimer) 361 { 362 PVMCC pVM = pTimer->CTX_SUFF(pVM); 360 DECLINLINE(void) tmSchedule(PVMCC pVM, PTMTIMER pTimer) 361 { 363 362 if ( VM_IS_EMT(pVM) 364 363 && RT_SUCCESS(TM_TRY_LOCK_TIMERS(pVM))) … … 432 431 * 433 432 * @returns Success indicator. 433 * @param pVM The cross context VM structure. 434 434 * @param pTimer Timer in question. 435 435 * @param enmStateNew The new timer state. 436 436 * @param enmStateOld The old timer state. 437 437 */ 438 DECLINLINE(bool) tmTimerTryWithLink(P TMTIMER pTimer, TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld)438 DECLINLINE(bool) tmTimerTryWithLink(PVMCC pVM, PTMTIMER pTimer, TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld) 439 439 { 440 440 if (tmTimerTry(pTimer, enmStateNew, enmStateOld)) 441 441 { 442 tmTimerLinkSchedule(&p Timer->CTX_SUFF(pVM)->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock], pTimer);442 tmTimerLinkSchedule(&pVM->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock], pTimer); 443 443 return true; 444 444 } … … 505 505 * Schedules the given timer on the given queue. 506 506 * 507 * @param pVM The cross context VM structure. 507 508 * @param pQueue The timer queue. 508 509 * @param pTimer The timer that needs scheduling. … … 510 511 * @remarks Called while owning the lock. 511 512 */ 512 DECLINLINE(void) tmTimerQueueScheduleOne(P TMTIMERQUEUE pQueue, PTMTIMER pTimer)513 DECLINLINE(void) tmTimerQueueScheduleOne(PVMCC pVM, PTMTIMERQUEUE pQueue, PTMTIMER pTimer) 513 514 { 514 515 Assert(pQueue->enmClock != TMCLOCK_VIRTUAL_SYNC); 516 RT_NOREF(pVM); 515 517 516 518 /* … … 573 575 case TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE: 574 576 tmTimerLinkSchedule(pQueue, pTimer); 575 STAM_COUNTER_INC(&p Timer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatPostponed));577 STAM_COUNTER_INC(&pVM->tm.s.CTX_SUFF_Z(StatPostponed)); 576 578 return; 577 579 … … 601 603 * @remarks Called while owning the lock. 602 604 */ 603 void tmTimerQueueSchedule(PVM pVM, PTMTIMERQUEUE pQueue)605 void tmTimerQueueSchedule(PVMCC pVM, PTMTIMERQUEUE pQueue) 604 606 { 605 607 TM_ASSERT_TIMER_LOCK_OWNERSHIP(pVM); … … 628 630 Log2(("tmTimerQueueSchedule: %p:{.enmState=%s, .enmClock=%d, .enmType=%d, .pszDesc=%s}\n", 629 631 pTimer, tmTimerState(pTimer->enmState), pTimer->enmClock, pTimer->enmType, R3STRING(pTimer->pszDesc))); 630 tmTimerQueueScheduleOne(p Queue, pTimer);632 tmTimerQueueScheduleOne(pVM, pQueue, pTimer); 631 633 Log2(("tmTimerQueueSchedule: %p: new %s\n", pTimer, tmTimerState(pTimer->enmState))); 632 634 } /* foreach timer in current schedule batch. */ … … 1287 1289 1288 1290 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a); 1289 TMTIMER_ASSERT_CRITSECT(p Timer);1291 TMTIMER_ASSERT_CRITSECT(pVM, pTimer); 1290 1292 1291 1293 DBGFTRACE_U64_TAG2(pVM, u64Expire, "TMTimerSet", R3STRING(pTimer->pszDesc)); … … 1350 1352 case TMTIMERSTATE_EXPIRED_DELIVER: 1351 1353 case TMTIMERSTATE_STOPPED: 1352 if (tmTimerTryWithLink(p Timer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))1354 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState)) 1353 1355 { 1354 1356 Assert(!pTimer->offPrev); … … 1356 1358 pTimer->u64Expire = u64Expire; 1357 1359 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE); 1358 tmSchedule(p Timer);1360 tmSchedule(pVM, pTimer); 1359 1361 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a); 1360 1362 return VINF_SUCCESS; … … 1368 1370 pTimer->u64Expire = u64Expire; 1369 1371 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE); 1370 tmSchedule(p Timer);1372 tmSchedule(pVM, pTimer); 1371 1373 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a); 1372 1374 return VINF_SUCCESS; … … 1376 1378 1377 1379 case TMTIMERSTATE_ACTIVE: 1378 if (tmTimerTryWithLink(p Timer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))1380 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState)) 1379 1381 { 1380 1382 pTimer->u64Expire = u64Expire; 1381 1383 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE); 1382 tmSchedule(p Timer);1384 tmSchedule(pVM, pTimer); 1383 1385 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a); 1384 1386 return VINF_SUCCESS; … … 1392 1394 pTimer->u64Expire = u64Expire; 1393 1395 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE); 1394 tmSchedule(p Timer);1396 tmSchedule(pVM, pTimer); 1395 1397 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a); 1396 1398 return VINF_SUCCESS; … … 1594 1596 1595 1597 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a); 1596 TMTIMER_ASSERT_CRITSECT(p Timer);1598 TMTIMER_ASSERT_CRITSECT(pVM, pTimer); 1597 1599 1598 1600 DBGFTRACE_U64_TAG2(pVM, cTicksToNext, "TMTimerSetRelative", R3STRING(pTimer->pszDesc)); … … 1641 1643 { 1642 1644 tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now); 1643 STAM_PROFILE_STOP(&p Timer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);1645 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a); 1644 1646 return VINF_SUCCESS; 1645 1647 } … … 1673 1675 RT_FALL_THRU(); 1674 1676 case TMTIMERSTATE_EXPIRED_DELIVER: 1675 if (tmTimerTryWithLink(p Timer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))1677 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState)) 1676 1678 { 1677 1679 Assert(!pTimer->offPrev); … … 1681 1683 pTimer, tmTimerState(enmState), R3STRING(pTimer->pszDesc), pTimer->u64Expire, cRetries)); 1682 1684 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE); 1683 tmSchedule(p Timer);1685 tmSchedule(pVM, pTimer); 1684 1686 rc = VINF_SUCCESS; 1685 1687 break; … … 1696 1698 pTimer, tmTimerState(enmState), R3STRING(pTimer->pszDesc), pTimer->u64Expire, cRetries)); 1697 1699 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE); 1698 tmSchedule(p Timer);1700 tmSchedule(pVM, pTimer); 1699 1701 rc = VINF_SUCCESS; 1700 1702 break; … … 1705 1707 1706 1708 case TMTIMERSTATE_ACTIVE: 1707 if (tmTimerTryWithLink(p Timer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))1709 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState)) 1708 1710 { 1709 1711 pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now); … … 1711 1713 pTimer, tmTimerState(enmState), R3STRING(pTimer->pszDesc), pTimer->u64Expire, cRetries)); 1712 1714 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE); 1713 tmSchedule(p Timer);1715 tmSchedule(pVM, pTimer); 1714 1716 rc = VINF_SUCCESS; 1715 1717 break; … … 1726 1728 pTimer, tmTimerState(enmState), R3STRING(pTimer->pszDesc), pTimer->u64Expire, cRetries)); 1727 1729 TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE); 1728 tmSchedule(p Timer);1730 tmSchedule(pVM, pTimer); 1729 1731 rc = VINF_SUCCESS; 1730 1732 break; … … 1792 1794 TM_UNLOCK_TIMERS(pVM); 1793 1795 1794 STAM_PROFILE_STOP(&p Timer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);1796 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a); 1795 1797 return rc; 1796 1798 } … … 1834 1836 PTMTIMER pTimer; 1835 1837 TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer); 1836 TMTIMER_ASSERT_CRITSECT(p Timer);1838 TMTIMER_ASSERT_CRITSECT(pVM, pTimer); 1837 1839 1838 1840 uint32_t const uHzOldHint = pTimer->uHzHint; … … 1938 1940 1939 1941 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a); 1940 TMTIMER_ASSERT_CRITSECT(p Timer);1942 TMTIMER_ASSERT_CRITSECT(pVM, pTimer); 1941 1943 1942 1944 /* … … 1975 1977 if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP_SCHEDULE, enmState)) 1976 1978 { 1977 tmSchedule(p Timer);1979 tmSchedule(pVM, pTimer); 1978 1980 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a); 1979 1981 return VINF_SUCCESS; … … 1984 1986 if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP, enmState)) 1985 1987 { 1986 tmSchedule(p Timer);1988 tmSchedule(pVM, pTimer); 1987 1989 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a); 1988 1990 return VINF_SUCCESS; … … 1991 1993 1992 1994 case TMTIMERSTATE_ACTIVE: 1993 if (tmTimerTryWithLink(p Timer, TMTIMERSTATE_PENDING_STOP, enmState))1995 if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_STOP, enmState)) 1994 1996 { 1995 tmSchedule(p Timer);1997 tmSchedule(pVM, pTimer); 1996 1998 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a); 1997 1999 return VINF_SUCCESS; … … 2104 2106 PTMTIMER pTimer; 2105 2107 TMTIMER_HANDLE_TO_PTR_RETURN_EX(pVM, hTimer, UINT64_MAX, pTimer); 2106 TMTIMER_ASSERT_CRITSECT(p Timer);2108 TMTIMER_ASSERT_CRITSECT(pVM, pTimer); 2107 2109 int cRetries = 1000; 2108 2110 do
Note:
See TracChangeset
for help on using the changeset viewer.