Index: /trunk/src/VBox/Runtime/r0drv/solaris/timer-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/timer-r0drv-solaris.c	(revision 53346)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/timer-r0drv-solaris.c	(revision 53347)
@@ -225,5 +225,5 @@
     pCyclicHandler->cyh_level = CY_LOCK_LEVEL;
 
-    uint64_t u64Now = RTTimeNanoTS();
+    uint64_t u64Now = RTTimeSystemNanoTS();
     if (pTimer->pOmniTimer->u64When < u64Now)
         pCyclicTime->cyt_when = u64Now + pTimer->interval / 2;
@@ -308,4 +308,23 @@
      */
     RTTimerStop(pTimer);
+
+    /** @remarks Do -not- call this function from a timer callback,
+     *           cyclic_remove() will deadlock the system. */
+    if (pTimer->pSingleTimer)
+    {
+        mutex_enter(&cpu_lock);
+        cyclic_remove(pTimer->hCyclicId);
+        mutex_exit(&cpu_lock);
+        RTMemFree(pTimer->pSingleTimer);
+    }
+    else if (pTimer->pOmniTimer)
+    {
+        mutex_enter(&cpu_lock);
+        cyclic_remove(pTimer->hCyclicId);
+        mutex_exit(&cpu_lock);
+        RTMemFree(pTimer->pOmniTimer->au64Ticks);
+        RTMemFree(pTimer->pOmniTimer);
+    }
+
     ASMAtomicWriteU32(&pTimer->u32Magic, ~RTTIMER_MAGIC);
     RTMemFree(pTimer);
@@ -342,5 +361,5 @@
          */
         pTimer->pOmniTimer = pOmniTimer;
-        pOmniTimer->u64When     = pTimer->interval + RTTimeNanoTS();
+        pOmniTimer->u64When     = pTimer->interval + RTTimeSystemNanoTS();
 
         cyc_omni_handler_t hOmni;
@@ -382,5 +401,5 @@
         }
 
-        pSingleTimer->hFireTime.cyt_when = u64First + RTTimeNanoTS();
+        pSingleTimer->hFireTime.cyt_when = u64First + RTTimeSystemNanoTS();
         if (pTimer->interval == 0)
         {
@@ -414,22 +433,12 @@
         return VERR_TIMER_SUSPENDED;
 
-    pTimer->fSuspended = true;
-    if (pTimer->pSingleTimer)
-    {
-        mutex_enter(&cpu_lock);
-        cyclic_remove(pTimer->hCyclicId);
-        mutex_exit(&cpu_lock);
-        RTMemFree(pTimer->pSingleTimer);
-    }
-    else if (pTimer->pOmniTimer)
-    {
-        mutex_enter(&cpu_lock);
-        cyclic_remove(pTimer->hCyclicId);
-        mutex_exit(&cpu_lock);
-        RTMemFree(pTimer->pOmniTimer->au64Ticks);
-        RTMemFree(pTimer->pOmniTimer);
-    }
-
-    return VINF_SUCCESS;
+    /*
+     * Solaris does not allow removing cyclics from the timer callback but it does allow
+     * reprogramming the cyclic. Reprogram such that it never expires.
+     */
+    int rc = RTTimerChangeInterval(pTimer, CY_INFINITY);
+    if (RT_SUCCESS(rc))
+        pTimer->fSuspended = true;
+    return rc;
 }
 
@@ -439,7 +448,16 @@
     RTTIMER_ASSERT_VALID_RET(pTimer);
 
-    /** @todo implement me! */
-
-    return VERR_NOT_SUPPORTED;
+    if (pTimer->hCyclicId != CYCLIC_NONE)
+    {
+        uint64_t uNanoTS = RTTimeSystemNanoTS();
+        if (   u64NanoInterval >= CY_INFINITY
+            || uNanoTS >= CY_INFINITY - u64NanoInterval)
+            cyclic_reprogram(pTimer->hCyclicId, CY_INFINITY);
+        else
+            cyclic_reprogram(pTimer->hCyclicId, (hrtime_t)(u64NanoInterval + uNanoTS));
+
+        return VINF_SUCCESS;
+    }
+    return VERR_INVALID_STATE;
 }
 
