Index: trunk/src/VBox/HostDrivers/Support/SUPDRV.h
===================================================================
--- trunk/src/VBox/HostDrivers/Support/SUPDRV.h	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/SUPDRV.h	(revision 7272)
@@ -700,5 +700,5 @@
     KDPC                    GipDpc;
     /** The GIP DPC objects for updating per-cpu data. */
-    KDPC                    aGipCpuDpcs[32];
+    KDPC                    aGipCpuDpcs[64];
     /** Pointer to the MDL for the pGip page. */
     PMDL                    pGipMdl;
@@ -757,5 +757,4 @@
 bool VBOXCALL   supdrvOSGetForcedAsyncTscMode(void);
 #endif
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu);
 
 
Index: trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c
===================================================================
--- trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c	(revision 7272)
@@ -38,4 +38,5 @@
 #include <iprt/thread.h>
 #include <iprt/process.h>
+#include <iprt/mp.h>
 #include <iprt/log.h>
 
@@ -119,5 +120,4 @@
     { "SUPR0PageFree",                          (void *)SUPR0PageFree },
     { "SUPR0Printf",                            (void *)SUPR0Printf },
-    { "SUPR0ExecuteCallback",                   (void *)SUPR0ExecuteCallback },
     { "RTMemAlloc",                             (void *)RTMemAlloc },
     { "RTMemAllocZ",                            (void *)RTMemAllocZ },
@@ -184,4 +184,7 @@
     { "RTThreadUserWaitNoResume",               (void *)RTThreadUserWaitNoResume },
 #endif
+    { "RTMpOnAll",                              (void *)RTMpOnAll },
+    { "RTMpOnOthers",                           (void *)RTMpOnOthers },
+    { "RTMpOnSpecific",                         (void *)RTMpOnSpecific },
     { "RTLogDefaultInstance",                   (void *)RTLogDefaultInstance },
     { "RTLogRelDefaultInstance",                (void *)RTLogRelDefaultInstance },
@@ -2208,24 +2211,4 @@
 }
 
-/**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-SUPR0DECL(int) SUPR0ExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    int           rc;
-    RTSPINLOCKTMP SpinlockTmp = RTSPINLOCKTMP_INITIALIZER;
-
-    RTSpinlockAcquire(pSession->Spinlock, &SpinlockTmp);
-    rc = supdrvOSExecuteCallback(pSession, pfnCallback, pvUser, uCpu);
-    RTSpinlockRelease(pSession->Spinlock, &SpinlockTmp);
-    return rc;
-}
-
 
 /**
Index: trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
===================================================================
--- trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 7272)
@@ -640,23 +640,4 @@
 
 /**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
-
-/**
  * Converts a supdrv error code to a darwin error code.
  *
Index: trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
===================================================================
--- trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c	(revision 7272)
@@ -531,22 +531,4 @@
 }
 
-/**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
 
 SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...)
Index: trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
===================================================================
--- trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c	(revision 7272)
@@ -973,23 +973,4 @@
 }
 
-/**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
-
 
 /**
Index: trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
===================================================================
--- trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 7272)
@@ -378,23 +378,4 @@
 
 /**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
-
-/**
  * Callback for writing to the log buffer.
  *
Index: trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
===================================================================
--- trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 7272)
@@ -804,22 +804,4 @@
 }
 
-/**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
 
 RTDECL(int) SUPR0Printf(const char *pszFormat, ...)
Index: trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
===================================================================
--- trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp	(revision 7271)
+++ trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp	(revision 7272)
@@ -456,23 +456,4 @@
 
 /**
- * Executes a callback handler on a specific cpu or all cpus
- *
- * @returns IPRT status code.
- * @param   pSession    The session.
- * @param   pfnCallback Callback handler
- * @param   pvUser      The first user argument.
- * @param   uCpu        Cpu id or SUPDRVEXECCALLBACK_CPU_ALL for all cpus
- */
-int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu)
-{
-    NOREF(pSession);
-    NOREF(pfnCallback);
-    NOREF(pvUser);
-    NOREF(uCpu);
-    /** @todo */
-    return VERR_NOT_IMPLEMENTED;
-}
-
-/**
  * Gets the monotone timestamp (nano seconds).
  * @returns NanoTS.
@@ -635,15 +616,17 @@
             KIRQL oldIrql;
 
-            Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL);
+            /* KeQueryActiveProcessors must be executed at IRQL < DISPATCH_LEVEL */
+            Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
+            KAFFINITY Mask = KeQueryActiveProcessors();
+
+            /* Raise the IRQL to DISPATCH_LEVEL so we can't be rescheduled to another cpu */
             KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
 
             /*
-             * We cannot do other than assume a 1:1 relation ship between the
+             * We cannot do other than assume a 1:1 relationship between the
              * affinity mask and the process despite the warnings in the docs.
              * If someone knows a better way to get this done, please let bird know.
              */
-            /** @todo our IRQL is too high for KeQueryActiveProcessors!! */
             unsigned iSelf = KeGetCurrentProcessorNumber();
-            KAFFINITY Mask = KeQueryActiveProcessors();
 
             for (unsigned i = 0; i < RT_ELEMENTS(pDevExt->aGipCpuDpcs); i++)
