Index: /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
===================================================================
--- /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 23909)
+++ /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 23910)
@@ -206,12 +206,14 @@
 }
 
-static void vmmdevCtlGuestFilterMask_EMT (VMMDevState *pVMMDevState,
-                                          uint32_t u32OrMask,
-                                          uint32_t u32NotMask)
-{
+void VMMDevCtlSetGuestFilterMask (VMMDevState *pVMMDevState,
+                                  uint32_t u32OrMask,
+                                  uint32_t u32NotMask)
+{
+    PDMCritSectEnter(&pVMMDevState->CritSect, VERR_SEM_BUSY);
+
     const bool fHadEvents =
         (pVMMDevState->u32HostEventFlags & pVMMDevState->u32GuestFilterMask) != 0;
 
-    Log(("vmmdevCtlGuestFilterMask_EMT: u32OrMask = 0x%08X, u32NotMask = 0x%08X, fHadEvents = %d.\n", u32OrMask, u32NotMask, fHadEvents));
+    Log(("VMMDevCtlSetGuestFilterMask: u32OrMask = 0x%08X, u32NotMask = 0x%08X, fHadEvents = %d.\n", u32OrMask, u32NotMask, fHadEvents));
     if (fHadEvents)
     {
@@ -229,32 +231,10 @@
         vmmdevMaybeSetIRQ_EMT (pVMMDevState);
     }
-}
-
-void VMMDevCtlSetGuestFilterMask (VMMDevState *pVMMDevState,
-                                  uint32_t u32OrMask,
-                                  uint32_t u32NotMask)
+    PDMCritSectLeave(&pVMMDevState->CritSect);
+}
+
+void VMMDevNotifyGuest (VMMDevState *pVMMDevState, uint32_t u32EventMask)
 {
     PPDMDEVINS pDevIns = VMMDEVSTATE_2_DEVINS(pVMMDevState);
-    PVM pVM = PDMDevHlpGetVM(pDevIns);
-
-    Log(("VMMDevCtlSetGuestFilterMask: u32OrMask = 0x%08X, u32NotMask = 0x%08X.\n", u32OrMask, u32NotMask));
-
-    if (VM_IS_EMT(pVM))
-    {
-        vmmdevCtlGuestFilterMask_EMT (pVMMDevState, u32OrMask, u32NotMask);
-    }
-    else
-    {
-        int rc = VMR3ReqCallVoidWait (pVM, VMCPUID_ANY, (PFNRT) vmmdevCtlGuestFilterMask_EMT,
-                                      3, pVMMDevState, u32OrMask, u32NotMask);
-        AssertReleaseRC (rc);
-    }
-}
-
-void VMMDevNotifyGuest (VMMDevState *pVMMDevState, uint32_t u32EventMask)
-{
-    PPDMDEVINS pDevIns = VMMDEVSTATE_2_DEVINS(pVMMDevState);
-    PVM pVM = PDMDevHlpGetVM(pDevIns);
-    int rc;
 
     Log3(("VMMDevNotifyGuest: u32EventMask = 0x%08X.\n", u32EventMask));
@@ -266,9 +246,10 @@
         return;
 
+    PDMCritSectEnter(&pVMMDevState->CritSect, VERR_SEM_BUSY);
     /* No need to wait for the completion of this request. It is a notification
      * about something, which has already happened.
      */
-    rc = VMR3ReqCallVoidNoWait(pVM, VMCPUID_ANY, (PFNRT)vmmdevNotifyGuest_EMT, 2, pVMMDevState, u32EventMask);
-    AssertRC(rc);
+    vmmdevNotifyGuest_EMT(pVMMDevState, u32EventMask);
+    PDMCritSectLeave(&pVMMDevState->CritSect);
 }
 
@@ -1056,7 +1037,7 @@
                  * cannot disable these notifications.
                  */
-                vmmdevCtlGuestFilterMask_EMT (pThis,
-                                              pCtlMaskRequest->u32OrMask,
-                                              pCtlMaskRequest->u32NotMask & ~VMMDEV_EVENT_HGCM);
+                VMMDevCtlSetGuestFilterMask (pThis,
+                                             pCtlMaskRequest->u32OrMask,
+                                             pCtlMaskRequest->u32NotMask & ~VMMDEV_EVENT_HGCM);
                 pRequestHeader->rc = VINF_SUCCESS;
 
@@ -1854,8 +1835,10 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    AssertCompile(sizeof(pThis->mouseXAbs) == sizeof(*pAbsX));
+    AssertCompile(sizeof(pThis->mouseYAbs) == sizeof(*pAbsY));
     if (pAbsX)
-        *pAbsX = pThis->mouseXAbs;
+        ASMAtomicReadSize(&pThis->mouseXAbs, pAbsX);
     if (pAbsY)
-        *pAbsY = pThis->mouseYAbs;
+        ASMAtomicReadSize(&pThis->mouseYAbs, pAbsY);
     return VINF_SUCCESS;
 }
@@ -1871,10 +1854,16 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+
     if ((pThis->mouseXAbs == absX) && (pThis->mouseYAbs == absY))
+    {
+        PDMCritSectLeave(&pThis->CritSect);
         return VINF_SUCCESS;
+    }
     Log2(("vmmdevSetAbsoluteMouse: settings absolute position to x = %d, y = %d\n", absX, absY));
     pThis->mouseXAbs = absX;
     pThis->mouseYAbs = absY;
     VMMDevNotifyGuest (pThis, VMMDEV_EVENT_MOUSE_POSITION_CHANGED);
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -1904,4 +1893,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     bool bCapsChanged = ((capabilities & VMMDEV_MOUSE_HOST_CAN_ABSOLUTE)
@@ -1923,4 +1913,5 @@
         VMMDevNotifyGuest (pThis, VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED);
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -1930,4 +1921,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -1961,4 +1953,5 @@
     }
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -1967,4 +1960,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -1982,4 +1976,5 @@
     }
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -1988,4 +1983,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -2003,4 +1999,5 @@
     }
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -2009,4 +2006,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     bool fSame = (pThis->fVRDPEnabled == fVRDPEnabled);
@@ -2022,4 +2020,5 @@
     }
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -2028,4 +2027,5 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -2043,4 +2043,5 @@
     }
 
+    PDMCritSectLeave(&pThis->CritSect);
     return VINF_SUCCESS;
 }
@@ -2052,4 +2053,7 @@
 {
     VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
+    int          rc = VINF_SUCCESS;
+
+    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
 
     /* logon mode? */
@@ -2073,7 +2077,8 @@
     }
     else
-        return VERR_INVALID_PARAMETER;
-
-    return VINF_SUCCESS;
+        rc = VERR_INVALID_PARAMETER;
+
+    PDMCritSectLeave(&pThis->CritSect);
+    return rc;
 }
 
@@ -2094,5 +2099,4 @@
         pThis->u32VideoAccelEnabled = fEnabled;
     }
-
     return;
 }
@@ -2592,5 +2596,4 @@
         pThis->pDrv->pfnUpdateGuestCapabilities(pThis->pDrv, pThis->guestCaps);
 }
-
 
 /**
