int vboxVhwaCommandSubmit(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd) { #ifdef VBOXVHWA_WITH_SHGSMI const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); Assert(pHdr); int rc = VERR_GENERAL_FAILURE; if (pHdr) { do { HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); Assert(offCmd != HGSMIOFFSET_VOID); if (offCmd != HGSMIOFFSET_VOID) { rc = vboxVhwaCommandSubmitHgsmi(pDevExt, offCmd); AssertRC(rc); if (RT_SUCCESS(rc)) { VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); AssertRC(rc); break; } } else rc = VERR_INVALID_PARAMETER; /* fail to submit, cancel it */ VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); } while (0); } else rc = VERR_INVALID_PARAMETER; return rc; #else RTSEMEVENT hEvent; int rc = RTSemEventCreate(&hEvent); AssertRC(rc); if (RT_SUCCESS(rc)) { pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ; vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent); rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT); AssertRC(rc); if (RT_SUCCESS(rc)) RTSemEventDestroy(hEvent); } return rc; #endif }
static int vboxCmdVbvaCtlSubmitSync(PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, VBOXCMDVBVA_CTL * pCtl) { const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pHGSMICtx->heapCtx, pCtl); if (!pHdr) { WARN(("VBoxSHGSMICommandPrepSynch returnd NULL")); return VERR_INVALID_PARAMETER; } HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pHGSMICtx->heapCtx, pHdr); if (offCmd == HGSMIOFFSET_VOID) { WARN(("VBoxSHGSMICommandOffset returnd NULL")); VBoxSHGSMICommandCancelSynch(&pHGSMICtx->heapCtx, pHdr); return VERR_INVALID_PARAMETER; } int rc = vboxCmdVbvaSubmit(pHGSMICtx, offCmd); if (RT_SUCCESS(rc)) { rc = VBoxSHGSMICommandDoneSynch(&pHGSMICtx->heapCtx, pHdr); if (RT_SUCCESS(rc)) { rc = pCtl->i32Result; if (!RT_SUCCESS(rc)) WARN(("pCtl->i32Result %d", pCtl->i32Result)); return rc; } else WARN(("VBoxSHGSMICommandDoneSynch returnd %d", rc)); } else WARN(("vboxCmdVbvaSubmit returnd %d", rc)); VBoxSHGSMICommandCancelSynch(&pHGSMICtx->heapCtx, pHdr); return rc; }