Index: /trunk/include/VBox/sup.h
===================================================================
--- /trunk/include/VBox/sup.h	(revision 7205)
+++ /trunk/include/VBox/sup.h	(revision 7206)
@@ -606,4 +606,9 @@
 
 /**
+ * Execute callback on all cpus/cores (SUPR0ExecuteCallback)
+ */
+#define SUPDRVEXECCALLBACK_CPU_ALL      (~0)
+
+/**
  * Security objectype.
  */
@@ -635,4 +640,14 @@
 /** Pointer to a FNSUPDRVDESTRUCTOR(). */
 typedef FNSUPDRVDESTRUCTOR *PFNSUPDRVDESTRUCTOR;
+
+/**
+ * Per cpu execution callback (SUPR0ExecuteCallback)
+ *
+ * @param   pSession    Session object
+ * @param   pvUser      The first user argument.
+ */
+typedef DECLCALLBACK(void) FNSUPDRVEXECCALLBACK(PSUPDRVSESSION pSession, void *pvUser1);
+/** Pointer to a PFNSUPDRVEXECCALLBACK(). */
+typedef FNSUPDRVEXECCALLBACK *PFNSUPDRVEXECCALLBACK;
 
 SUPR0DECL(void *) SUPR0ObjRegister(PSUPDRVSESSION pSession, SUPDRVOBJTYPE enmType, PFNSUPDRVDESTRUCTOR pfnDestructor, void *pvUser1, void *pvUser2);
@@ -655,4 +670,5 @@
 SUPR0DECL(int) SUPR0GipUnmap(PSUPDRVSESSION pSession);
 SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...);
+SUPR0DECL(int) SUPR0ExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu);
 
 /** @} */
Index: /trunk/src/VBox/HostDrivers/Support/SUPDRV.h
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDRV.h	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDRV.h	(revision 7206)
@@ -757,4 +757,5 @@
 bool VBOXCALL   supdrvOSGetForcedAsyncTscMode(void);
 #endif
+int  VBOXCALL   supdrvOSExecuteCallback(PSUPDRVSESSION pSession, PFNSUPDRVEXECCALLBACK pfnCallback, void *pvUser, unsigned uCpu);
 
 
Index: /trunk/src/VBox/HostDrivers/Support/SUPDRVIOC.h
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDRVIOC.h	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDRVIOC.h	(revision 7206)
@@ -178,5 +178,5 @@
  * The upper 16-bit is the major version, the the lower the minor version.
  * When incompatible changes are made, the upper major number has to be changed. */
-#define SUPDRVIOC_VERSION                               0x00060000
+#define SUPDRVIOC_VERSION                               0x00070000
 
 /** SUP_IOCTL_COOKIE. */
Index: /trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c	(revision 7206)
@@ -119,4 +119,5 @@
     { "SUPR0PageFree",                          (void *)SUPR0PageFree },
     { "SUPR0Printf",                            (void *)SUPR0Printf },
+    { "SUPR0ExecuteCallback",                   (void *)SUPR0ExecuteCallback },
     { "RTMemAlloc",                             (void *)RTMemAlloc },
     { "RTMemAllocZ",                            (void *)RTMemAllocZ },
@@ -137,5 +138,5 @@
     { "RTR0MemObjGetPagePhysAddr",              (void *)RTR0MemObjGetPagePhysAddr },
     { "RTR0MemObjFree",                         (void *)RTR0MemObjFree },
-/* These doesn't work yet on linux - use fast mutexes!
+/* These don't work yet on linux - use fast mutexes!
     { "RTSemMutexCreate",                       (void *)RTSemMutexCreate },
     { "RTSemMutexRequest",                      (void *)RTSemMutexRequest },
@@ -2207,4 +2208,24 @@
 }
 
+/**
+ * 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/SUPLib.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 7206)
@@ -331,7 +331,8 @@
         { "SUPR0MemFree",                           0xefef000a },
         { "SUPR0Printf",                            0xefef000b },
-        { "RTMemAlloc",                             0xefef000c },
-        { "RTMemAllocZ",                            0xefef000d },
-        { "RTMemFree",                              0xefef000e },
+        { "SUPR0ExecuteCallback",                   0xefef000c },
+        { "RTMemAlloc",                             0xefef000d },
+        { "RTMemAllocZ",                            0xefef000e },
+        { "RTMemFree",                              0xefef000f },
         { "RTR0MemObjAddress",                      0xefef0010 },
         { "RTR0MemObjAddressR3",                    0xefef0011 },
Index: /trunk/src/VBox/HostDrivers/Support/SUPR0.def
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPR0.def	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/SUPR0.def	(revision 7206)
@@ -42,4 +42,5 @@
     SUPR0MemFree
     SUPR0Printf
+    SUPR0ExecuteCallback
     RTMemAlloc
     RTMemAllocZ
Index: /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 7206)
@@ -640,4 +640,23 @@
 
 /**
+ * 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 7205)
+++ /trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c	(revision 7206)
@@ -531,4 +531,22 @@
 }
 
+/**
+ * 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 7205)
+++ /trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c	(revision 7206)
@@ -973,4 +973,23 @@
 }
 
+/**
+ * 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 7205)
+++ /trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 7206)
@@ -377,4 +377,22 @@
 }
 
+/**
+ * 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/solaris/SUPDrv-solaris.c
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 7205)
+++ /trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 7206)
@@ -804,4 +804,22 @@
 }
 
+/**
+ * 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 7205)
+++ /trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp	(revision 7206)
@@ -455,4 +455,22 @@
 }
 
+/**
+ * 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;
+}
 
 /**
