Index: /trunk/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c	(revision 22772)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c	(revision 22773)
@@ -142,4 +142,12 @@
      * If we're in interrupt context we need to unpin the underlying current
      * thread as this could lead to a deadlock (see #4259 for the full explanation)
+     *
+     * Note! This assumes nobody is using the RTThreadPreemptDisable in an
+     *       interrupt context and expects it to work right.  The swtch will
+     *       result in a voluntary preemption.  To fix this, we would have to
+     *       do our own counting in RTThreadPreemptDisable/Restore like we do
+     *       on systems which doesn't do preemption (OS/2, linux, ...) and
+     *       check whether preemption was disabled via RTThreadPreemptDisable
+     *       or not and only call swtch if RTThreadPreemptDisable wasn't called.
      */
     int fAcquired = mutex_tryenter(&pEventInt->Mtx);
Index: /trunk/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c	(revision 22772)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c	(revision 22773)
@@ -141,4 +141,6 @@
      * If we're in interrupt context we need to unpin the underlying current
      * thread as this could lead to a deadlock (see #4259 for the full explanation)
+     *
+     * Note! See remarks about preemption in RTSemEventSignal.
      */
     int fAcquired = mutex_tryenter(&pThis->Mtx);
@@ -177,5 +179,19 @@
     RT_ASSERT_INTS_ON();
 
-    mutex_enter(&pThis->Mtx);
+    /*
+     * If we're in interrupt context we need to unpin the underlying current
+     * thread as this could lead to a deadlock (see #4259 for the full explanation)
+     *
+     * Note! See remarks about preemption in RTSemEventSignal.
+     */
+    int fAcquired = mutex_tryenter(&pThis->Mtx);
+    if (!fAcquired)
+    {
+        if (curthread->t_intr && getpil() < DISP_LEVEL)
+            swtch();
+
+        mutex_enter(&pThis->Mtx);
+    }
+
     ASMAtomicXchgU8(&pThis->fSignaled, false);
     mutex_exit(&pThis->Mtx);
