/** * Process the critical sections (both types) queued for ring-3 'leave'. * * @param pVCpu The cross context virtual CPU structure. */ VMM_INT_DECL(void) PDMCritSectBothFF(PVMCPU pVCpu) { uint32_t i; Assert( pVCpu->pdm.s.cQueuedCritSectLeaves > 0 || pVCpu->pdm.s.cQueuedCritSectRwShrdLeaves > 0 || pVCpu->pdm.s.cQueuedCritSectRwExclLeaves > 0); /* Shared leaves. */ i = pVCpu->pdm.s.cQueuedCritSectRwShrdLeaves; pVCpu->pdm.s.cQueuedCritSectRwShrdLeaves = 0; while (i-- > 0) { # ifdef IN_RING3 PPDMCRITSECTRW pCritSectRw = pVCpu->pdm.s.apQueuedCritSectRwShrdLeaves[i]; # else PPDMCRITSECTRW pCritSectRw = (PPDMCRITSECTRW)MMHyperR3ToCC(pVCpu->CTX_SUFF(pVM), pVCpu->pdm.s.apQueuedCritSectRwShrdLeaves[i]); # endif pdmCritSectRwLeaveSharedQueued(pCritSectRw); LogFlow(("PDMR3CritSectFF: %p (R/W)\n", pCritSectRw)); } /* Last, exclusive leaves. */ i = pVCpu->pdm.s.cQueuedCritSectRwExclLeaves; pVCpu->pdm.s.cQueuedCritSectRwExclLeaves = 0; while (i-- > 0) { # ifdef IN_RING3 PPDMCRITSECTRW pCritSectRw = pVCpu->pdm.s.apQueuedCritSectRwExclLeaves[i]; # else PPDMCRITSECTRW pCritSectRw = (PPDMCRITSECTRW)MMHyperR3ToCC(pVCpu->CTX_SUFF(pVM), pVCpu->pdm.s.apQueuedCritSectRwExclLeaves[i]); # endif pdmCritSectRwLeaveExclQueued(pCritSectRw); LogFlow(("PDMR3CritSectFF: %p (R/W)\n", pCritSectRw)); } /* Normal leaves. */ i = pVCpu->pdm.s.cQueuedCritSectLeaves; pVCpu->pdm.s.cQueuedCritSectLeaves = 0; while (i-- > 0) { # ifdef IN_RING3 PPDMCRITSECT pCritSect = pVCpu->pdm.s.apQueuedCritSectLeaves[i]; # else PPDMCRITSECT pCritSect = (PPDMCRITSECT)MMHyperR3ToCC(pVCpu->CTX_SUFF(pVM), pVCpu->pdm.s.apQueuedCritSectLeaves[i]); # endif PDMCritSectLeave(pCritSect); LogFlow(("PDMR3CritSectFF: %p\n", pCritSect)); } VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_PDM_CRITSECT); }
/** * Process the critical sections queued for ring-3 'leave'. * * @param pVCpu The VMCPU handle. */ VMMDECL(void) PDMCritSectFF(PVMCPU pVCpu) { Assert(pVCpu->pdm.s.cQueuedCritSectLeaves > 0); const RTUINT c = pVCpu->pdm.s.cQueuedCritSectLeaves; for (RTUINT i = 0; i < c; i++) { # ifdef IN_RING3 PPDMCRITSECT pCritSect = pVCpu->pdm.s.apQueuedCritSectsLeaves[i]; # else PPDMCRITSECT pCritSect = (PPDMCRITSECT)MMHyperR3ToCC(pVCpu->CTX_SUFF(pVM), pVCpu->pdm.s.apQueuedCritSectsLeaves[i]); # endif PDMCritSectLeave(pCritSect); LogFlow(("PDMR3CritSectFF: %p\n", pCritSect)); } pVCpu->pdm.s.cQueuedCritSectLeaves = 0; VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_PDM_CRITSECT); }