Index: /trunk/src/VBox/VMM/VMMAll/TMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/TMAll.cpp	(revision 87813)
+++ /trunk/src/VBox/VMM/VMMAll/TMAll.cpp	(revision 87814)
@@ -358,11 +358,6 @@
  * Schedule the queue which was changed.
  */
-DECLINLINE(void) tmSchedule(PVMCC pVM, PTMTIMER pTimer)
-{
-    TMCLOCK const           enmClock = pTimer->enmClock;
-    AssertReturnVoid((unsigned)enmClock < TMCLOCK_MAX);
-    PTMTIMERQUEUE const     pQueue   = &pVM->tm.s.aTimerQueues[enmClock];
-    PTMTIMERQUEUECC const   pQueueCC = TM_GET_TIMER_QUEUE_CC(pVM, enmClock, pQueue);
-
+DECLINLINE(void) tmSchedule(PVMCC pVM, PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue, PTMTIMER pTimer)
+{
     if (VM_IS_EMT(pVM)) /** @todo drop EMT requirement here. */
     {
@@ -440,17 +435,17 @@
  *
  * @returns Success indicator.
- * @param   pVM             The cross context VM structure.
- * @param   pTimer          Timer in question.
- * @param   enmStateNew     The new timer state.
- * @param   enmStateOld     The old timer state.
- */
-DECLINLINE(bool) tmTimerTryWithLink(PVMCC pVM, PTMTIMER pTimer, TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld)
-{
-    TMCLOCK const enmClock = pTimer->enmClock;
-    AssertReturn((unsigned)enmClock < TMCLOCK_MAX, false);
+ * @param   pQueueCC    The current context queue (same as @a pQueue for
+ *                      ring-3).
+ * @param   pQueue      The shared queue data.
+ * @param   pTimer      Timer in question.
+ * @param   enmStateNew The new timer state.
+ * @param   enmStateOld The old timer state.
+ */
+DECLINLINE(bool) tmTimerTryWithLink(PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue, PTMTIMER pTimer,
+                                    TMTIMERSTATE enmStateNew, TMTIMERSTATE enmStateOld)
+{
     if (tmTimerTry(pTimer, enmStateNew, enmStateOld))
     {
-        PTMTIMERQUEUE const pQueue = &pVM->tm.s.aTimerQueues[enmClock];
-        tmTimerLinkSchedule(TM_GET_TIMER_QUEUE_CC(pVM, enmClock, pQueue), pQueue, pTimer);
+        tmTimerLinkSchedule(pQueueCC, pQueue, pTimer);
         return true;
     }
@@ -476,5 +471,5 @@
     Assert(pTimer->idxNext == UINT32_MAX);
     Assert(pTimer->idxPrev == UINT32_MAX);
-    Assert(pTimer->enmState == TMTIMERSTATE_ACTIVE || pTimer->enmClock != TMCLOCK_VIRTUAL_SYNC); /* (active is not a stable state) */
+    Assert(pTimer->enmState == TMTIMERSTATE_ACTIVE || pQueue->enmClock != TMCLOCK_VIRTUAL_SYNC); /* (active is not a stable state) */
     RT_NOREF(pVM);
 
@@ -648,5 +643,5 @@
          */
         Log2(("tmTimerQueueSchedule: %p:{.enmState=%s, .enmClock=%d, .enmType=%d, .szName=%s}\n",
-              pTimer, tmTimerState(pTimer->enmState), pTimer->enmClock, pTimer->enmType, pTimer->szName));
+              pTimer, tmTimerState(pTimer->enmState), pQueue->enmClock, pTimer->enmType, pTimer->szName));
         tmTimerQueueScheduleOne(pVM, pQueueCC, pQueue, pTimer);
         Log2(("tmTimerQueueSchedule: %p: new %s\n", pTimer, tmTimerState(pTimer->enmState)));
@@ -683,5 +678,4 @@
                      pPrev = pCur, pCur = tmTimerGetNext(pQueueCC, pCur))
                 {
-                    AssertMsg(pCur->enmClock == (TMCLOCK)idxQueue, ("%s: %d != %u\n", pszWhere, pCur->enmClock, idxQueue));
                     AssertMsg(tmTimerGetPrev(pQueueCC, pCur) == pPrev, ("%s: %p != %p\n", pszWhere, tmTimerGetPrev(pQueueCC, pCur), pPrev));
                     TMTIMERSTATE enmState = pCur->enmState;
@@ -1377,5 +1371,5 @@
             case TMTIMERSTATE_EXPIRED_DELIVER:
             case TMTIMERSTATE_STOPPED:
-                if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
+                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
                 {
                     Assert(pTimer->idxPrev == UINT32_MAX);
@@ -1383,5 +1377,5 @@
                     pTimer->u64Expire = u64Expire;
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
                     return VINF_SUCCESS;
@@ -1395,5 +1389,5 @@
                     pTimer->u64Expire = u64Expire;
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
                     return VINF_SUCCESS;
@@ -1403,9 +1397,9 @@
 
             case TMTIMERSTATE_ACTIVE:
-                if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
+                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
                 {
                     pTimer->u64Expire = u64Expire;
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
                     return VINF_SUCCESS;
@@ -1419,5 +1413,5 @@
                     pTimer->u64Expire = u64Expire;
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
                     return VINF_SUCCESS;
@@ -1498,9 +1492,10 @@
  * @param   pu64Now         Where to return the current time stamp used.
  *                          Optional.
- * @param   pQueue          Pointer to the shared timer queue data.
- * @param   idxQueue        The queue index.
+ * @param   pQueueCC        The context specific queue data (same as @a pQueue
+ *                          for ring-3).
+ * @param   pQueue          The shared queue data.
  */
 static int tmTimerSetRelativeOptimizedStart(PVMCC pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now,
-                                            PTMTIMERQUEUE pQueue, uint32_t idxQueue)
+                                            PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue)
 {
     Assert(pTimer->idxPrev == UINT32_MAX);
@@ -1519,8 +1514,7 @@
      */
     DBGFTRACE_U64_TAG2(pVM, u64Expire, "tmTimerSetRelativeOptimizedStart", pTimer->szName);
-    tmTimerQueueLinkActive(pVM, TM_GET_TIMER_QUEUE_CC(pVM, idxQueue, pQueue), pQueue, pTimer, u64Expire);
+    tmTimerQueueLinkActive(pVM, pQueueCC, pQueue, pTimer, u64Expire);
 
     STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeOpt);
-    RT_NOREF(idxQueue);
     return VINF_SUCCESS;
 }
@@ -1614,12 +1608,16 @@
  * @param   pu64Now         Where to return the current time stamp used.
  *                          Optional.
+ * @param   pQueueCC        The context specific queue data (same as @a pQueue
+ *                          for ring-3).
+ * @param   pQueue          The shared queue data.
+ * @param   idxQueue        The queue index.
  */
 static int tmTimerSetRelative(PVMCC pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now,
-                              PTMTIMERQUEUE pQueue, uint32_t idxQueue)
+                              PTMTIMERQUEUECC pQueueCC, PTMTIMERQUEUE pQueue)
 {
     STAM_COUNTER_INC(&pTimer->StatSetRelative);
 
     /* Treat virtual sync timers specially. */
-    if (idxQueue == TMCLOCK_VIRTUAL_SYNC)
+    if (pQueue->enmClock == TMCLOCK_VIRTUAL_SYNC)
         return tmTimerVirtualSyncSetRelative(pVM, pTimer, cTicksToNext, pu64Now);
 
@@ -1671,5 +1669,5 @@
                       && tmTimerTry(pTimer, TMTIMERSTATE_ACTIVE, enmState)))
         {
-            tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now, pQueue, idxQueue);
+            tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now, pQueueCC, pQueue);
             STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);
             PDMCritSectLeave(&pQueue->TimerLock);
@@ -1704,5 +1702,5 @@
                 RT_FALL_THRU();
             case TMTIMERSTATE_EXPIRED_DELIVER:
-                if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
+                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_SCHEDULE_SET_EXPIRE, enmState))
                 {
                     Assert(pTimer->idxPrev == UINT32_MAX);
@@ -1712,5 +1710,5 @@
                           pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     rc = VINF_SUCCESS;
                     break;
@@ -1727,5 +1725,5 @@
                           pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_SCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     rc = VINF_SUCCESS;
                     break;
@@ -1736,5 +1734,5 @@
 
             case TMTIMERSTATE_ACTIVE:
-                if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
+                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_RESCHEDULE_SET_EXPIRE, enmState))
                 {
                     pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, pQueue->enmClock, pu64Now);
@@ -1742,5 +1740,5 @@
                           pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     rc = VINF_SUCCESS;
                     break;
@@ -1757,5 +1755,5 @@
                           pTimer, tmTimerState(enmState), pTimer->szName, pTimer->u64Expire, cRetries));
                     TM_SET_STATE(pTimer, TMTIMERSTATE_PENDING_RESCHEDULE);
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     rc = VINF_SUCCESS;
                     break;
@@ -1841,5 +1839,5 @@
 {
     TMTIMER_HANDLE_TO_VARS_RETURN(pVM, hTimer); /* => pTimer, pQueueCC, pQueue, idxTimer, idxQueue */
-    return tmTimerSetRelative(pVM, pTimer, cTicksToNext, pu64Now, pQueue, idxQueue);
+    return tmTimerSetRelative(pVM, pTimer, cTicksToNext, pu64Now, pQueueCC, pQueue);
 }
 
@@ -2007,5 +2005,5 @@
                 if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP_SCHEDULE, enmState))
                 {
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
                     return VINF_SUCCESS;
@@ -2016,5 +2014,5 @@
                 if (tmTimerTry(pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
                 {
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
                     return VINF_SUCCESS;
@@ -2023,7 +2021,7 @@
 
             case TMTIMERSTATE_ACTIVE:
-                if (tmTimerTryWithLink(pVM, pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
+                if (tmTimerTryWithLink(pQueueCC, pQueue, pTimer, TMTIMERSTATE_PENDING_STOP, enmState))
                 {
-                    tmSchedule(pVM, pTimer);
+                    tmSchedule(pVM, pQueueCC, pQueue, pTimer);
                     STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
                     return VINF_SUCCESS;
@@ -2252,13 +2250,13 @@
         case TMCLOCK_VIRTUAL:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueueCC, pQueue);
 
         case TMCLOCK_VIRTUAL_SYNC:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext * UINT64_C(1000000), NULL, pQueueCC, pQueue);
 
         case TMCLOCK_REAL:
             AssertCompile(TMCLOCK_FREQ_REAL == 1000);
-            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMilliesToNext, NULL, pQueueCC, pQueue);
 
         default:
@@ -2284,13 +2282,13 @@
         case TMCLOCK_VIRTUAL:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueueCC, pQueue);
 
         case TMCLOCK_VIRTUAL_SYNC:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext * 1000, NULL, pQueueCC, pQueue);
 
         case TMCLOCK_REAL:
             AssertCompile(TMCLOCK_FREQ_REAL == 1000);
-            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext / 1000, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cMicrosToNext / 1000, NULL, pQueueCC, pQueue);
 
         default:
@@ -2312,20 +2310,20 @@
 {
     TMTIMER_HANDLE_TO_VARS_RETURN(pVM, hTimer); /* => pTimer, pQueueCC, pQueue, idxTimer, idxQueue */
-    switch (pTimer->enmClock)
+    switch (pQueue->enmClock)
     {
         case TMCLOCK_VIRTUAL:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueueCC, pQueue);
 
         case TMCLOCK_VIRTUAL_SYNC:
             AssertCompile(TMCLOCK_FREQ_VIRTUAL == 1000000000);
-            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cNanosToNext, NULL, pQueueCC, pQueue);
 
         case TMCLOCK_REAL:
             AssertCompile(TMCLOCK_FREQ_REAL == 1000);
-            return tmTimerSetRelative(pVM, pTimer, cNanosToNext / 1000000, NULL, pQueue, idxQueue);
+            return tmTimerSetRelative(pVM, pTimer, cNanosToNext / 1000000, NULL, pQueueCC, pQueue);
 
         default:
-            AssertMsgFailed(("Invalid enmClock=%d\n", pTimer->enmClock));
+            AssertMsgFailed(("Invalid enmClock=%d\n", pQueue->enmClock));
             return VERR_TM_TIMER_BAD_CLOCK;
     }
Index: /trunk/src/VBox/VMM/VMMR0/TMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/TMR0.cpp	(revision 87813)
+++ /trunk/src/VBox/VMM/VMMR0/TMR0.cpp	(revision 87814)
@@ -139,5 +139,4 @@
             {
                 paTimers[i].u64Expire       = UINT64_MAX;
-                paTimers[i].enmClock        = TMCLOCK_MAX;
                 paTimers[i].enmType         = TMTIMERTYPE_INVALID;
                 paTimers[i].enmState        = TMTIMERSTATE_FREE;
Index: /trunk/src/VBox/VMM/VMMR3/TM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/TM.cpp	(revision 87813)
+++ /trunk/src/VBox/VMM/VMMR3/TM.cpp	(revision 87814)
@@ -1515,21 +1515,4 @@
 
 #ifdef VBOX_WITH_STATISTICS
-/** Names the clock of the timer.   */
-static const char *tmR3TimerClockName(PTMTIMERR3 pTimer)
-{
-    switch (pTimer->enmClock)
-    {
-        case TMCLOCK_VIRTUAL:       return "virtual";
-        case TMCLOCK_VIRTUAL_SYNC:  return "virtual-sync";
-        case TMCLOCK_REAL:          return "real";
-        case TMCLOCK_TSC:           return "tsc";
-        case TMCLOCK_MAX:           break;
-    }
-    return "corrupt clock value";
-}
-#endif
-
-
-#ifdef VBOX_WITH_STATISTICS
 
 /**
@@ -1537,10 +1520,11 @@
  *
  * @param   pVM         The cross context VM structure.
+ * @param   pQueue      The queue the timer belongs to.
  * @param   pTimer      The timer to register statistics for.
  */
-static void tmR3TimerRegisterStats(PVM pVM, PTMTIMER pTimer)
+static void tmR3TimerRegisterStats(PVM pVM, PTMTIMERQUEUE pQueue, PTMTIMER pTimer)
 {
     STAMR3RegisterF(pVM, &pTimer->StatTimer,            STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL,
-                    tmR3TimerClockName(pTimer), "/TM/Timers/%s", pTimer->szName);
+                    pQueue->szName, "/TM/Timers/%s", pTimer->szName);
     STAMR3RegisterF(pVM, &pTimer->StatCritSectEnter,    STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL,
                     "",                         "/TM/Timers/%s/CritSectEnter", pTimer->szName);
@@ -1584,5 +1568,5 @@
         TMTIMERSTATE enmState = pTimer->enmState;
         if (enmState > TMTIMERSTATE_INVALID && enmState < TMTIMERSTATE_DESTROY)
-            tmR3TimerRegisterStats(pVM, pTimer);
+            tmR3TimerRegisterStats(pVM, pQueue, pTimer);
     }
 }
@@ -1684,5 +1668,4 @@
 
     pTimer->u64Expire       = 0;
-    pTimer->enmClock        = enmClock;
     pTimer->enmState        = TMTIMERSTATE_STOPPED;
     pTimer->idxScheduleNext = UINT32_MAX;
@@ -1707,5 +1690,5 @@
      */
     if (pQueue->fCannotGrow)
-        tmR3TimerRegisterStats(pVM, pTimer);
+        tmR3TimerRegisterStats(pVM, pQueue, pTimer);
 #endif
 
@@ -2436,5 +2419,5 @@
         }
         Log2(("tmR3TimerQueueRun: %p:{.enmState=%s, .enmClock=%d, .enmType=%d, u64Expire=%llx (now=%llx) .szName='%s'}\n",
-              pTimer, tmTimerState(pTimer->enmState), pTimer->enmClock, pTimer->enmType, pTimer->u64Expire, u64Now, pTimer->szName));
+              pTimer, tmTimerState(pTimer->enmState), pQueue->enmClock, pTimer->enmType, pTimer->u64Expire, u64Now, pTimer->szName));
         bool fRc;
         TM_TRY_SET_STATE(pTimer, TMTIMERSTATE_EXPIRED_GET_UNLINK, TMTIMERSTATE_ACTIVE, fRc);
@@ -2629,5 +2612,5 @@
 
         Log2(("tmR3TimerQueueRun: %p:{.enmState=%s, .enmClock=%d, .enmType=%d, u64Expire=%llx (now=%llx) .szName='%s'}\n",
-              pTimer, tmTimerState(pTimer->enmState), pTimer->enmClock, pTimer->enmType, pTimer->u64Expire, u64Now, pTimer->szName));
+              pTimer, tmTimerState(pTimer->enmState), pQueue->enmClock, pTimer->enmType, pTimer->u64Expire, u64Now, pTimer->szName));
 
         /* Advance the clock - don't permit timers to be out of order or armed
@@ -3849,5 +3832,6 @@
     for (uint32_t idxQueue = 0; idxQueue < RT_ELEMENTS(pVM->tm.s.aTimerQueues); idxQueue++)
     {
-        PTMTIMERQUEUE pQueue = &pVM->tm.s.aTimerQueues[idxQueue];
+        PTMTIMERQUEUE const pQueue   = &pVM->tm.s.aTimerQueues[idxQueue];
+        const char * const  pszClock = tmR3Get5CharClockName(pQueue->enmClock);
         PDMCritSectRwEnterShared(&pQueue->AllocLock, VERR_IGNORED);
         for (uint32_t idxTimer = 0; idxTimer < pQueue->cTimersAlloc; idxTimer++)
@@ -3862,5 +3846,5 @@
                                 pTimer->idxPrev,
                                 pTimer->idxScheduleNext,
-                                tmR3Get5CharClockName(pTimer->enmClock),
+                                pszClock,
                                 TMTimerGet(pVM, pTimer->hSelf),
                                 pTimer->u64Expire,
@@ -3898,5 +3882,6 @@
     for (uint32_t idxQueue = 0; idxQueue < RT_ELEMENTS(pVM->tm.s.aTimerQueues); idxQueue++)
     {
-        PTMTIMERQUEUE pQueue = &pVM->tm.s.aTimerQueues[idxQueue];
+        PTMTIMERQUEUE const pQueue   = &pVM->tm.s.aTimerQueues[idxQueue];
+        const char * const  pszClock = tmR3Get5CharClockName(pQueue->enmClock);
         PDMCritSectRwEnterShared(&pQueue->AllocLock, VERR_IGNORED);
         PDMCritSectEnter(&pQueue->TimerLock, VERR_IGNORED);
@@ -3912,5 +3897,5 @@
                             pTimer->idxPrev,
                             pTimer->idxScheduleNext,
-                            tmR3Get5CharClockName(pTimer->enmClock),
+                            pszClock,
                             TMTimerGet(pVM, pTimer->hSelf),
                             pTimer->u64Expire,
Index: /trunk/src/VBox/VMM/include/TMInline.h
===================================================================
--- /trunk/src/VBox/VMM/include/TMInline.h	(revision 87813)
+++ /trunk/src/VBox/VMM/include/TMInline.h	(revision 87814)
@@ -141,5 +141,5 @@
 #ifdef VBOX_STRICT
     TMTIMERSTATE const enmState = pTimer->enmState;
-    Assert(  pTimer->enmClock == TMCLOCK_VIRTUAL_SYNC
+    Assert(  pQueue->enmClock == TMCLOCK_VIRTUAL_SYNC
            ? enmState == TMTIMERSTATE_ACTIVE
            : enmState == TMTIMERSTATE_PENDING_SCHEDULE || enmState == TMTIMERSTATE_PENDING_STOP_SCHEDULE);
Index: /trunk/src/VBox/VMM/include/TMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/TMInternal.h	(revision 87813)
+++ /trunk/src/VBox/VMM/include/TMInternal.h	(revision 87814)
@@ -136,8 +136,34 @@
     /** Expire time. */
     volatile uint64_t       u64Expire;
-    /** Clock to apply to u64Expire. */
-    TMCLOCK                 enmClock;
+
+    /** Timer state. */
+    volatile TMTIMERSTATE   enmState;
+    /** The index of the next next timer in the schedule list. */
+    uint32_t volatile       idxScheduleNext;
+
+    /** The index of the next timer in the chain. */
+    uint32_t                idxNext;
+    /** The index of the previous timer in the chain. */
+    uint32_t                idxPrev;
+
+    /** The timer frequency hint.  This is 0 if not hint was given. */
+    uint32_t volatile       uHzHint;
     /** Timer callback type. */
     TMTIMERTYPE             enmType;
+
+    /** It's own handle value. */
+    TMTIMERHANDLE           hSelf;
+    /** TMTIMER_FLAGS_XXX.   */
+    uint32_t                fFlags;
+    /** Explicit alignment padding. */
+    uint32_t                u32Alignment;
+
+    /** User argument. */
+    RTR3PTR                 pvUser;
+    /** The critical section associated with the lock. */
+    R3PTRTYPE(PPDMCRITSECT) pCritSect;
+
+    /* new cache line (64-bit / 64 bytes) */
+
     /** Type specific data. */
     union
@@ -178,30 +204,12 @@
     } u;
 
-    /** Timer state. */
-    volatile TMTIMERSTATE   enmState;
-    /** The index of the next next timer in the schedule list. */
-    uint32_t volatile       idxScheduleNext;
-
-    /** The index of the next timer in the chain. */
-    uint32_t                idxNext;
-    /** The index of the previous timer in the chain. */
-    uint32_t                idxPrev;
-
-    /** It's own handle value. */
-    TMTIMERHANDLE           hSelf;
-    /** TMTIMER_FLAGS_XXX.   */
-    uint32_t                fFlags;
-    /** The timer frequency hint.  This is 0 if not hint was given. */
-    uint32_t volatile       uHzHint;
-
-    /** User argument. */
-    RTR3PTR                 pvUser;
-    /** The critical section associated with the lock. */
-    R3PTRTYPE(PPDMCRITSECT) pCritSect;
-
     /** The timer name. */
     char                    szName[32];
 
-#ifdef VBOX_WITH_STATISTICS
+    /** @todo think of two useful release statistics counters here to fill up the
+     *        cache line. */
+#ifndef VBOX_WITH_STATISTICS
+    uint64_t                auAlignment2[2];
+#else
     STAMPROFILE             StatTimer;
     STAMPROFILE             StatCritSectEnter;
@@ -210,7 +218,10 @@
     STAMCOUNTER             StatSetRelative;
     STAMCOUNTER             StatStop;
+    uint64_t                auAlignment2[6];
 #endif
 } TMTIMER;
+AssertCompileMemberSize(TMTIMER, u64Expire, sizeof(uint64_t));
 AssertCompileMemberSize(TMTIMER, enmState, sizeof(uint32_t));
+AssertCompileSizeAlignment(TMTIMER, 64);
 
 
