4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2010 Oracle Corporation
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync *
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * available from http://www.virtualbox.org. This file is free software;
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * you can redistribute it and/or modify it under the terms of the GNU
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * General Public License (GPL) as published by the Free Software
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync */
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync#include "SHGSMIHost.h"
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync#include <VBox/VBoxVideo.h>
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync/*
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * VBOXSHGSMI made on top HGSMI and allows receiving notifications
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync * about G->H command completion
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync */
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsyncstatic bool vboxSHGSMICommandCanCompleteSynch (PVBOXSHGSMIHEADER pHdr)
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync{
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync return !(pHdr->fFlags & VBOXSHGSMI_FLAG_GH_ASYNCH_FORCE);
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync}
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsyncstatic int vboxSHGSMICommandCompleteAsynch (PHGSMIINSTANCE pIns, PVBOXSHGSMIHEADER pHdr)
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync{
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync bool bDoIrq = !!(pHdr->fFlags & VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ)
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync || !!(pHdr->fFlags & VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ_FORCE);
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync return HGSMICompleteGuestCommand(pIns, pHdr, bDoIrq);
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync}
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsyncvoid VBoxSHGSMICommandMarkAsynchCompletion (void *pvData)
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync{
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync PVBOXSHGSMIHEADER pHdr = VBoxSHGSMIBufferHeader (pvData);
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync Assert(!(pHdr->fFlags & VBOXSHGSMI_FLAG_HG_ASYNCH));
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync pHdr->fFlags |= VBOXSHGSMI_FLAG_HG_ASYNCH;
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync}
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync
02c33b191e5c82efdf0c0480ab7b28bab697feefvboxsyncint VBoxSHGSMICommandComplete (PHGSMIINSTANCE pIns, void *pvData)
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync{
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync PVBOXSHGSMIHEADER pHdr = VBoxSHGSMIBufferHeader (pvData);
02c33b191e5c82efdf0c0480ab7b28bab697feefvboxsync if (!(pHdr->fFlags & VBOXSHGSMI_FLAG_HG_ASYNCH) /* <- check if synchronous completion */
02c33b191e5c82efdf0c0480ab7b28bab697feefvboxsync && vboxSHGSMICommandCanCompleteSynch(pHdr)) /* <- check if can complete synchronously */
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync return VINF_SUCCESS;
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync pHdr->fFlags |= VBOXSHGSMI_FLAG_HG_ASYNCH;
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync return vboxSHGSMICommandCompleteAsynch(pIns, pHdr);
4d6b317d67ba577744e53cdfa0c7472d4223db5avboxsync}