Index: /trunk/src/VBox/Devices/Audio/DevHDA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHDA.cpp	(revision 87810)
+++ /trunk/src/VBox/Devices/Audio/DevHDA.cpp	(revision 87811)
@@ -1387,5 +1387,5 @@
         LogFunc(("[SD%RU8] Reset enter\n", uSD));
 
-        hdaR3StreamLock(pStreamR3);
+        hdaStreamLock(pStreamShared);
 
 # ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
@@ -1400,5 +1400,5 @@
         hdaR3StreamAsyncIOUnlock(pStreamR3);
 # endif
-        hdaR3StreamUnlock(pStreamR3);
+        hdaStreamUnlock(pStreamShared);
     }
     else
@@ -1412,5 +1412,5 @@
             LogFunc(("[SD%RU8] State changed (fRun=%RTbool)\n", uSD, fRun));
 
-            hdaR3StreamLock(pStreamR3);
+            hdaStreamLock(pStreamShared);
 
             int rc2 = VINF_SUCCESS;
@@ -1506,5 +1506,5 @@
 # endif
             /* Make sure to leave the lock before (eventually) starting the timer. */
-            hdaR3StreamUnlock(pStreamR3);
+            hdaStreamUnlock(pStreamShared);
         }
     }
@@ -1526,5 +1526,4 @@
     AssertReturn(uSD < RT_ELEMENTS(pThis->aStreams), VERR_INTERNAL_ERROR_3); /* paranoia^2: Bad g_aHdaRegMap. */
     PHDASTATER3 const  pThisCC       = PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER3);
-    PHDASTREAMR3 const pStreamR3     = &pThisCC->aStreams[uSD];
     PHDASTREAM const   pStreamShared = &pThis->aStreams[uSD];
 
@@ -1539,5 +1538,5 @@
     }
 
-    hdaR3StreamLock(pStreamR3);
+    hdaStreamLock(pStreamShared);
 
     uint32_t v = HDA_REG_IND(pThis, iReg);
@@ -1625,5 +1624,5 @@
     if (cTransferTicks)
         PDMDevHlpTimerUnlockClock(pDevIns, pStreamShared->hTimer); /* Caller will unlock pThis->CritSect. */
-    hdaR3StreamUnlock(pStreamR3);
+    hdaStreamUnlock(pStreamShared);
     return VINF_SUCCESS;
 #else  /* !IN_RING3 */
@@ -2707,5 +2706,5 @@
                      pSink->pMixSink->pszName, pSink->pStreamShared->u8SD, pSink->pStreamShared->u8Channel));
 
-            hdaR3StreamLock(pSink->pStreamR3);
+            hdaStreamLock(pSink->pStreamShared);
 
             /* Only disable the stream if the stream descriptor # has changed. */
@@ -2715,5 +2714,5 @@
             pSink->pStreamR3->pMixSink = NULL;
 
-            hdaR3StreamUnlock(pSink->pStreamR3);
+            hdaStreamUnlock(pSink->pStreamShared);
 
             pSink->pStreamShared = NULL;
@@ -2730,5 +2729,5 @@
             PHDASTREAMR3 pStreamR3     = &pThisCC->aStreams[uSD];
             PHDASTREAM   pStreamShared = &pThis->aStreams[uSD];
-            hdaR3StreamLock(pStreamR3);
+            hdaStreamLock(pStreamShared);
 
             pSink->pStreamR3     = pStreamR3;
@@ -2738,5 +2737,5 @@
             pStreamR3->pMixSink      = pSink;
 
-            hdaR3StreamUnlock(pStreamR3);
+            hdaStreamUnlock(pStreamShared);
             rc = VINF_SUCCESS;
         }
Index: /trunk/src/VBox/Devices/Audio/HDAStream.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/HDAStream.cpp	(revision 87810)
+++ /trunk/src/VBox/Devices/Audio/HDAStream.cpp	(revision 87811)
@@ -75,8 +75,11 @@
 #endif
 
-# ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-    rc = RTCritSectInit(&pStreamR3->CritSect);
+#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
+    AssertPtr(pStreamR3->pHDAStateR3);
+    AssertPtr(pStreamR3->pHDAStateR3->pDevIns);
+    rc = PDMDevHlpCritSectInit(pStreamR3->pHDAStateR3->pDevIns, &pStreamShared->CritSect,
+                               RT_SRC_POS, "hda_sd#%RU8", pStreamShared->u8SD);
     AssertRCReturn(rc, rc);
-# endif
+#endif
 
     rc = hdaR3StreamPeriodCreate(&pStreamShared->State.Period);
@@ -175,11 +178,11 @@
 #endif
 
-# ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-    if (RTCritSectIsInitialized(&pStreamR3->CritSect))
-    {
-        rc2 = RTCritSectDelete(&pStreamR3->CritSect);
+#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
+    if (PDMCritSectIsInitialized(&pStreamShared->CritSect))
+    {
+        rc2 = PDMR3CritSectDelete(&pStreamShared->CritSect);
         AssertRC(rc2);
     }
-# endif
+#endif
 
     if (pStreamR3->State.pCircBuf)
@@ -1096,5 +1099,5 @@
 
     uint8_t const uSD = pStreamShared->u8SD;
-    hdaR3StreamLock(pStreamR3);
+    hdaStreamLock(pStreamShared);
 
     PHDASTREAMPERIOD pPeriod = &pStreamShared->State.Period;
@@ -1121,5 +1124,5 @@
     if (!fProceed)
     {
-        hdaR3StreamUnlock(pStreamR3);
+        hdaStreamUnlock(pStreamShared);
         return VINF_SUCCESS;
     }
@@ -1581,5 +1584,5 @@
     LogFlowFuncLeave();
 
-    hdaR3StreamUnlock(pStreamR3);
+    hdaStreamUnlock(pStreamShared);
 
     return VINF_SUCCESS;
@@ -1788,15 +1791,13 @@
  *
  * @returns IPRT status code.
- * @param   pStreamR3           HDA stream to lock (ring-3 bits).
- */
-void hdaR3StreamLock(PHDASTREAMR3 pStreamR3)
-{
-    AssertPtrReturnVoid(pStreamR3);
+ * @param   pStreamShared       HDA stream to lock (shared bits).
+ */
+void hdaStreamLock(PHDASTREAM pStreamShared)
+{
+    AssertPtrReturnVoid(pStreamShared);
 # ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-    int rc2 = RTCritSectEnter(&pStreamR3->CritSect);
+    int rc2 = PDMCritSectEnter(&pStreamShared->CritSect, VINF_SUCCESS);
     AssertRC(rc2);
-# else
-    Assert(PDMDevHlpCritSectIsOwner(pStream->pHDAState->pDevInsR3, pStream->pHDAState->CritSect));
-# endif
+#endif
 }
 
@@ -1805,11 +1806,11 @@
  *
  * @returns IPRT status code.
- * @param   pStreamR3           HDA stream to unlock (ring-3 bits).
- */
-void hdaR3StreamUnlock(PHDASTREAMR3 pStreamR3)
-{
-    AssertPtrReturnVoid(pStreamR3);
+ * @param   pStreamShared       HDA stream to unlock (shared bits).
+ */
+void hdaStreamUnlock(PHDASTREAM pStreamShared)
+{
+    AssertPtrReturnVoid(pStreamShared);
 # ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-    int rc2 = RTCritSectLeave(&pStreamR3->CritSect);
+    int rc2 = PDMCritSectLeave(&pStreamShared->CritSect);
     AssertRC(rc2);
 # endif
Index: /trunk/src/VBox/Devices/Audio/HDAStream.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/HDAStream.h	(revision 87810)
+++ /trunk/src/VBox/Devices/Audio/HDAStream.h	(revision 87811)
@@ -191,4 +191,9 @@
     uint8_t                     u8Channel;
     uint8_t                     abPadding0[6];
+#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
+    /** The stream's shared r0/r3 critical section to serialize access between the async I/O
+     *  thread and (basically) the guest. */
+    PDMCRITSECT                 CritSect;
+#endif
     /** DMA base address (SDnBDPU - SDnBDPL).
      *  Will be updated in hdaR3StreamInit(). */
@@ -238,9 +243,4 @@
     /** Pointer to HDA sink this stream is attached to. */
     R3PTRTYPE(PHDAMIXERSINK)    pMixSink;
-#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-    /** The stream's critical section to serialize access between the async I/O
-     *  thread and (basically) the guest. */
-    RTCRITSECT                  CritSect;
-#endif
     /** Internal state of this stream. */
     struct
@@ -281,6 +281,6 @@
 bool                hdaR3StreamTransferIsScheduled(PHDASTREAM pStreamShared, uint64_t tsNow);
 uint64_t            hdaR3StreamTransferGetNext(PHDASTREAM pStreamShared);
-void                hdaR3StreamLock(PHDASTREAMR3 pStreamR3);
-void                hdaR3StreamUnlock(PHDASTREAMR3 pStreamR3);
+void                hdaStreamLock(PHDASTREAM pStreamShared);
+void                hdaStreamUnlock(PHDASTREAM pStreamShared);
 void                hdaR3StreamUpdate(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATER3 pThisCC,
                                       PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fInTimer);
