Index: /trunk/include/VBox/pdmdev.h
===================================================================
--- /trunk/include/VBox/pdmdev.h	(revision 20091)
+++ /trunk/include/VBox/pdmdev.h	(revision 20092)
@@ -1272,21 +1272,4 @@
 
     /**
-     * Acquires the PDM lock.
-     *
-     * @returns VINF_SUCCESS on success.
-     * @returns Fatal error on failure.
-     * @param   pDevIns         The APIC device instance.
-     * @param   rc              Dummy for making the interface identical to the GC and R0 versions.
-     */
-    DECLR3CALLBACKMEMBER(int,   pfnLock,(PPDMDEVINS pDevIns, int rc));
-
-    /**
-     * Releases the PDM lock.
-     *
-     * @param   pDevIns         The APIC device instance.
-     */
-    DECLR3CALLBACKMEMBER(void,  pfnUnlock,(PPDMDEVINS pDevIns));
-
-    /**
      * Get the virtual CPU id corresponding to the current EMT.
      *
@@ -1334,4 +1317,28 @@
      */
     DECLR3CALLBACKMEMBER(PCPDMAPICHLPR0, pfnGetR0Helpers,(PPDMDEVINS pDevIns));
+
+    /**
+     * Get the critical section used to synchronize the PICs, PCI and stuff.
+     *
+     * @returns Ring-3 pointer to the critical section.
+     * @param   pDevIns         The APIC device instance.
+     */
+    DECLR3CALLBACKMEMBER(R3PTRTYPE(PPDMCRITSECT), pfnGetR3CritSect,(PPDMDEVINS pDevIns));
+
+    /**
+     * Get the critical section used to synchronize the PICs, PCI and stuff.
+     *
+     * @returns Raw-mode context pointer to the critical section.
+     * @param   pDevIns         The APIC device instance.
+     */
+    DECLR3CALLBACKMEMBER(RCPTRTYPE(PPDMCRITSECT), pfnGetRCCritSect,(PPDMDEVINS pDevIns));
+
+    /**
+     * Get the critical section used to synchronize the PICs, PCI and stuff.
+     *
+     * @returns Ring-0 pointer to the critical section.
+     * @param   pDevIns         The APIC device instance.
+     */
+    DECLR3CALLBACKMEMBER(R0PTRTYPE(PPDMCRITSECT), pfnGetR0CritSect,(PPDMDEVINS pDevIns));
 
     /** Just a safety precaution. */
@@ -1344,5 +1351,5 @@
 
 /** Current PDMAPICHLP version number. */
-#define PDM_APICHLPR3_VERSION  0xfd010000
+#define PDM_APICHLPR3_VERSION  0xfd020000
 
 
Index: /trunk/src/VBox/Devices/PC/DevAPIC.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 20091)
+++ /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 20092)
@@ -59,7 +59,7 @@
 /** @def APIC_LOCK
  * Acquires the PDM lock. */
-#define APIC_LOCK(pThis, rc) \
+#define APIC_LOCK(pThis, rcBusy) \
     do { \
-        int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
+        int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \
         if (rc2 != VINF_SUCCESS) \
             return rc2; \
@@ -68,7 +68,7 @@
 /** @def APIC_LOCK_VOID
  * Acquires the PDM lock and does not expect failure (i.e. ring-3 only!). */
-#define APIC_LOCK_VOID(pThis, rc) \
+#define APIC_LOCK_VOID(pThis, rcBusy) \
     do { \
-        int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
+        int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \
         AssertLogRelRCReturnVoid(rc2); \
     } while (0)
@@ -77,5 +77,5 @@
  * Releases the PDM lock. */
 #define APIC_UNLOCK(pThis) \
-    (pThis)->CTX_SUFF(pApicHlp)->pfnUnlock((pThis)->CTX_SUFF(pDevIns))
+    PDMCritSectLeave((pThis)->CTX_SUFF(pCritSect))
 
 /** @def IOAPIC_LOCK
@@ -281,32 +281,39 @@
 {
     /** The device instance - R3 Ptr. */
-    PPDMDEVINSR3    pDevInsR3;
+    PPDMDEVINSR3            pDevInsR3;
     /** The APIC helpers - R3 Ptr. */
-    PCPDMAPICHLPR3  pApicHlpR3;
+    PCPDMAPICHLPR3          pApicHlpR3;
     /** LAPICs states - R3 Ptr */
-    RTR3PTR         pLapicsR3;
+    RTR3PTR                 pLapicsR3;
+    /** The critical section - R3 Ptr. */
+    R3PTRTYPE(PPDMCRITSECT) pCritSectR3;
 
     /** The device instance - R0 Ptr. */
-    PPDMDEVINSR0    pDevInsR0;
+    PPDMDEVINSR0            pDevInsR0;
     /** The APIC helpers - R0 Ptr. */
-    PCPDMAPICHLPR0  pApicHlpR0;
+    PCPDMAPICHLPR0          pApicHlpR0;
     /** LAPICs states - R0 Ptr */
-    RTR0PTR         pLapicsR0;
+    RTR0PTR                 pLapicsR0;
+    /** The critical section - R3 Ptr. */
+    R0PTRTYPE(PPDMCRITSECT) pCritSectR0;
 
     /** The device instance - RC Ptr. */
-    PPDMDEVINSRC    pDevInsRC;
+    PPDMDEVINSRC            pDevInsRC;
     /** The APIC helpers - RC Ptr. */
-    PCPDMAPICHLPRC  pApicHlpRC;
+    PCPDMAPICHLPRC          pApicHlpRC;
     /** LAPICs states - RC Ptr */
-    RTRCPTR         pLapicsRC;
+    RTRCPTR                 pLapicsRC;
+    /** The critical section - R3 Ptr. */
+    RCPTRTYPE(PPDMCRITSECT) pCritSectRC;
+    RTRCPTR                 Padding0;
 
     /** APIC specification version in this virtual hardware configuration. */
-    PDMAPICVERSION  enmVersion;
+    PDMAPICVERSION          enmVersion;
 
     /** Number of attempts made to optimize TPR accesses. */
-    uint32_t        ulTPRPatchAttempts;
+    uint32_t                cTPRPatchAttempts;
 
     /** Number of CPUs on the system (same as LAPIC count). */
-    uint32_t        cCpus;
+    uint32_t                cCpus;
 
 # ifdef VBOX_WITH_STATISTICS
@@ -1306,6 +1313,4 @@
     APICState *s = (APICState *)pvUser;
     Assert(s->pTimerR3 == pTimer);
-
-    APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR);
 # endif /* VBOX */
 
@@ -1315,8 +1320,4 @@
     }
     apic_timer_update(dev, s, s->next_time);
-
-# ifdef VBOX
-    APIC_UNLOCK(dev);
-# endif
 }
 #endif /* IN_RING3 */
@@ -2057,5 +2058,5 @@
 
             if (    index == 0x08 /* TPR */
-                &&  ++s->ulTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
+                &&  ++s->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
             {
 #ifdef IN_RC
@@ -2178,9 +2179,10 @@
 static DECLCALLBACK(void) apicRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
 {
-    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
-    dev->pDevInsRC  = PDMDEVINS_2_RCPTR(pDevIns);
-    dev->pApicHlpRC = dev->pApicHlpR3->pfnGetRCHelpers(pDevIns);
-    dev->pLapicsRC  = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), dev->pLapicsR3);
-    foreach_apic(dev, 0xffffffff,
+    APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
+    pThis->pDevInsRC   = PDMDEVINS_2_RCPTR(pDevIns);
+    pThis->pApicHlpRC  = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
+    pThis->pLapicsRC   = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), pThis->pLapicsR3);
+    pThis->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);
+    foreach_apic(pThis, 0xffffffff,
                  apic->pTimerRC = TMTimerRCPtr(apic->CTX_SUFF(pTimer)));
 }
@@ -2346,4 +2348,5 @@
         return rc;
     }
+    pThis->pCritSectR3 = pThis->pApicHlpR3->pfnGetR3CritSect(pDevIns);
 
     /*
@@ -2376,5 +2379,6 @@
 
     if (fGCEnabled) {
-        pThis->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
+        pThis->pApicHlpRC  = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
+        pThis->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);
 
         rc = PDMDevHlpMMIORegisterGC(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0,
@@ -2385,5 +2389,6 @@
 
     if (fR0Enabled) {
-        pThis->pApicHlpR0 = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns);
+        pThis->pApicHlpR0  = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns);
+        pThis->pCritSectR0 = pThis->pApicHlpR3->pfnGetR0CritSect(pDevIns);
 
         rc = PDMDevHlpMMIORegisterR0(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0,
@@ -2404,5 +2409,5 @@
         apic->pTimerR0 = TMTimerR0Ptr(apic->pTimerR3);
         apic->pTimerRC = TMTimerRCPtr(apic->pTimerR3);
-        /// @todo TMTimerSetCritSect(apic->pTimerR3, pThis->pApicHlpR3->pfnGetCritSect(..));
+        TMR3TimerSetCritSect(apic->pTimerR3, pThis->pCritSectR3);
         apic++;
     }
Index: /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp
===================================================================
--- /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 20091)
+++ /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 20092)
@@ -594,9 +594,17 @@
     GEN_CHECK_OFF(APICDeviceInfo, pDevInsR3);
     GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR3);
+    GEN_CHECK_OFF(APICDeviceInfo, pLapicsR3);
+    GEN_CHECK_OFF(APICDeviceInfo, pCritSectR3);
     GEN_CHECK_OFF(APICDeviceInfo, pDevInsR0);
     GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR0);
+    GEN_CHECK_OFF(APICDeviceInfo, pLapicsR0);
+    GEN_CHECK_OFF(APICDeviceInfo, pCritSectR0);
     GEN_CHECK_OFF(APICDeviceInfo, pDevInsRC);
     GEN_CHECK_OFF(APICDeviceInfo, pApicHlpRC);
-    GEN_CHECK_OFF(APICDeviceInfo, ulTPRPatchAttempts);
+    GEN_CHECK_OFF(APICDeviceInfo, pLapicsRC);
+    GEN_CHECK_OFF(APICDeviceInfo, pCritSectRC);
+    GEN_CHECK_OFF(APICDeviceInfo, enmVersion);
+    GEN_CHECK_OFF(APICDeviceInfo, cTPRPatchAttempts);
+    GEN_CHECK_OFF(APICDeviceInfo, cCpus);
 #ifdef VBOX_WITH_STATISTICS
     GEN_CHECK_OFF(APICDeviceInfo, StatMMIOReadGC);
Index: /trunk/src/VBox/VMM/PDMDevMiscHlp.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMDevMiscHlp.cpp	(revision 20091)
+++ /trunk/src/VBox/VMM/PDMDevMiscHlp.cpp	(revision 20092)
@@ -204,21 +204,4 @@
 }
 
-/** @copydoc PDMAPICHLPR3::pfnLock */
-static DECLCALLBACK(int) pdmR3ApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
-{
-    PDMDEV_ASSERT_DEVINS(pDevIns);
-    LogFlow(("pdmR3ApicHlp_Lock: caller='%s'/%d: rc=%Rrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc));
-    return pdmLockEx(pDevIns->Internal.s.pVMR3, rc);
-}
-
-
-/** @copydoc PDMAPICHLPR3::pfnUnlock */
-static DECLCALLBACK(void) pdmR3ApicHlp_Unlock(PPDMDEVINS pDevIns)
-{
-    PDMDEV_ASSERT_DEVINS(pDevIns);
-    LogFlow(("pdmR3ApicHlp_Unlock: caller='%s'/%d:\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
-    pdmUnlock(pDevIns->Internal.s.pVMR3);
-}
-
 /** @copydoc PDMAPICHLPR3::pfnGetCpuId */
 static DECLCALLBACK(VMCPUID) pdmR3ApicHlp_GetCpuId(PPDMDEVINS pDevIns)
@@ -276,4 +259,36 @@
 
 
+/** @copydoc PDMAPICHLPR3::pfnGetR3CritSect */
+static DECLCALLBACK(R3PTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetR3CritSect(PPDMDEVINS pDevIns)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    LogFlow(("pdmR3ApicHlp_Lock: caller='%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
+    return &pDevIns->Internal.s.pVMR3->pdm.s.CritSect;
+}
+
+
+/** @copydoc PDMAPICHLPR3::pfnGetRCCritSect */
+static DECLCALLBACK(RCPTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetRCCritSect(PPDMDEVINS pDevIns)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    PVM pVM = pDevIns->Internal.s.pVMR3;
+    RTRCPTR RCPtr = MMHyperCCToRC(pVM, &pVM->pdm.s.CritSect);
+    LogFlow(("pdmR3ApicHlp_GetR0CritSect: caller='%s'/%d: return %RRv\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, RCPtr));
+    return RCPtr;
+}
+
+
+/** @copydoc PDMAPICHLPR3::pfnGetR3CritSect */
+static DECLCALLBACK(R0PTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetR0CritSect(PPDMDEVINS pDevIns)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    PVM pVM = pDevIns->Internal.s.pVMR3;
+    RTR0PTR R0Ptr = MMHyperCCToR0(pVM, &pVM->pdm.s.CritSect);
+    LogFlow(("pdmR3ApicHlp_GetR0CritSect: caller='%s'/%d: return %RHv\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, R0Ptr));
+    return R0Ptr;
+}
+
+
+
 /**
  * APIC Device Helpers.
@@ -285,6 +300,4 @@
     pdmR3ApicHlp_ClearInterruptFF,
     pdmR3ApicHlp_ChangeFeature,
-    pdmR3ApicHlp_Lock,
-    pdmR3ApicHlp_Unlock,
     pdmR3ApicHlp_GetCpuId,
     pdmR3ApicHlp_SendSipi,
@@ -292,4 +305,7 @@
     pdmR3ApicHlp_GetRCHelpers,
     pdmR3ApicHlp_GetR0Helpers,
+    pdmR3ApicHlp_GetR3CritSect,
+    pdmR3ApicHlp_GetRCCritSect,
+    pdmR3ApicHlp_GetR0CritSect,
     PDM_APICHLPR3_VERSION /* the end */
 };
