Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 53750)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 53751)
@@ -33,4 +33,5 @@
 #include <VBox/log.h>
 #include <VBox/vmm/pgm.h>
+#include <VBox/sup.h>
 
 #include <iprt/assert.h>
@@ -184,4 +185,5 @@
     SSMFIELD_ENTRY_IGNORE(          VMSVGAState, BasePort),
     SSMFIELD_ENTRY(                 VMSVGAState, u32IndexReg),
+    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, pSupDrvSession),
     SSMFIELD_ENTRY_IGNORE(          VMSVGAState, FIFORequestSem),
     SSMFIELD_ENTRY_IGNORE(          VMSVGAState, FIFOExtCmdSem),
@@ -1082,11 +1084,11 @@
             &&  pThis->svga.fConfigured)
         {
-#ifdef IN_RING3
-            Log(("SVGA_REG_SYNC: SVGA_FIFO_BUSY=%d\n", pThis->svga.pFIFOR3[SVGA_FIFO_BUSY]));
+#if defined(IN_RING3) || defined(IN_RING0)
+            Log(("SVGA_REG_SYNC: SVGA_FIFO_BUSY=%d\n", pThis->svga.CTX_SUFF(pFIFO)[SVGA_FIFO_BUSY]));
             pThis->svga.fBusy = true;
-            pThis->svga.pFIFOR3[SVGA_FIFO_BUSY] = pThis->svga.fBusy;
+            pThis->svga.CTX_SUFF(pFIFO)[SVGA_FIFO_BUSY] = pThis->svga.fBusy;
 
             /* Kick the FIFO thread to start processing commands again. */
-            RTSemEventSignal(pThis->svga.FIFORequestSem);
+            SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
 #else
             rc = VINF_IOM_R3_IOPORT_WRITE;
@@ -1937,6 +1939,6 @@
 
         /* Wait for at most 250 ms to start polling. */
-        rc = RTSemEventWait(pThis->svga.FIFORequestSem, 250);
-        AssertBreak(RT_SUCCESS(rc) || rc == VERR_TIMEOUT);
+        rc = SUPSemEventWaitNoResume(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem, 250);
+        AssertBreak(RT_SUCCESS(rc) || rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED);
         if (pThread->enmState != PDMTHREADSTATE_RUNNING)
         {
@@ -3004,5 +3006,5 @@
     PVGASTATE pThis = (PVGASTATE)pThread->pvUser;
     Log(("vmsvgaFIFOLoopWakeUp\n"));
-    return RTSemEventSignal(pThis->svga.FIFORequestSem);
+    return SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
 }
 
@@ -3079,7 +3081,22 @@
     {
         AssertReturn(iRegion == 0, VERR_INTERNAL_ERROR);
-        rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0, vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
+        rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
+                                     vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
         if (RT_FAILURE(rc))
             return rc;
+        if (pThis->fR0Enabled)
+        {
+            rc = PDMDevHlpIOPortRegisterR0(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
+                                           "vmsvgaIOWrite", "vmsvgaIORead", NULL, NULL, "VMSVGA");
+            if (RT_FAILURE(rc))
+                return rc;
+        }
+        if (pThis->fGCEnabled)
+        {
+            rc = PDMDevHlpIOPortRegisterRC(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
+                                           "vmsvgaIOWrite", "vmsvgaIORead", NULL, NULL, "VMSVGA");
+            if (RT_FAILURE(rc))
+                return rc;
+        }
 
         pThis->svga.BasePort = GCPhysAddress;
@@ -3201,5 +3218,5 @@
          */
         PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
-        RTSemEventSignal(pThis->svga.FIFORequestSem);
+        SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
         /* Wait for the end of the command. */
         rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, RT_INDEFINITE_WAIT);
@@ -3292,5 +3309,5 @@
          */
         PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
-        RTSemEventSignal(pThis->svga.FIFORequestSem);
+        SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
         /* Wait for the end of the external command. */
         rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, RT_INDEFINITE_WAIT);
@@ -3323,5 +3340,5 @@
     /* Reset the FIFO thread. */
     pThis->svga.u8FIFOExtCommand = VMSVGA_FIFO_EXTCMD_RESET;
-    RTSemEventSignal(pThis->svga.FIFORequestSem);
+    SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
     /* Wait for the end of the termination sequence. */
     int rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, 10000);
@@ -3376,5 +3393,6 @@
      */
     PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
-    RTSemEventSignal(pThis->svga.FIFORequestSem);
+    SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
+
     /* Wait for the end of the termination sequence. */
     rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, 10000);
@@ -3396,8 +3414,14 @@
     if (pThis->svga.pFrameBufferBackup)
         RTMemFree(pThis->svga.pFrameBufferBackup);
-    if (pThis->svga.FIFOExtCmdSem)
+    if (pThis->svga.FIFOExtCmdSem != NIL_RTSEMEVENT)
+    {
         RTSemEventDestroy(pThis->svga.FIFOExtCmdSem);
-    if (pThis->svga.FIFORequestSem)
-        RTSemEventDestroy(pThis->svga.FIFORequestSem);
+        pThis->svga.FIFOExtCmdSem = NIL_RTSEMEVENT;
+    }
+    if (pThis->svga.FIFORequestSem != NIL_SUPSEMEVENT)
+    {
+        SUPSemEventClose(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
+        pThis->svga.FIFORequestSem = NIL_SUPSEMEVENT;
+    }
 
     return VINF_SUCCESS;
@@ -3429,5 +3453,7 @@
 
     /* Create event semaphore. */
-    rc = RTSemEventCreate(&pThis->svga.FIFORequestSem);
+    pThis->svga.pSupDrvSession = PDMDevHlpGetSupDrvSession(pDevIns);
+
+    rc = SUPSemEventCreate(pThis->svga.pSupDrvSession, &pThis->svga.FIFORequestSem);
     if (RT_FAILURE(rc))
     {
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 53750)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 53751)
@@ -279,8 +279,10 @@
     /** Port io index register. */
     uint32_t                    u32IndexReg;
+    /** The support driver session handle for use with FIFORequestSem. */
+    R3R0PTRTYPE(PSUPDRVSESSION) pSupDrvSession;
     /** FIFO request semaphore. */
-    RTSEMEVENT                  FIFORequestSem;
+    SUPSEMEVENT                 FIFORequestSem;
     /** FIFO external command semaphore. */
-    RTSEMEVENT                  FIFOExtCmdSem;
+    R3PTRTYPE(RTSEMEVENT)       FIFOExtCmdSem;
     /** FIFO IO Thread. */
     R3PTRTYPE(PPDMTHREAD)       pFIFOIOThread;
