Index: /trunk/include/VBox/sup.h
===================================================================
--- /trunk/include/VBox/sup.h	(revision 52617)
+++ /trunk/include/VBox/sup.h	(revision 52618)
@@ -236,4 +236,6 @@
     /** Current CPU Frequency. */
     volatile uint64_t   u64CpuHz;
+    /** The TSC delta with reference to the master TSC. */
+    volatile int64_t    i64TSCDelta;
     /** Number of errors during updating.
      * Typical errors are under/overflows. */
@@ -250,5 +252,11 @@
 
     /** Reserved for future per processor data. */
-    volatile uint32_t   au32Reserved[5+5];
+    volatile uint32_t   au32Reserved0[5];
+
+    /** The TSC value read while doing TSC delta measurements across CPUs. */
+    volatile uint64_t   u64TSCSample;
+
+    /** Reserved for future per processor data. */
+    volatile uint32_t   au32Reserved1[1];
 
     /** @todo Add topology/NUMA info. */
@@ -350,5 +358,5 @@
  * Upper 16 bits is the major version. Major version is only changed with
  * incompatible changes in the GIP. */
-#define SUPGLOBALINFOPAGE_VERSION   0x00030000
+#define SUPGLOBALINFOPAGE_VERSION   0x00040000
 
 /**
Index: /trunk/include/VBox/sup.mac
===================================================================
--- /trunk/include/VBox/sup.mac	(revision 52617)
+++ /trunk/include/VBox/sup.mac	(revision 52618)
@@ -5,5 +5,5 @@
 
 ;
-; Copyright (C) 2006-2012 Oracle Corporation
+; Copyright (C) 2006-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
@@ -34,9 +34,12 @@
     .u64TSC                     resq 1
     .u64CpuHz                   resq 1
+    .i64TSCDelta                resq 1
     .cErrors                    resd 1
     .iTSCHistoryHead            resd 1
     .au32TSCHistory             resd 8
     .u32PrevUpdateIntervalNS    resd 1
-    .au32Reserved               resd (5+5)
+    .au32Reserved0              resd (5)
+    .u64TSCSample               resq 1
+    .au32Reserved1              resd (1)
     .enmState                   resd 1
     .idCpu                      resd 1
Index: /trunk/include/iprt/mangling.h
===================================================================
--- /trunk/include/iprt/mangling.h	(revision 52617)
+++ /trunk/include/iprt/mangling.h	(revision 52618)
@@ -11,5 +11,5 @@
 
 /*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -967,4 +967,5 @@
 # define RTMpNotificationRegister                       RT_MANGLER(RTMpNotificationRegister)   /* r0drv */
 # define RTMpOnAll                                      RT_MANGLER(RTMpOnAll)                  /* r0drv */
+# define RTMpOnAllIsConcurrentSafe                      RT_MANGLER(RTMpOnAllIsConcurrentSafe)  /* r0drv */
 # define RTMpOnOthers                                   RT_MANGLER(RTMpOnOthers)               /* r0drv */
 # define RTMpOnSpecific                                 RT_MANGLER(RTMpOnSpecific)             /* r0drv */
@@ -1398,5 +1399,4 @@
 # define RTSpinlockDestroy                              RT_MANGLER(RTSpinlockDestroy)
 # define RTSpinlockRelease                              RT_MANGLER(RTSpinlockRelease)
-# define RTSpinlockReleaseNoInts                        RT_MANGLER(RTSpinlockReleaseNoInts)
 # define RTStrAAppendExNVTag                            RT_MANGLER(RTStrAAppendExNVTag)
 # define RTStrAAppendNTag                               RT_MANGLER(RTStrAAppendNTag)
Index: /trunk/include/iprt/mp.h
===================================================================
--- /trunk/include/iprt/mp.h	(revision 52617)
+++ /trunk/include/iprt/mp.h	(revision 52618)
@@ -4,5 +4,5 @@
 
 /*
- * Copyright (C) 2008-2010 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -247,4 +247,16 @@
 
 /**
+ * Checks if the RTMpOnAll() is safe with regards to all threads executing
+ * concurrently.
+ *
+ * If for instance, the RTMpOnAll() is implemented in a way where the threads
+ * might cause a classic deadlock, it is considered -not- concurrent safe.
+ * Windows currently is one such platform where it isn't safe.
+ *
+ * @returns true if RTMpOnAll() is concurrent safe, false otherwise.
+ */
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void);
+
+/**
  * Executes a function on each (online) CPU in the system.
  *
Index: /trunk/include/iprt/spinlock.h
===================================================================
--- /trunk/include/iprt/spinlock.h	(revision 52617)
+++ /trunk/include/iprt/spinlock.h	(revision 52618)
@@ -4,5 +4,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -84,7 +84,4 @@
 RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock);
 
-/* Temporarily, only for checking the spinlock creation flags. */
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock);
-
 
 /** @} */
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -399,5 +399,5 @@
             rc = VERR_GENERAL_FAILURE;
 
-        RTSpinlockReleaseNoInts(g_Spinlock);
+        RTSpinlockRelease(g_Spinlock);
 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
         kauth_cred_unref(&pCred);
@@ -456,5 +456,5 @@
     while (pSession && pSession->Process != Process && (/*later: pSession->fUnrestricted != fUnrestricted ||*/  !pSession->fOpened))
         pSession = pSession->pNextHash;
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku-stubs.c
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku-stubs.c	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku-stubs.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -319,8 +319,4 @@
     g_VBoxGuest->_RTSpinlockRelease(Spinlock);
 }
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-    g_VBoxGuest->_RTSpinlockReleaseNoInts(Spinlock);
-}
 RTDECL(void*) RTMemTmpAllocTag(size_t cb, const char *pszTag)
 {
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.c
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.c	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -174,5 +174,4 @@
     RTSpinlockAcquire,
     RTSpinlockRelease,
-    RTSpinlockReleaseNoInts,
     RTMemTmpAllocTag,
     RTMemTmpFree,
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.h
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.h	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-haiku.h	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -177,5 +177,4 @@
     void (*_RTSpinlockAcquire)(RTSPINLOCK Spinlock);
     void (*_RTSpinlockRelease)(RTSPINLOCK Spinlock);
-    void (*_RTSpinlockReleaseNoInts)(RTSPINLOCK Spinlock);
     void* (*_RTMemTmpAllocTag)(size_t cb, const char *pszTag);
     void (*_RTMemTmpFree)(void *pv);
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-os2.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-os2.cpp	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-os2.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2007-2013 Oracle Corporation
+ * Copyright (C) 2007-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -373,5 +373,5 @@
         pSession->pNextHash = g_apSessionHashTab[iHash];
         g_apSessionHashTab[iHash] = pSession;
-        RTSpinlockReleaseNoInts(g_Spinlock);
+        RTSpinlockRelease(g_Spinlock);
     }
 
@@ -422,5 +422,5 @@
         }
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
@@ -455,5 +455,5 @@
                      || pSession->Process != Process));
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (RT_UNLIKELY(!pSession))
     {
@@ -546,5 +546,5 @@
                      || pSession->Process != Process));
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 52617)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 52618)
@@ -117,5 +117,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
     if (pu32OtherVal)
@@ -287,5 +287,5 @@
             vboxGuestSetMouseStatus(pStatusReq, fMouseStatus);
     }
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     if (pFilterReq)
         VbglGRFree(&pFilterReq->header);
@@ -1181,5 +1181,5 @@
     RTSpinlockAcquire(pDevExt->SessionSpinlock);
     RTListAppend(&pDevExt->SessionList, &pSession->ListNode);
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
 
     *ppSession = pSession;
@@ -1214,5 +1214,5 @@
     RTSpinlockAcquire(pDevExt->SessionSpinlock);
     RTListAppend(&pDevExt->SessionList, &pSession->ListNode);
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
 
     *ppSession = pSession;
@@ -1238,5 +1238,5 @@
     RTSpinlockAcquire(pDevExt->SessionSpinlock);
     RTListNodeRemove(&pSession->ListNode);
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     VBoxGuestCommonGuestCapsAcquire(pDevExt, pSession, 0, UINT32_MAX, VBOXGUESTCAPSACQUIRE_FLAGS_NONE);
 
@@ -1291,5 +1291,5 @@
             RTListNodeRemove(&pWait->ListNode);
 
-        RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+        RTSpinlockRelease(pDevExt->EventSpinlock);
     }
     if (!pWait)
@@ -1376,5 +1376,5 @@
     RTSpinlockAcquire(pDevExt->EventSpinlock);
     VBoxGuestWaitFreeLocked(pDevExt, pWait);
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 }
 
@@ -1401,5 +1401,5 @@
                 break;
             pWait->fPendingWakeUp = true;
-            RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+            RTSpinlockRelease(pDevExt->EventSpinlock);
 
             rc = RTSemEventMultiSignal(pWait->Event);
@@ -1419,5 +1419,5 @@
             }
         }
-        RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+        RTSpinlockRelease(pDevExt->EventSpinlock);
     }
 }
@@ -1512,5 +1512,5 @@
     RTSpinlockAcquire(pDevExt->EventSpinlock);
     pDevExt->MouseNotifyCallback = *pNotify;
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
     return VINF_SUCCESS;
 }
@@ -1531,5 +1531,5 @@
     if (fMatches || pSession->fPendingCancelWaitEvents)
     {
-        RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+        RTSpinlockRelease(pDevExt->EventSpinlock);
 
         pInfo->u32EventFlagsOut = fMatches;
@@ -1543,5 +1543,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
     return VERR_TIMEOUT;
 }
@@ -1627,5 +1627,5 @@
     fResEvents = pWait->fResEvents;
     VBoxGuestWaitFreeLocked(pDevExt, pWait);
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
     /*
@@ -1706,5 +1706,5 @@
     if (!fCancelledOne)
         pSession->fPendingCancelWaitEvents = true;
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
     Assert(rc == 0);
     NOREF(rc);
@@ -1987,5 +1987,5 @@
     pSession->fFilterMask |= pInfo->u32OrMask;
     pSession->fFilterMask &= ~pInfo->u32NotMask;
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     rc = vboxGuestUpdateHostFlags(pDevExt, pSession, HostFlags_FilterMask);
     return rc;
@@ -2005,5 +2005,5 @@
     pSession->fCapabilities |= pInfo->u32OrMask;
     pSession->fCapabilities &= ~pInfo->u32NotMask;
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     rc = vboxGuestUpdateHostFlags(pDevExt, pSession, HostFlags_Capabilities);
     return rc;
@@ -2034,5 +2034,5 @@
     RTSpinlockAcquire(pDevExt->SessionSpinlock);
     pSession->fMouseStatus = fFeatures;
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     rc = vboxGuestUpdateHostFlags(pDevExt, pSession, HostFlags_MouseStatus);
     return rc;
@@ -2062,8 +2062,8 @@
         if ((pHdr->fu32Flags & VBOX_HGCM_REQ_DONE) != 0)
         {
-            RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+            RTSpinlockRelease(pDevExt->EventSpinlock);
             return VINF_SUCCESS;
         }
-        RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+        RTSpinlockRelease(pDevExt->EventSpinlock);
 
         pWait = VBoxGuestWaitAlloc(pDevExt, NULL);
@@ -2087,8 +2087,8 @@
     {
         VBoxGuestWaitFreeLocked(pDevExt, pWait);
-        RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+        RTSpinlockRelease(pDevExt->EventSpinlock);
         return VINF_SUCCESS;
     }
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
     if (fInterruptible)
@@ -2180,5 +2180,5 @@
                     break;
                 }
-            RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+            RTSpinlockRelease(pDevExt->SessionSpinlock);
             if (i >= RT_ELEMENTS(pSession->aHGCMClientIds))
             {
@@ -2218,5 +2218,5 @@
             break;
         }
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     if (i >= RT_ELEMENTS(pSession->aHGCMClientIds))
     {
@@ -2245,5 +2245,5 @@
     if (pSession->aHGCMClientIds[i] == UINT32_MAX)
         pSession->aHGCMClientIds[i] = RT_SUCCESS(rc) && RT_SUCCESS(pInfo->result) ? 0 : u32ClientId;
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
 
     return rc;
@@ -2293,5 +2293,5 @@
         if (pSession->aHGCMClientIds[i] == u32ClientId)
             break;
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
+    RTSpinlockRelease(pDevExt->SessionSpinlock);
     if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds)))
     {
@@ -2579,5 +2579,5 @@
     ASMAtomicWriteU32(&pDevExt->f32PendingEvents, fEvents);
 
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP
@@ -2655,5 +2655,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
     if (fOtherConflictingCaps)
@@ -3073,5 +3073,5 @@
 #endif
 
-    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+    RTSpinlockRelease(pDevExt->EventSpinlock);
 
 #if defined(VBOXGUEST_USE_DEFERRED_WAKE_UP) && !defined(RT_OS_DARWIN) && !defined(RT_OS_WINDOWS)
Index: /trunk/src/VBox/Devices/Bus/SrvPciRawR0.cpp
===================================================================
--- /trunk/src/VBox/Devices/Bus/SrvPciRawR0.cpp	(revision 52617)
+++ /trunk/src/VBox/Devices/Bus/SrvPciRawR0.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -115,5 +115,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     pThis->iPendingIrq = iHostIrq;
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     /**
@@ -872,5 +872,5 @@
     pDev->iPendingIrq = 0;
     fTerminate = pDev->fTerminate;
-    RTSpinlockReleaseNoInts(pDev->hSpinlock);
+    RTSpinlockRelease(pDev->hSpinlock);
 
     /* Block until new IRQs arrives */
@@ -888,5 +888,5 @@
                     iPendingIrq = pDev->iPendingIrq;
                     pDev->iPendingIrq = 0;
-                    RTSpinlockReleaseNoInts(pDev->hSpinlock);
+                    RTSpinlockRelease(pDev->hSpinlock);
                 }
                 else
Index: /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp	(revision 52617)
+++ /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp	(revision 52618)
@@ -4,5 +4,5 @@
  *
  * @remarks No lazy code changes.  If you don't understand exactly what you're
- *          doing, get an understand or forget it.
+ *          doing, get an understanding or forget it.
  *          All changes shall be reviewed by bird before commit.  If not around,
  *          email and let Frank and/or Klaus OK the changes before committing.
@@ -1182,5 +1182,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 }
 
@@ -1215,5 +1215,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 }
 
@@ -1242,10 +1242,10 @@
         {
             intnetR0BusyIncIf(pIf);
-            RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+            RTSpinlockRelease(pNetwork->hAddrSpinlock);
             return pIf;
         }
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return NULL;
 }
@@ -1272,5 +1272,5 @@
     {
         /* This shouldn't happen*/
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
         return;
     }
@@ -1313,5 +1313,5 @@
     Assert(pCache->cEntries <= pCache->cEntriesAlloc);
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 }
 
@@ -1570,5 +1570,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return pDstTab->cIfs
          ? (!pDstTab->fTrunkDst ? INTNETSWDECISION_INTNET : INTNETSWDECISION_BROADCAST)
@@ -1631,5 +1631,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return enmSwDecision;
 }
@@ -1744,5 +1744,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return pDstTab->cIfs
          ? (!pDstTab->fTrunkDst ? INTNETSWDECISION_INTNET : INTNETSWDECISION_BROADCAST)
@@ -1806,5 +1806,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return INTNETSWDECISION_BROADCAST;
 }
@@ -1867,5 +1867,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return !pDstTab->cIfs
         ? (!pDstTab->fTrunkDst ? INTNETSWDECISION_DROP   : INTNETSWDECISION_TRUNK)
@@ -1909,5 +1909,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     return pDstTab->fTrunkDst ? INTNETSWDECISION_TRUNK : INTNETSWDECISION_DROP;
 }
@@ -2003,5 +2003,5 @@
                         if (pvOld)
                             *ppDstTab = pNew;
-                        RTSpinlockReleaseNoInts(pTrunk->hDstTabSpinlock);
+                        RTSpinlockRelease(pTrunk->hDstTabSpinlock);
                         if (pvOld)
                         {
@@ -2037,5 +2037,5 @@
                     pTab->cEntriesAllocated = cAllocated;
 
-                    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+                    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
                     RTMemFree(paOld);
@@ -2150,5 +2150,5 @@
                 }
 
-                RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+                RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
                 if (pMatchingIf)
@@ -2183,5 +2183,5 @@
             }
 
-            RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+            RTSpinlockRelease(pNetwork->hAddrSpinlock);
             break;
         }
@@ -2646,5 +2646,5 @@
     RTSpinlockAcquire(pIf->hRecvInSpinlock);
     int rc = intnetR0RingWriteFrame(&pIf->pIntBuf->Recv, pSG, pNewDstMac);
-    RTSpinlockReleaseNoInts(pIf->hRecvInSpinlock);
+    RTSpinlockRelease(pIf->hRecvInSpinlock);
     if (RT_SUCCESS(rc))
     {
@@ -2673,5 +2673,5 @@
             RTSpinlockAcquire(pIf->hRecvInSpinlock);
             rc = intnetR0RingWriteFrame(&pIf->pIntBuf->Recv, pSG, pNewDstMac);
-            RTSpinlockReleaseNoInts(pIf->hRecvInSpinlock);
+            RTSpinlockRelease(pIf->hRecvInSpinlock);
             if (RT_SUCCESS(rc))
             {
@@ -3223,5 +3223,5 @@
     else
         memset(&MacAddrTrunk, 0, sizeof(MacAddrTrunk));
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
     if (    ar_oper == RTNET_ARPOP_REPLY
         &&  !memcmp(&pArpIPv4->ar_tha, &MacAddrTrunk, sizeof(RTMAC)))
@@ -3441,5 +3441,5 @@
                 && (!pNetwork->MacTab.fWireActive || (pTrunk->fNoPreemptDsts & INTNETTRUNKDIR_WIRE) ) );
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
     return fRc;
@@ -3783,5 +3783,5 @@
         pIfSender->MacAddr    = EthHdr.SrcMac;
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
     }
 
@@ -4154,5 +4154,5 @@
         }
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
     }
     else
@@ -4238,5 +4238,5 @@
         }
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
         if (pTrunk)
@@ -4337,5 +4337,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
     /*
@@ -4742,5 +4742,5 @@
         PINTNETTRUNKIF pTrunk = pNetwork->MacTab.pTrunk;
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
         /* Notify the trunk about the interface being destroyed. */
@@ -4754,5 +4754,5 @@
         RTSpinlockAcquire(pNetwork->hAddrSpinlock);
         pIf->pNetwork = NULL;
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
         SUPR0ObjRelease(pNetwork->pvObj, pIf->pSession);
@@ -4968,5 +4968,5 @@
                         intnetR0BusyIncTrunk(pTrunk);
 
-                    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+                    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
                     if (pTrunk)
@@ -5041,5 +5041,5 @@
         pThis->MacAddr           = *pMacAddr;
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
     }
     else
@@ -5069,5 +5069,5 @@
                                              && (pNetwork->fFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST);
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
     }
     intnetR0BusyDecTrunk(pThis);
@@ -5148,5 +5148,5 @@
             RTSpinlockAcquire(pNetwork->hAddrSpinlock);
             pNetwork->MacTab.pTrunk = NULL;
-            RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+            RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
             intnetR0TrunkIfDestroy(pThis, pNetwork);
@@ -5252,5 +5252,5 @@
                 }
             }
-            RTSpinlockReleaseNoInts(pThis->hDstTabSpinlock);
+            RTSpinlockRelease(pThis->hDstTabSpinlock);
             Assert(!pDstTab || iDstTab < pThis->cIntDstTabs);
         }
@@ -5265,10 +5265,10 @@
             {
                 pThis->apIntDstTabs[iDstTab] = NULL;
-                RTSpinlockReleaseNoInts(pThis->hDstTabSpinlock);
+                RTSpinlockRelease(pThis->hDstTabSpinlock);
                 Assert(iDstTab < RT_ELEMENTS(pThis->apTaskDstTabs));
             }
             else
             {
-                RTSpinlockReleaseNoInts(pThis->hDstTabSpinlock);
+                RTSpinlockRelease(pThis->hDstTabSpinlock);
                 intnetR0AllocDstTab(pNetwork->MacTab.cEntriesAllocated, &pDstTab);
                 iDstTab = 65535;
@@ -5309,5 +5309,5 @@
                         }
                 }
-                RTSpinlockReleaseNoInts(pThis->hDstTabSpinlock);
+                RTSpinlockRelease(pThis->hDstTabSpinlock);
                 Assert(iDstTab < RT_MAX(RT_ELEMENTS(pThis->apTaskDstTabs), pThis->cIntDstTabs));
             }
@@ -5663,5 +5663,5 @@
     pNetwork->MacTab.fWireActive = false;
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
     /* Wait for all the interfaces to quiesce.  (Interfaces cannot be
@@ -5699,5 +5699,5 @@
     pNetwork->MacTab.pTrunk = NULL;
 
-    RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+    RTSpinlockRelease(pNetwork->hAddrSpinlock);
 
     if (pTrunk)
@@ -5891,5 +5891,5 @@
         }
 
-        RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock);
+        RTSpinlockRelease(pNetwork->hAddrSpinlock);
     }
 
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrv.c
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrv.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrv.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -93,4 +93,32 @@
  * u32UpdateIntervalNS GIP members. The value must be a power of 2. */
 #define GIP_UPDATEHZ_RECALC_FREQ            0x800
+
+/** A reserved TSC value used for synchronization as well as measurement of
+ *  TSC deltas. */
+#define GIP_TSC_DELTA_RSVD                  UINT64_MAX
+/** The number of TSC delta measurement loops in total (includes primer and
+ *  read-time loops). */
+#define GIP_TSC_DELTA_LOOPS                 96
+/** The number of cache primer loops. */
+#define GIP_TSC_DELTA_PRIMER_LOOPS          4
+/** The number of loops until we keep computing the minumum read time. */
+#define GIP_TSC_DELTA_READ_TIME_LOOPS       24
+/** Stop measurement of TSC delta. */
+#define GIP_TSC_DELTA_SYNC_STOP             0
+/** Start measurement of TSC delta. */
+#define GIP_TSC_DELTA_SYNC_START            1
+/** Worker thread is ready for reading the TSC. */
+#define GIP_TSC_DELTA_SYNC_WORKER_READY     2
+/** Worker thread is done updating TSC delta info. */
+#define GIP_TSC_DELTA_SYNC_WORKER_DONE      3
+/** When IPRT is isn't concurrent safe: Master is ready and will wait for slave
+ *  with a timeout. */
+#define GIP_TSC_DELTA_SYNC_PRESTART_MASTER  4
+/** When IPRT is isn't concurrent safe: Worker is ready after waiting for
+ *  master with a timeout. */
+#define GIP_TSC_DELTA_SYNC_PRESTART_WORKER  5
+
+AssertCompile(GIP_TSC_DELTA_PRIMER_LOOPS < GIP_TSC_DELTA_READ_TIME_LOOPS);
+AssertCompile(GIP_TSC_DELTA_PRIMER_LOOPS + GIP_TSC_DELTA_READ_TIME_LOOPS < GIP_TSC_DELTA_LOOPS);
 
 /** @def VBOX_SVN_REV
@@ -139,4 +167,5 @@
                                                   RTCPUID idCpu, uint8_t idApic, uint64_t iTick);
 static void                 supdrvGipInitCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pCpu, uint64_t u64NanoTS);
+static int                  supdrvMeasureTscDeltas(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, uint32_t *pidxMaster);
 static int                  supdrvIOCtl_ResumeSuspendedKbds(void);
 
@@ -146,4 +175,27 @@
 *******************************************************************************/
 DECLEXPORT(PSUPGLOBALINFOPAGE) g_pSUPGlobalInfoPage = NULL;
+
+/**
+ * The TSC delta synchronization struct. rounded to cache line size.
+ */
+typedef union SUPTSCDELTASYNC
+{
+    /** The synchronization variable, holds values GIP_TSC_DELTA_SYNC_*. */
+    volatile uint32_t   u;
+    /** Padding to cache line size. */
+    uint8_t             u8Padding[64];
+} SUPTSCDELTASYNC;
+AssertCompileSize(SUPTSCDELTASYNC, 64);
+typedef SUPTSCDELTASYNC *PSUPTSCDELTASYNC;
+
+/** Pointer to the TSC delta sync. struct. */
+static void                *g_pvTscDeltaSync;
+/** Aligned pointer to the TSC delta sync. struct. */
+static PSUPTSCDELTASYNC     g_pTscDeltaSync;
+/** The TSC delta measurement initiator Cpu Id. */
+static volatile RTCPUID     g_idTscDeltaInitiator = NIL_RTCPUID;
+/** Number of online/offline events, incremented each time a CPU goes online
+ *  or offline. */
+static volatile uint32_t    g_cMpOnOffEvents;
 
 /**
@@ -354,5 +406,4 @@
     { "RTSpinlockDestroy",                      (void *)RTSpinlockDestroy },
     { "RTSpinlockRelease",                      (void *)RTSpinlockRelease },
-    { "RTSpinlockReleaseNoInts",                (void *)RTSpinlockReleaseNoInts },
     { "RTStrCopy",                              (void *)RTStrCopy },
     { "RTStrDupTag",                            (void *)RTStrDupTag },
@@ -3957,5 +4008,5 @@
                 if (pGipR0->aCPUs[0].u32TransactionId != 2 /* not the first time */)
                 {
-                    for (i = 0; i < RT_ELEMENTS(pGipR0->aCPUs); i++)
+                    for (i = 0; i < pGipR0->cCpus; i++)
                         ASMAtomicUoWriteU32(&pGipR0->aCPUs[i].u32TransactionId,
                                             (pGipR0->aCPUs[i].u32TransactionId + GIP_UPDATEHZ_RECALC_FREQ * 2)
@@ -5581,47 +5632,78 @@
     supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), 1000000000 / u32Interval /*=Hz*/, cCpus);
 
-    /*
-     * Create the timer.
-     * If CPU_ALL isn't supported we'll have to fall back to synchronous mode.
-     */
-    if (pGip->u32Mode == SUPGIPMODE_ASYNC_TSC)
-    {
-        rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, RTTIMER_FLAGS_CPU_ALL, supdrvGipAsyncTimer, pDevExt);
-        if (rc == VERR_NOT_SUPPORTED)
-        {
-            OSDBGPRINT(("supdrvGipCreate: omni timer not supported, falling back to synchronous mode\n"));
-            pGip->u32Mode = SUPGIPMODE_SYNC_TSC;
-        }
-    }
-    if (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC)
-        rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, 0 /* fFlags */, supdrvGipSyncTimer, pDevExt);
+    rc = RTMpNotificationRegister(supdrvGipMpEvent, pDevExt);
     if (RT_SUCCESS(rc))
     {
-        rc = RTMpNotificationRegister(supdrvGipMpEvent, pDevExt);
+        rc = RTMpOnAll(supdrvGipInitOnCpu, pDevExt, pGip);
         if (RT_SUCCESS(rc))
         {
-            rc = RTMpOnAll(supdrvGipInitOnCpu, pDevExt, pGip);
+            /*
+             * Measure the TSC deltas now that we have MP notifications.
+             */
+            unsigned cTries = 5;
+#if 0
+            do
+            {
+                rc = supdrvMeasureTscDeltas(pDevExt, pGip, NULL /* pidxMaster */);
+                if (rc == VERR_TRY_AGAIN)
+                {
+                    --cTries;
+                    continue;
+                }
+                else
+                    break;
+            } while (cTries > 0);
+#endif
+
             if (RT_SUCCESS(rc))
             {
+#if 0
+                unsigned iCpu;
+                SUPR0Printf("cTries=%u\n", cTries);
+                for (iCpu = 0; iCpu < pGip->cCpus; iCpu++)
+                    SUPR0Printf("Cpu[%3u].delta=%ld\n", iCpu, pGip->aCPUs[iCpu].i64TSCDelta);
+#endif
+
                 /*
-                 * We're good.
+                 * Create the timer.
+                 * If CPU_ALL isn't supported we'll have to fall back to synchronous mode.
                  */
-                Log(("supdrvGipCreate: %u ns interval.\n", u32Interval));
-                g_pSUPGlobalInfoPage = pGip;
-                return VINF_SUCCESS;
-            }
-
+                if (pGip->u32Mode == SUPGIPMODE_ASYNC_TSC)
+                {
+                    rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, RTTIMER_FLAGS_CPU_ALL, supdrvGipAsyncTimer, pDevExt);
+                    if (rc == VERR_NOT_SUPPORTED)
+                    {
+                        OSDBGPRINT(("supdrvGipCreate: omni timer not supported, falling back to synchronous mode\n"));
+                        pGip->u32Mode = SUPGIPMODE_SYNC_TSC;
+                    }
+                }
+                if (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC)
+                    rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, 0 /* fFlags */, supdrvGipSyncTimer, pDevExt);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * We're good.
+                     */
+                    Log(("supdrvGipCreate: %u ns interval.\n", u32Interval));
+                    g_pSUPGlobalInfoPage = pGip;
+                    return VINF_SUCCESS;
+                }
+                else
+                {
+                    OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %u ns interval. rc=%Rrc\n", u32Interval, rc));
+                    Assert(!pDevExt->pGipTimer);
+                }
+            }
+            else
+                OSDBGPRINT(("supdrvGipCreate: supdrvMeasureTscDeltas() failed with rc=%Rrc after %u tries!\n", rc, cTries));
+        }
+        else
             OSDBGPRINT(("supdrvGipCreate: RTMpOnAll failed with rc=%Rrc\n", rc));
-            RTMpNotificationDeregister(supdrvGipMpEvent, pDevExt);
-
-        }
-        else
-            OSDBGPRINT(("supdrvGipCreate: failed to register MP event notfication. rc=%Rrc\n", rc));
+
+        RTMpNotificationDeregister(supdrvGipMpEvent, pDevExt);
     }
     else
-    {
-        OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %u ns interval. rc=%Rrc\n", u32Interval, rc));
-        Assert(!pDevExt->pGipTimer);
-    }
+        OSDBGPRINT(("supdrvGipCreate: failed to register MP event notfication. rc=%Rrc\n", rc));
+
     supdrvGipDestroy(pDevExt);
     return rc;
@@ -5811,8 +5893,11 @@
     ASMAtomicWriteU16(&pGip->aiCpuFromCpuSetIdx[iCpuSet], i);
 
+    /* Update the Mp online/offline counter. */
+    ASMAtomicIncU32(&g_cMpOnOffEvents);
+
     /* commit it */
     ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_ONLINE);
 
-    RTSpinlockReleaseNoInts(pDevExt->hGipSpinlock);
+    RTSpinlockRelease(pDevExt->hGipSpinlock);
 }
 
@@ -5846,8 +5931,18 @@
     RTCpuSetDelByIndex(&pGip->OnlineCpuSet, iCpuSet);
 
+    /* Update the Mp online/offline counter. */
+    ASMAtomicIncU32(&g_cMpOnOffEvents);
+
+    /* If we are the initiator going offline while measuring the TSC delta, unspin other waiting CPUs! */
+    if (ASMAtomicReadU32(&g_idTscDeltaInitiator) == idCpu)
+    {
+        ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_START);
+        ASMAtomicWriteU64(&pGip->aCPUs[i].u64TSCSample, ~GIP_TSC_DELTA_RSVD);
+    }
+
     /* commit it */
     ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_OFFLINE);
 
-    RTSpinlockReleaseNoInts(pDevExt->hGipSpinlock);
+    RTSpinlockRelease(pDevExt->hGipSpinlock);
 }
 
@@ -5929,4 +6024,300 @@
 
 /**
+ * Callback used by supdrvMeasureTscDeltas() to read the TSC on two CPUs and
+ * compute the delta between them.
+ *
+ * @param   idCpu       The CPU we are current scheduled on.
+ * @param   pvUser1     Opaque pointer to the GIP.
+ * @param   pvUser2     Opaque pointer to the worker Cpu Id.
+ *
+ * @remarks Measuring TSC deltas between the CPUs is tricky because we need to
+ *     read the TSC at exactly the same time on both the master and the worker
+ *     CPUs. Due to DMA, bus arbitration, cache locality, contention etc. there
+ *     is no guaranteed way of doing this on x86 CPUs. We try to minimize the
+ *     measurement error by computing the minimum read time of the compare
+ *     statement in the slave by taking TSC measurements across it. We also
+ *     ignore the first few runs of the loop in order to prime the cache.
+ *
+ *     It must be noted that the computed minimum read time is mostly to
+ *     eliminate huge deltas when the slave is too early and doesn't by itself
+ *     help produce more accurate deltas. We allow two times the computed
+ *     minimum as an arbibtrary acceptable threshold. Therefore, it is still
+ *     possible to get negative deltas where there are none when the slave is
+ *     earlier.
+ */
+static DECLCALLBACK(void) supdrvDetermineTscDeltaCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2)
+{
+    PSUPGLOBALINFOPAGE pGip      = (PSUPGLOBALINFOPAGE)pvUser1;
+    uint32_t          *pidWorker = (uint32_t *)pvUser2;
+    RTCPUID            idMaster  = ASMAtomicUoReadU32(&g_idTscDeltaInitiator);
+    unsigned           idxMaster = supdrvGipCpuIndexFromCpuId(pGip, idMaster);
+    unsigned           idxWorker = supdrvGipCpuIndexFromCpuId(pGip, *pidWorker);
+    PSUPGIPCPU         pGipCpuMaster = &pGip->aCPUs[idxMaster];
+    PSUPGIPCPU         pGipCpuWorker = &pGip->aCPUs[idxWorker];
+    uint64_t           uMinCmpReadTime = UINT64_MAX;
+    int                cTriesLeft = 8;
+
+    if (   idCpu != idMaster
+        && idCpu != *pidWorker)
+        return;
+
+    /* If the IPRT API isn't concurrent safe, the master and worker wait for each other
+       with a timeout to avoid deadlocking the entire system. */
+    if (!RTMpOnAllIsConcurrentSafe())
+    {
+        uint64_t       uTscNow;
+        uint64_t       uTscStart;
+        uint64_t const cWaitTicks = 130000;  /* Arbitrary value, can be tweaked later. */
+
+        ASMSerializeInstruction();
+        uTscStart = ASMReadTSC();
+        if (idCpu == idMaster)
+        {
+            ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_PRESTART_MASTER);
+            while (ASMAtomicReadU32(&g_pTscDeltaSync->u) != GIP_TSC_DELTA_SYNC_PRESTART_WORKER)
+            {
+                ASMSerializeInstruction();
+                uTscNow = ASMReadTSC();
+                if (uTscNow - uTscStart > cWaitTicks)
+                {
+                    /* Set the worker delta to indicate failure, not the master. */
+                    ASMAtomicWriteS64(&pGipCpuWorker->i64TSCDelta, INT64_MAX);
+                    return;
+                }
+
+                ASMNopPause();
+            }
+        }
+        else
+        {
+            while (ASMAtomicReadU32(&g_pTscDeltaSync->u) != GIP_TSC_DELTA_SYNC_PRESTART_MASTER)
+            {
+                ASMSerializeInstruction();
+                uTscNow = ASMReadTSC();
+                if (uTscNow - uTscStart > cWaitTicks)
+                {
+                    ASMAtomicWriteS64(&pGipCpuWorker->i64TSCDelta, INT64_MAX);
+                    return;
+                }
+
+                ASMNopPause();
+            }
+            ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_PRESTART_WORKER);
+        }
+    }
+
+    Assert(pGipCpuWorker->i64TSCDelta == INT64_MAX);
+    while (cTriesLeft-- > 0)
+    {
+        unsigned i;
+        RTCCUINTREG uFlags = ASMIntDisableFlags();          /* Disable interrupts for the duration of a try. */
+        for (i = 0; i < GIP_TSC_DELTA_LOOPS; i++)
+        {
+            if (idCpu == idMaster)
+            {
+                /*
+                 * The master.
+                 */
+                Assert(pGipCpuMaster->u64TSCSample == GIP_TSC_DELTA_RSVD);
+                ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_START);
+                while (ASMAtomicReadU32(&g_pTscDeltaSync->u) == GIP_TSC_DELTA_SYNC_START)
+                    ;
+
+                do
+                {
+                    ASMSerializeInstruction();
+                    ASMAtomicWriteU64(&pGipCpuMaster->u64TSCSample, ASMReadTSC());
+                } while (pGipCpuMaster->u64TSCSample == GIP_TSC_DELTA_RSVD);
+
+                while (ASMAtomicReadU32(&g_pTscDeltaSync->u) != GIP_TSC_DELTA_SYNC_WORKER_DONE)
+                    ;
+
+                if (i > GIP_TSC_DELTA_PRIMER_LOOPS + GIP_TSC_DELTA_READ_TIME_LOOPS)
+                {
+                    if (pGipCpuWorker->u64TSCSample != GIP_TSC_DELTA_RSVD)
+                    {
+                        int64_t iDelta = pGipCpuWorker->u64TSCSample - pGipCpuMaster->u64TSCSample;
+                        if (iDelta < pGipCpuWorker->i64TSCDelta)
+                            pGipCpuWorker->i64TSCDelta = iDelta;
+                    }
+                }
+
+                ASMAtomicWriteU64(&pGipCpuMaster->u64TSCSample, GIP_TSC_DELTA_RSVD);
+                ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_STOP);
+            }
+            else
+            {
+                /*
+                 * The worker.
+                 */
+                uint64_t uTscWorker;
+                uint64_t uTscWorkerFlushed;
+                uint64_t uCmpReadTime;
+
+                ASMAtomicReadU64(&pGipCpuMaster->u64TSCSample);     /* Warm the cache line. */
+                while (ASMAtomicReadU32(&g_pTscDeltaSync->u) != GIP_TSC_DELTA_SYNC_START)
+                    ;
+                ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_WORKER_READY);
+
+                /*
+                 * Keep reading the TSC until we notice that the master has read his. Reading
+                 * the TSC -after- the master has updated the memory is way too late. We thus
+                 * compensate by trying to measure how long it took for the slave to notice
+                 * the memory flushed from the master.
+                 */
+                do
+                {
+                    ASMSerializeInstruction();
+                    uTscWorker = ASMReadTSC();
+                } while (pGipCpuMaster->u64TSCSample == GIP_TSC_DELTA_RSVD);
+                ASMSerializeInstruction();
+                uTscWorkerFlushed = ASMReadTSC();
+
+                uCmpReadTime = uTscWorkerFlushed - uTscWorker;
+                if (i > GIP_TSC_DELTA_PRIMER_LOOPS + GIP_TSC_DELTA_READ_TIME_LOOPS)
+                {
+                    /* This is totally arbitrary a.k.a I don't like it but I have no better ideas for now. */
+                    if (uCmpReadTime < (uMinCmpReadTime << 1))
+                    {
+                        ASMAtomicWriteU64(&pGipCpuWorker->u64TSCSample, uTscWorker);
+                        if (uCmpReadTime < uMinCmpReadTime)
+                            uMinCmpReadTime = uCmpReadTime;
+                    }
+                    else
+                        ASMAtomicWriteU64(&pGipCpuWorker->u64TSCSample, GIP_TSC_DELTA_RSVD);
+                }
+                else if (i > GIP_TSC_DELTA_PRIMER_LOOPS)
+                {
+                    if (uCmpReadTime < uMinCmpReadTime)
+                        uMinCmpReadTime = uCmpReadTime;
+                }
+
+                ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_WORKER_DONE);
+                while (ASMAtomicReadU32(&g_pTscDeltaSync->u) == GIP_TSC_DELTA_SYNC_WORKER_DONE)
+                    ASMNopPause();
+            }
+        }
+        ASMSetFlags(uFlags);
+
+        if (pGipCpuWorker->i64TSCDelta != INT64_MAX)
+            break;
+    }
+}
+
+
+/**
+ * Clears all TSCs on the per-CPUs GIP struct. as well as the delta
+ * synchronization variable. Optionally also clears the deltas on the per-CPU
+ * GIP struct. as well.
+ *
+ * @param   pGip            Pointer to the GIP.
+ * @param   fClearDeltas    Whether the deltas are also to be cleared.
+ */
+DECLINLINE(void) supdrvClearTscSamples(PSUPGLOBALINFOPAGE pGip, bool fClearDeltas)
+{
+    unsigned iCpu;
+    for (iCpu = 0; iCpu < pGip->cCpus; iCpu++)
+    {
+        PSUPGIPCPU pGipCpu = &pGip->aCPUs[iCpu];
+        ASMAtomicWriteU64(&pGipCpu->u64TSCSample, GIP_TSC_DELTA_RSVD);
+        if (fClearDeltas)
+            ASMAtomicWriteS64(&pGipCpu->i64TSCDelta, INT64_MAX);
+    }
+    ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_STOP);
+}
+
+
+/**
+ * Measures the TSC deltas between CPUs.
+ *
+ * @param   pDevExt     Pointer to the device instance data.
+ * @param   pGip        Pointer to the GIP.
+ * @param   pidxMaster  Where to store the index of the chosen master TSC if we
+ *                      managed to determine the TSC deltas successfully.
+ *                      Optional, can be NULL.
+ *
+ * @returns VBox status code.
+ * @remarks Must be called only after supdrvGipInitOnCpu() as this function uses
+ *          idCpu, GIP's online CPU set which are populated in
+ *          supdrvGipInitOnCpu().
+ */
+static int supdrvMeasureTscDeltas(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, uint32_t *pidxMaster)
+{
+    PSUPGIPCPU pGipCpuMaster;
+    unsigned   iCpu;
+    uint32_t   cMpOnOffEvents = ASMAtomicReadU32(&g_cMpOnOffEvents);
+    uint32_t   cOnlineCpus    = pGip->cOnlineCpus;
+
+    /* Pick the first CPU which is online as the master TSC. */
+    uint32_t idxMaster = UINT32_MAX;
+    supdrvClearTscSamples(pGip, true /* fClearDeltas */);
+    for (iCpu = 0; iCpu < pGip->cCpus; iCpu++)
+    {
+        PSUPGIPCPU pGipCpu = &pGip->aCPUs[iCpu];
+        if (RTCpuSetIsMember(&pGip->OnlineCpuSet, pGipCpu->idCpu))
+        {
+            idxMaster = iCpu;
+            pGipCpu->i64TSCDelta = 0;
+            break;
+        }
+    }
+    AssertReturn(cOnlineCpus > 0, VERR_INTERNAL_ERROR_5);
+    AssertReturn(idxMaster != UINT32_MAX, VERR_CPU_NOT_FOUND);
+
+    if (pGip->cOnlineCpus <= 1)
+    {
+        if (pidxMaster)
+            *pidxMaster = idxMaster;
+        return VINF_SUCCESS;
+    }
+
+    /* Pick the master TSC as the initiator. */
+    pGipCpuMaster = &pGip->aCPUs[idxMaster];
+    ASMAtomicWriteU32(&g_idTscDeltaInitiator, pGipCpuMaster->idCpu);
+
+    for (iCpu = 0; iCpu < pGip->cCpus; iCpu++)
+    {
+        PSUPGIPCPU pGipCpuWorker = &pGip->aCPUs[iCpu];
+        if (   iCpu != idxMaster
+            && RTCpuSetIsMember(&pGip->OnlineCpuSet, pGipCpuWorker->idCpu))
+        {
+            int rc;
+
+            /* Fire TSC-read workers on all CPUs but only synchronize between master and one worker to memory contention. */
+            ASMAtomicWriteU32(&g_pTscDeltaSync->u, GIP_TSC_DELTA_SYNC_STOP);
+            rc = RTMpOnAll(supdrvDetermineTscDeltaCallback, pGip, &pGipCpuWorker->idCpu);
+            if (RT_FAILURE(rc))
+            {
+                SUPR0Printf("supdrvMeasureTscDeltas: RTMpOnAll failed. rc=%d\n", rc);
+                return rc;
+            }
+
+            if (RT_UNLIKELY(pGipCpuWorker->i64TSCDelta == INT64_MAX))
+            {
+                SUPR0Printf("Failed to measure TSC deltas for CPU[%u] idCpu=%u\n", iCpu, pGipCpuWorker->idCpu);
+                return VERR_UNRESOLVED_ERROR;
+            }
+
+            if (ASMAtomicReadU32(&g_cMpOnOffEvents) != cMpOnOffEvents)
+            {
+                SUPR0Printf("One or more CPUs transitioned between online & offline states. I are confused, retrying...\n");
+                return VERR_TRY_AGAIN;
+            }
+        }
+    }
+
+    ASMAtomicWriteU32(&g_idTscDeltaInitiator, NIL_RTCPUID);
+
+    if (RT_LIKELY(!pGipCpuMaster->i64TSCDelta))
+    {
+        if (pidxMaster)
+            *pidxMaster = idxMaster;
+        return VINF_SUCCESS;
+    }
+    return VERR_INTERNAL_ERROR_4;
+}
+
+
+/**
  * Callback used by supdrvDetermineAsyncTSC to read the TSC on a CPU.
  *
@@ -5937,9 +6328,5 @@
 static DECLCALLBACK(void) supdrvDetermineAsyncTscWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2)
 {
-#if 1
     ASMAtomicWriteU64((uint64_t volatile *)pvUser1, ASMReadTSC());
-#else
-    *(uint64_t *)pvUser1 = ASMReadTSC();
-#endif
 }
 
@@ -6092,4 +6479,6 @@
     pCpu->u64NanoTS          = u64NanoTS;
     pCpu->u64TSC             = ASMReadTSC();
+    pCpu->u64TSCSample       = GIP_TSC_DELTA_RSVD;
+    pCpu->i64TSCDelta        = INT64_MAX;
 
     ASMAtomicWriteSize(&pCpu->enmState, SUPGIPCPUSTATE_INVALID);
@@ -6171,4 +6560,11 @@
     pDevExt->HCPhysGip = HCPhys;
     pDevExt->cGipUsers = 0;
+
+    /*
+     * Allocate the TSC delta sync. struct. on a separate cache line.
+     */
+    g_pvTscDeltaSync = RTMemAllocZ(sizeof(SUPTSCDELTASYNC) + 63);
+    g_pTscDeltaSync  = RT_ALIGN_PT(g_pvTscDeltaSync, 64, PSUPTSCDELTASYNC);
+    Assert(RT_ALIGN_PT(g_pTscDeltaSync, 64, PSUPTSCDELTASYNC) == g_pTscDeltaSync);
 }
 
@@ -6198,9 +6594,18 @@
     unsigned i;
     pGip->u32Magic = 0;
-    for (i = 0; i < RT_ELEMENTS(pGip->aCPUs); i++)
+    for (i = 0; i < pGip->cCpus; i++)
     {
         pGip->aCPUs[i].u64NanoTS = 0;
         pGip->aCPUs[i].u64TSC = 0;
         pGip->aCPUs[i].iTSCHistoryHead = 0;
+        pGip->aCPUs[i].u64TSCSample = 0;
+        pGip->aCPUs[i].i64TSCDelta = INT64_MAX;
+    }
+
+    if (g_pvTscDeltaSync)
+    {
+        RTMemFree(g_pvTscDeltaSync);
+        g_pTscDeltaSync  = NULL;
+        g_pvTscDeltaSync = NULL;
     }
 }
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -200,7 +200,7 @@
  *
  * @todo Pending work on next major version change:
- *          - Remove RTSpinlockReleaseNoInts.
- */
-#define SUPDRV_IOC_VERSION                              0x001a0007
+ *          - (none).
+ */
+#define SUPDRV_IOC_VERSION                              0x001b0000
 
 /** SUP_IOCTL_COOKIE. */
Index: /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -474,5 +474,4 @@
         { "RTSpinlockRelease",                      0xefef0031 },
         { "RTSpinlockAcquireNoInts",                0xefef0032 },
-        { "RTSpinlockReleaseNoInts",                0xefef0033 },
         { "RTTimeNanoTS",                           0xefef0034 },
         { "RTTimeMillieTS",                         0xefef0035 },
Index: /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 52618)
@@ -505,5 +505,5 @@
             rc = VERR_GENERAL_FAILURE;
 
-        RTSpinlockReleaseNoInts(g_Spinlock);
+        RTSpinlockRelease(g_Spinlock);
 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
         kauth_cred_unref(&pCred);
@@ -571,5 +571,5 @@
         supdrvSessionRetain(pSession);
 
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (RT_UNLIKELY(!pSession))
     {
@@ -1478,5 +1478,5 @@
                     rc = VERR_ALREADY_LOADED;
 
-                RTSpinlockReleaseNoInts(g_Spinlock);
+                RTSpinlockRelease(g_Spinlock);
                 if (RT_SUCCESS(rc))
                 {
@@ -1541,5 +1541,5 @@
         }
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
Index: /trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 52618)
@@ -163,5 +163,5 @@
         pSession->pNextHash = g_apSessionHashTab[iHash];
         g_apSessionHashTab[iHash] = pSession;
-        RTSpinlockReleaseNoInts(g_Spinlock);
+        RTSpinlockRelease(g_Spinlock);
     }
 
@@ -212,5 +212,5 @@
         }
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
@@ -248,5 +248,5 @@
             supdrvSessionRetain(pSession);
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (RT_UNLIKELY(!pSession))
     {
@@ -285,5 +285,5 @@
             supdrvSessionRetain(pSession);
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
Index: /trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -543,5 +543,5 @@
         pSession->pNextHash = g_apSessionHashTab[iHash];
         g_apSessionHashTab[iHash] = pSession;
-        RTSpinlockReleaseNoInts(g_Spinlock);
+        RTSpinlockRelease(g_Spinlock);
         LogFlow(("VBoxDrvSolarisOpen success\n"));
     }
@@ -631,5 +631,5 @@
         }
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
@@ -705,5 +705,5 @@
     while (pSession && pSession->Process != Process && pSession->fUnrestricted == fUnrestricted);
         pSession = pSession->pNextHash;
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
     if (!pSession)
     {
Index: /trunk/src/VBox/HostDrivers/Support/testcase/tstGIP-2.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/testcase/tstGIP-2.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/Support/testcase/tstGIP-2.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -108,6 +108,6 @@
                      g_pSUPGlobalInfoPage->u32Version);
             RTPrintf(fHex
-                     ? "tstGIP-2:     it: u64NanoTS        delta     u64TSC           UpIntTSC H  TransId           CpuHz TSC Interval History...\n"
-                     : "tstGIP-2:     it: u64NanoTS        delta     u64TSC             UpIntTSC H    TransId           CpuHz TSC Interval History...\n");
+                     ? "tstGIP-2:     it: u64NanoTS        delta     u64TSC           UpIntTSC H  TransId           CpuHz         TSCDelta TSC Interval History...\n"
+                     : "tstGIP-2:     it: u64NanoTS        delta     u64TSC             UpIntTSC H    TransId           CpuHz         TSCDelta TSC Interval History...\n");
             static SUPGIPCPU s_aaCPUs[2][256];
             for (uint32_t i = 0; i < cIterations; i++)
@@ -126,6 +126,6 @@
                         PSUPGIPCPU pCpu = &s_aaCPUs[i & 1][iCpu];
                         RTPrintf(fHex
-                                 ? "tstGIP-2: %4d/%d: %016llx %09llx %016llx %08x %d %08x %15llu %08x %08x %08x %08x %08x %08x %08x %08x (%d)\n"
-                                 : "tstGIP-2: %4d/%d: %016llu %09llu %016llu %010u %d %010u %15llu %08x %08x %08x %08x %08x %08x %08x %08x (%d)\n",
+                                 ? "tstGIP-2: %4d/%d: %016llx %09llx %016llx %08x %d %08x %15llu %016lld %08x %08x %08x %08x %08x %08x %08x %08x (%d)\n"
+                                 : "tstGIP-2: %4d/%d: %016llu %09llu %016llu %010u %d %010u %15llu %016lld %08x %08x %08x %08x %08x %08x %08x %08x (%d)\n",
                                  i, iCpu,
                                  pCpu->u64NanoTS,
@@ -136,4 +136,5 @@
                                  pCpu->u32TransactionId,
                                  pCpu->u64CpuHz,
+                                 pCpu->i64TSCDelta,
                                  pCpu->au32TSCHistory[0],
                                  pCpu->au32TSCHistory[1],
@@ -159,4 +160,9 @@
                         /* nop */;
             }
+
+            /* Display TSC deltas. */
+            RTPrintf("tstGIP-2: TSC deltas:\n");
+            for (unsigned iCpu = 0; iCpu < g_pSUPGlobalInfoPage->cCpus; iCpu++)
+                RTPrintf("tstGIP-2: %6d: %016lld\n", iCpu, g_pSUPGlobalInfoPage->aCPUs[iCpu].i64TSCDelta);
         }
         else
Index: /trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2012 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -109,5 +109,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     vboxNetAdpSetState(pThis, enmNewState);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 }
 
@@ -126,5 +126,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     enmState = vboxNetAdpGetState(pThis);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
     Log(("vboxNetAdpGetStateWithLock: pThis=%p, state=%d.\n", pThis, enmState));
     return enmState;
@@ -152,5 +152,5 @@
     else
         fRc = false;
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (fRc)
@@ -180,8 +180,8 @@
             &&  !strcmp(pThis->szName, pszName))
         {
-            RTSpinlockReleaseNoInts(pThis->hSpinlock);
+            RTSpinlockRelease(pThis->hSpinlock);
             return pThis;
         }
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
     }
     return NULL;
@@ -349,5 +349,5 @@
         vboxNetAdpBusy(pThis);
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
     Log(("vboxNetAdpPrepareToReceive: fCanReceive=%d.\n", fCanReceive));
 
@@ -413,5 +413,5 @@
     if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Active)
     {
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
         Log(("vboxNetAdpReceive: Dropping incoming packet for inactive interface %s.\n",
              pThis->szName));
@@ -420,5 +420,5 @@
     vboxNetAdpRetain(pThis);
     vboxNetAdpBusy(pThis);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     rc = vboxNetAdpPortOsXmit(pThis, pSG, fDst);
@@ -515,5 +515,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
     Log(("vboxNetAdpPortSetActive: state after: %RTbool.\n", vboxNetAdpGetState(pThis)));
     return fPreviouslyActive;
@@ -546,5 +546,5 @@
     Assert(!pThis->cBusy);
     vboxNetAdpSetState(pThis, kVBoxNetAdpState_Transitional);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     vboxNetAdpOsDisconnectIt(pThis);
@@ -553,5 +553,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     vboxNetAdpSetState(pThis, kVBoxNetAdpState_Available);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     vboxNetAdpRelease(pThis);
@@ -601,5 +601,5 @@
             RTSpinlockAcquire(pThis->hSpinlock);
             vboxNetAdpSetState(pThis, kVBoxNetAdpState_Available);
-            RTSpinlockReleaseNoInts(pThis->hSpinlock);
+            RTSpinlockRelease(pThis->hSpinlock);
             return rc;
         }
@@ -617,9 +617,9 @@
     if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Available || pThis->cBusy)
     {
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
         return VERR_INTNET_FLT_IF_BUSY;
     }
     vboxNetAdpSetState(pThis, kVBoxNetAdpState_Transitional);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
     vboxNetAdpRelease(pThis);
 
@@ -628,5 +628,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     vboxNetAdpSetState(pThis, kVBoxNetAdpState_Invalid);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     return rc;
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2012 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -404,5 +404,5 @@
         ASMAtomicWriteBool(&pThis->fRediscoveryPending, true);
 
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     /*
@@ -517,5 +517,5 @@
     if (enmOldTrunkState != enmState)
         ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmTrunkState, enmState);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     /*
@@ -622,5 +622,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     vboxNetFltSetState(pThis, kVBoxNetFltInsState_Disconnecting);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     vboxNetFltOsDisconnectIt(pThis);
@@ -630,5 +630,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     vboxNetFltSetState(pThis, kVBoxNetFltInsState_Unconnected);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 #endif
 
@@ -850,5 +850,5 @@
         AssertMsg(cRefs >= 1 && cRefs < UINT32_MAX / 2, ("%d\n", cRefs)); NOREF(cRefs);
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     return fRc;
@@ -897,5 +897,5 @@
         AssertMsg(cRefs >= 1 && cRefs < UINT32_MAX / 2, ("%d\n", cRefs)); NOREF(cRefs);
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     return fRc;
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 52618)
@@ -319,5 +319,5 @@
             ifnet_reference(pIfNet);
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     return pIfNet;
@@ -749,5 +749,5 @@
     ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, true);
 
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (pIfNet)
@@ -1031,5 +1031,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     ASMAtomicUoWritePtr(&pThis->u.s.pIfNet, pIfNet);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     /* Adjust g_offIfNetPCount as it varies for different versions of xnu. */
@@ -1069,5 +1069,5 @@
             pIfNet = NULL; /* don't dereference it */
         }
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
 
         /* Report capabilities. */
@@ -1290,5 +1290,5 @@
     if (pIfFilter)
         ASMAtomicUoWriteNullPtr(&pThis->u.s.pIfFilter);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (pIfFilter)
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 52618)
@@ -609,5 +609,5 @@
     TASK_INIT(&pThis->u.s.tskout, 0, vboxNetFltFreeBSDoutput, pThis);
 
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     NG_NODE_SET_PRIVATE(node, pThis);
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -406,5 +406,5 @@
     ASMAtomicXchgPtr((void * volatile *)&pDev->hard_start_xmit, vboxNetFltLinuxStartXmitFilter);
 # endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) */
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 }
 
@@ -442,5 +442,5 @@
     else
         pOverride = NULL;
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (pOverride)
@@ -1465,5 +1465,5 @@
             fFeatures = 0;
 
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
 
         if (pThis->pSwitchPort)
@@ -1579,5 +1579,5 @@
     RTSpinlockAcquire(pThis->hSpinlock);
     ASMAtomicUoWritePtr(&pThis->u.s.pDev, pDev);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     Log(("vboxNetFltLinuxAttachToInterface: Device %p(%s) retained. ref=%d\n",
@@ -1629,5 +1629,5 @@
         pDev = NULL; /* don't dereference it */
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     /*
@@ -1654,5 +1654,5 @@
         RTSpinlockAcquire(pThis->hSpinlock);
         ASMAtomicUoWriteNullPtr(&pThis->u.s.pDev);
-        RTSpinlockReleaseNoInts(pThis->hSpinlock);
+        RTSpinlockRelease(pThis->hSpinlock);
         dev_put(pDev);
         Log(("vboxNetFltLinuxAttachToInterface: Device %p(%s) released. ref=%d\n",
@@ -1693,5 +1693,5 @@
         ASMAtomicUoWriteNullPtr(&pThis->u.s.pDev);
     }
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (fRegistered)
@@ -2028,5 +2028,5 @@
     pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *);
     fRegistered = ASMAtomicXchgBool(&pThis->u.s.fRegistered, false);
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 
     if (fRegistered)
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2012 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -1110,5 +1110,5 @@
             const bool fActive = pThis->enmTrunkState == INTNETTRUNKIFSTATE_ACTIVE;
             vboxNetFltRetain(pThis, true /* fBusy */);
-            RTSpinlockReleaseNoInts(pThis->hSpinlock);
+            RTSpinlockRelease(pThis->hSpinlock);
 
             vboxnetflt_promisc_stream_t *pPromiscStream = (vboxnetflt_promisc_stream_t *)pStream;
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltM-win.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltM-win.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltM-win.cpp	(revision 52618)
@@ -5,5 +5,5 @@
  */
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -143,5 +143,5 @@
     vboxNetFltWinSetOpState(&pNetFlt->u.s.WinIf.MpState, kVBoxNetDevOpState_Deinitializing);
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
 
     vboxNetFltWinWaitDereference(&pNetFlt->u.s.WinIf.MpState);
@@ -518,5 +518,5 @@
             || vboxNetFltWinGetPowerState(&pNetFlt->u.s.WinIf.MpState) > NdisDeviceStateD0)
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         *pStatus = NDIS_STATUS_FAILURE;
         return 0;
@@ -527,5 +527,5 @@
     {
         pNetFlt->u.s.WinIf.StateFlags.fRequestInfo = VBOXNDISREQUEST_INPROGRESS | VBOXNDISREQUEST_QUEUED;
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         *pStatus = NDIS_STATUS_PENDING;
         return VBOXNDISREQUEST_INPROGRESS | VBOXNDISREQUEST_QUEUED;
@@ -534,5 +534,5 @@
     if (pNetFlt->u.s.WinIf.StateFlags.fStandBy)
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         *pStatus = NDIS_STATUS_FAILURE;
         return 0;
@@ -541,5 +541,5 @@
     pNetFlt->u.s.WinIf.StateFlags.fRequestInfo = VBOXNDISREQUEST_INPROGRESS;
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
 
     *pStatus = NDIS_STATUS_SUCCESS;
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltP-win.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltP-win.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltP-win.cpp	(revision 52618)
@@ -5,5 +5,5 @@
  */
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -176,10 +176,10 @@
         /* mark the request as InProgress before posting it to RequestComplete */
         pNetFlt->u.s.WinIf.StateFlags.fRequestInfo = VBOXNDISREQUEST_INPROGRESS;
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         vboxNetFltWinPtRequestComplete(pNetFlt, &pNetFlt->u.s.WinIf.PassDownRequest, NDIS_STATUS_FAILURE);
     }
     else
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
     }
 }
@@ -209,5 +209,5 @@
     }
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
 
     vboxNetFltWinPtRequestsWaitComplete(pNetFlt);
@@ -1401,5 +1401,5 @@
     if (pNetFlt->u.s.WinIf.StateFlags.fInterfaceClosing)
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         Assert(0);
         return false;
@@ -1407,5 +1407,5 @@
     if (pNetFlt->u.s.WinIf.hBinding == NULL)
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         Assert(0);
         return false;
@@ -1413,5 +1413,5 @@
 
     pNetFlt->u.s.WinIf.StateFlags.fInterfaceClosing = TRUE;
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
 
     NdisResetEvent(&pNetFlt->u.s.WinIf.OpenCloseEvent);
@@ -1444,5 +1444,5 @@
             pNetFlt->u.s.WinIf.StateFlags.fStandBy = TRUE;
         }
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         vboxNetFltWinPtRequestsWaitComplete(pNetFlt);
         vboxNetFltWinWaitDereference(&pNetFlt->u.s.WinIf.MpState);
@@ -1469,5 +1469,5 @@
         {
             pNetFlt->u.s.WinIf.StateFlags.fRequestInfo = VBOXNDISREQUEST_INPROGRESS;
-            RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+            RTSpinlockRelease(pNetFlt->hSpinlock);
 
             vboxNetFltWinMpRequestPost(pNetFlt);
@@ -1475,5 +1475,5 @@
         else
         {
-            RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+            RTSpinlockRelease(pNetFlt->hSpinlock);
         }
     }
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp	(revision 52618)
@@ -5,5 +5,5 @@
  */
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -1069,5 +1069,5 @@
         pSG = pWorker->pSG;
         pWorker->pSG = NULL;
-        RTSpinlockReleaseNoInts((pInstance)->hSpinlock);
+        RTSpinlockRelease((pInstance)->hSpinlock);
         KeSetEvent(&pWorker->KillEvent, 0, FALSE);
 
@@ -1083,5 +1083,5 @@
     else
     {
-        RTSpinlockReleaseNoInts((pInstance)->hSpinlock);
+        RTSpinlockRelease((pInstance)->hSpinlock);
     }
 }
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.h
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.h	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.h	(revision 52618)
@@ -5,5 +5,5 @@
  */
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -594,5 +594,5 @@
 #endif
     {
-        RTSpinlockReleaseNoInts((pNetFlt)->hSpinlock);
+        RTSpinlockRelease((pNetFlt)->hSpinlock);
         *pbNetFltActive = false;
         return false;
@@ -602,5 +602,5 @@
     {
         vboxNetFltWinReferenceModePassThru(pNetFlt);
-        RTSpinlockReleaseNoInts((pNetFlt)->hSpinlock);
+        RTSpinlockRelease((pNetFlt)->hSpinlock);
         *pbNetFltActive = false;
         return true;
@@ -609,5 +609,5 @@
     vboxNetFltRetain((pNetFlt), true /* fBusy */);
     vboxNetFltWinReferenceModeNetFlt(pNetFlt);
-    RTSpinlockReleaseNoInts((pNetFlt)->hSpinlock);
+    RTSpinlockRelease((pNetFlt)->hSpinlock);
 
     *pbNetFltActive = true;
@@ -633,5 +633,5 @@
 #endif
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         *pbNetFltActive = false;
         return false;
@@ -642,5 +642,5 @@
         vboxNetFltWinIncReferenceModePassThru(pNetFlt, v);
 
-        RTSpinlockReleaseNoInts((pNetFlt)->hSpinlock);
+        RTSpinlockRelease((pNetFlt)->hSpinlock);
         *pbNetFltActive = false;
         return true;
@@ -651,5 +651,5 @@
     vboxNetFltWinIncReferenceModeNetFlt(pNetFlt, v);
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
 
     /* we have marked it as busy, so can do the res references outside the lock */
@@ -715,9 +715,9 @@
 #endif
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         return true;
     }
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
     return false;
 }
@@ -732,9 +732,9 @@
 #endif
     {
-        RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+        RTSpinlockRelease(pNetFlt->hSpinlock);
         return true;
     }
 
-    RTSpinlockReleaseNoInts(pNetFlt->hSpinlock);
+    RTSpinlockRelease(pNetFlt->hSpinlock);
     return false;
 }
Index: /trunk/src/VBox/HostDrivers/VBoxPci/VBoxPci.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxPci/VBoxPci.c	(revision 52617)
+++ /trunk/src/VBox/HostDrivers/VBoxPci/VBoxPci.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -90,5 +90,5 @@
 {
 #ifdef VBOX_WITH_SHARED_PCI_INTERRUPTS
-    RTSpinlockReleaseNoInts(pThis->hSpinlock);
+    RTSpinlockRelease(pThis->hSpinlock);
 #else
     RTSemFastMutexRelease(pThis->hFastMtx);
Index: /trunk/src/VBox/Runtime/generic/spinlock-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/spinlock-generic.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/generic/spinlock-generic.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -225,15 +225,2 @@
 RT_EXPORT_SYMBOL(RTSpinlockRelease);
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-RT_EXPORT_SYMBOL(RTSpinlockReleaseNoInts);
-
Index: /trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -271,2 +271,8 @@
 }
 
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return true;
+}
+
Index: /trunk/src/VBox/Runtime/r0drv/darwin/spinlock-r0drv-darwin.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/darwin/spinlock-r0drv-darwin.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/darwin/spinlock-r0drv-darwin.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -161,14 +161,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (%s)\n", Spinlock, Spinlock->pszName);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -289,2 +289,8 @@
 #endif /* < 7.0 */
 
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return true;
+}
+
Index: /trunk/src/VBox/Runtime/r0drv/freebsd/spinlock-r0drv-freebsd.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/freebsd/spinlock-r0drv-freebsd.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/freebsd/spinlock-r0drv-freebsd.c	(revision 52618)
@@ -208,14 +208,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/Runtime/r0drv/haiku/mp-r0drv-haiku.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/haiku/mp-r0drv-haiku.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/haiku/mp-r0drv-haiku.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -217,2 +217,8 @@
 }
 
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return true;
+}
+
Index: /trunk/src/VBox/Runtime/r0drv/haiku/spinlock-r0drv-haiku.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/haiku/spinlock-r0drv-haiku.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/haiku/spinlock-r0drv-haiku.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -137,10 +137,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-    if (!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: p=%p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -412,2 +412,9 @@
 RT_EXPORT_SYMBOL(RTMpPokeCpu);
 
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return true;
+}
+RT_EXPORT_SYMBOL(RTMpOnAllIsConcurrentSafe);
+
Index: /trunk/src/VBox/Runtime/r0drv/linux/spinlock-r0drv-linux.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/linux/spinlock-r0drv-linux.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/linux/spinlock-r0drv-linux.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -178,15 +178,2 @@
 RT_EXPORT_SYMBOL(RTSpinlockRelease);
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-RT_EXPORT_SYMBOL(RTSpinlockReleaseNoInts);
-
Index: /trunk/src/VBox/Runtime/r0drv/linux/timer-r0drv-linux.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/linux/timer-r0drv-linux.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/linux/timer-r0drv-linux.c	(revision 52618)
@@ -1441,5 +1441,5 @@
 
         if (pTimer->cCpus > 1)
-            RTSpinlockReleaseNoInts(pTimer->hSpinlock);
+            RTSpinlockRelease(pTimer->hSpinlock);
     }
 
Index: /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -416,2 +416,9 @@
     return (bRet == TRUE) ? VINF_SUCCESS : VERR_ACCESS_DENIED /* already queued */;
 }
+
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return false;
+}
+
Index: /trunk/src/VBox/Runtime/r0drv/nt/spinlock-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/spinlock-r0drv-nt.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/nt/spinlock-r0drv-nt.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -196,14 +196,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/Runtime/r0drv/os2/spinlock-r0drv-os2.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/os2/spinlock-r0drv-os2.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/os2/spinlock-r0drv-os2.cpp	(revision 52618)
@@ -128,14 +128,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/Runtime/r0drv/os2/timer-r0drv-os2.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/os2/timer-r0drv-os2.cpp	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/os2/timer-r0drv-os2.cpp	(revision 52618)
@@ -157,5 +157,5 @@
     g_pTimerHead = pTimer;
     g_cTimers++;
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
 
     *ppTimer = pTimer;
@@ -201,5 +201,5 @@
             if (RT_UNLIKELY(!pPrev))
             {
-                RTSpinlockReleaseNoInts(g_Spinlock);
+                RTSpinlockRelease(g_Spinlock);
                 return VERR_INVALID_HANDLE;
             }
@@ -216,5 +216,5 @@
             rtTimerOs2Dearm();
     }
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
 
     /*
@@ -246,5 +246,5 @@
         if (RT_FAILURE(rc))
         {
-            RTSpinlockReleaseNoInts(g_Spinlock);
+            RTSpinlockRelease(g_Spinlock);
             return rc;
         }
@@ -256,5 +256,5 @@
     pTimer->u64StartTS = u64First;
     pTimer->u64NextTS = u64First;
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
 
     return VINF_SUCCESS;
@@ -279,5 +279,5 @@
     if (!g_cActiveTimers)
         rtTimerOs2Dearm();
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
 
     return VINF_SUCCESS;
@@ -338,5 +338,5 @@
             PFNRTTIMER  pfnTimer = pTimer->pfnTimer;
             void       *pvUser   = pTimer->pvUser;
-            RTSpinlockReleaseNoInts(g_Spinlock);
+            RTSpinlockRelease(g_Spinlock);
             pfnTimer(pTimer, pvUser, pTimer->iTick);
 
@@ -355,5 +355,5 @@
     }
 
-    RTSpinlockReleaseNoInts(g_Spinlock);
+    RTSpinlockRelease(g_Spinlock);
 }
 
Index: /trunk/src/VBox/Runtime/r0drv/solaris/mp-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/mp-r0drv-solaris.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/mp-r0drv-solaris.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008-2012 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -345,2 +345,8 @@
 }
 
+
+RTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
+{
+    return true;
+}
+
Index: /trunk/src/VBox/Runtime/r0drv/solaris/spinlock-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/spinlock-r0drv-solaris.c	(revision 52617)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/spinlock-r0drv-solaris.c	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -203,14 +203,2 @@
 }
 
-
-RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
-{
-#if 1
-    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
-        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
-#else
-    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
-#endif
-    RTSpinlockRelease(Spinlock);
-}
-
Index: /trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp	(revision 52617)
+++ /trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp	(revision 52618)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2007-2012 Oracle Corporation
+ * Copyright (C) 2007-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -2207,5 +2207,5 @@
                 uHistMaxHz = pCpu->Ppt.aHzHistory[i];
         if (uHistMaxHz == pCpu->Ppt.uTimerHz)
-            RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+            RTSpinlockRelease(pCpu->Ppt.hSpinlock);
         else if (uHistMaxHz)
         {
@@ -2224,5 +2224,5 @@
             else
                 pCpu->Ppt.cTicksHistoriziationInterval = 1;
-            RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+            RTSpinlockRelease(pCpu->Ppt.hSpinlock);
 
             /*SUPR0Printf("Cpu%u: change to %u Hz / %u ns\n", pCpu->idxCpuSet, uHistMaxHz, cNsInterval);*/
@@ -2237,5 +2237,5 @@
             pCpu->Ppt.uTimerHz    = 0;
             pCpu->Ppt.cNsInterval = 0;
-            RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+            RTSpinlockRelease(pCpu->Ppt.hSpinlock);
 
             /*SUPR0Printf("Cpu%u: stopping (%u Hz)\n", pCpu->idxCpuSet, uHistMaxHz);*/
@@ -2244,5 +2244,5 @@
     }
     else
-        RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+        RTSpinlockRelease(pCpu->Ppt.hSpinlock);
 }
 #endif /* GVMM_SCHED_WITH_PPT */
@@ -2311,5 +2311,5 @@
         }
 
-        RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+        RTSpinlockRelease(pCpu->Ppt.hSpinlock);
 
         if (cNsInterval)
@@ -2323,5 +2323,5 @@
                 pCpu->Ppt.fStarted = false;
             pCpu->Ppt.fStarting = false;
-            RTSpinlockReleaseNoInts(pCpu->Ppt.hSpinlock);
+            RTSpinlockRelease(pCpu->Ppt.hSpinlock);
         }
     }
