VMMDevHGCM.cpp revision d57637e1064388f3e6f53fe4f3c5c137dcdb7ffa
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * VMMDev - HGCM - Host-Guest Communication Manager Device.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * available from http://www.virtualbox.org. This file is free software;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * General Public License (GPL) as published by the Free Software
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * additional information or have any questions.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync# define VBOXDD_HGCMCALL_ENTER(a,b,c,d) do { } while (0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync# define VBOXDD_HGCMCALL_COMPLETED_REQ(a,b) do { } while (0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync# define VBOXDD_HGCMCALL_COMPLETED_EMT(a,b) do { } while (0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync# define VBOXDD_HGCMCALL_COMPLETED_DONE(a,b,c,d) do { } while (0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Information about a linear ptr parameter. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Index of the parameter. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Offset in the first physical page of the region. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* How many pages. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Pointer to array of the GC physical addresses for these pages.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * It is assumed that the physical address of the locked resident
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * guest page does not change.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Active commands, list is protected by critsectHGCMCmdList. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* The type of the command. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Whether the command was cancelled by the guest. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* GC physical address of the guest request. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Request packet size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Pointer to converted host parameters in case of a Call request.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Parameters follow this structure in the same memory block.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Linear pointer parameters information. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* How many pages for all linptrs of this command.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Only valid if cLinPtrs > 0. This field simplifies loading of saved state.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Pointer to descriptions of linear pointers. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic int vmmdevHGCMCmdListLock (VMMDevState *pVMMDevState)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int rc = RTCritSectEnter (&pVMMDevState->critsectHGCMCmdList);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void vmmdevHGCMCmdListUnlock (VMMDevState *pVMMDevState)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int rc = RTCritSectLeave (&pVMMDevState->critsectHGCMCmdList);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic int vmmdevHGCMAddCommand (VMMDevState *pVMMDevState, PVBOXHGCMCMD pCmd, RTGCPHYS GCPhys, uint32_t cbSize, VBOXHGCMCMDTYPE enmCmdType)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* PPDMDEVINS pDevIns = pVMMDevState->pDevIns; */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Insert at the head of the list. The vmmdevHGCMLoadStateDone depends on this. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Loaded commands already have the right type. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Automatically enable HGCM events, if there are HGCM commands. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Log(("vmmdevHGCMAddCommand: u32HGCMEnabled = %d\n", pVMMDevState->u32HGCMEnabled));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (ASMAtomicCmpXchgU32(&pVMMDevState->u32HGCMEnabled, 1, 0))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync VMMDevCtlSetGuestFilterMask (pVMMDevState, VMMDEV_EVENT_HGCM, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic int vmmdevHGCMRemoveCommand (VMMDevState *pVMMDevState, PVBOXHGCMCMD pCmd)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* PPDMDEVINS pDevIns = pVMMDevState->pDevIns; */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Tail, do nothing. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Find a HGCM command by its physical address.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * The caller is responsible for taking the command list lock before calling
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * this function.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * @returns Pointer to the command on success, NULL otherwise.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * @param pThis The VMMDev instance data.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * @param GCPhys The physical address of the command we're looking
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncDECLINLINE(PVBOXHGCMCMD) vmmdevHGCMFindCommandLocked (VMMDevState *pThis, RTGCPHYS GCPhys)
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic int vmmdevHGCMSaveLinPtr (PPDMDEVINS pDevIns,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Take the offset into the current page also into account! */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32_t cPages = (u32Size + PAGE_SIZE - 1) / PAGE_SIZE;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Log(("vmmdevHGCMSaveLinPtr: parm %d: %RGv %d = %d pages\n", iParm, GCPtr, u32Size, cPages));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Gonvert the guest linear pointers of pages to HC addresses. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* convert */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rc = PDMDevHlpPhysGCPtr2GCPhys(pDevIns, GCPtr, &GCPhys);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Log(("vmmdevHGCMSaveLinPtr: Page %d: %RGv -> %RGp. %Rrc\n", iPage, GCPtr, GCPhys, rc));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* store */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic int vmmdevHGCMWriteLinPtr (PPDMDEVINS pDevIns,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync AssertRelease (u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RTGCPHYS GCPhysDst = pLinPtr->paPages[0] + pLinPtr->offFirstPage;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Log(("vmmdevHGCMWriteLinPtr: parm %d: size %d, cPages = %d\n", iParm, u32Size, pLinPtr->cPages));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Log(("vmmdevHGCMWriteLinPtr: page %d: dst %RGp, src %p, cbWrite %d\n", iPage, GCPhysDst, pu8Src, cbWrite));
u32Size = 0;
return rc;
iPage++;
static int vmmdevHGCMPageListRead(PPDMDEVINSR3 pDevIns, void *pvDst, uint32_t cbDst, const HGCMPageListInfo *pPageListInfo)
return PDMDevHlpPhysRead(pDevIns, pPageListInfo->aPages[0] | pPageListInfo->offFirstPage, pvDst, cbDst);
if (cbRemaining == 0)
return rc;
static int vmmdevHGCMPageListWrite(PPDMDEVINSR3 pDevIns, const HGCMPageListInfo *pPageListInfo, const void *pvSrc, uint32_t cbSrc)
if (cbRemaining == 0)
return rc;
if (pCmd)
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMConnect->header.header.size, VBOXHGCMCMDTYPE_CONNECT);
rc = pVMMDevState->pHGCMDrv->pfnConnect (pVMMDevState->pHGCMDrv, pCmd, &pHGCMConnectCopy->loc, &pHGCMConnectCopy->u32ClientID);
return rc;
static int vmmdevHGCMConnectSaved (VMMDevState *pVMMDevState, VMMDevHGCMConnect *pHGCMConnect, RTGCPHYS GCPhys, bool *pfHGCMCalled, VBOXHGCMCMD *pSavedCmd, VBOXHGCMCMD **ppCmd)
if (pCmd)
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMConnect->header.header.size, VBOXHGCMCMDTYPE_CONNECT);
rc = pVMMDevState->pHGCMDrv->pfnConnect (pVMMDevState->pHGCMDrv, pCmd, &pHGCMConnectCopy->loc, &pHGCMConnectCopy->u32ClientID);
*pfHGCMCalled = true;
return rc;
int vmmdevHGCMDisconnect (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect, RTGCPHYS GCPhys)
if (pCmd)
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMDisconnect->header.header.size, VBOXHGCMCMDTYPE_DISCONNECT);
rc = pVMMDevState->pHGCMDrv->pfnDisconnect (pVMMDevState->pHGCMDrv, pCmd, pHGCMDisconnect->u32ClientID);
return rc;
static int vmmdevHGCMDisconnectSaved (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect, RTGCPHYS GCPhys, bool *pfHGCMCalled, VBOXHGCMCMD *pSavedCmd, VBOXHGCMCMD **ppCmd)
if (pCmd)
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMDisconnect->header.header.size, VBOXHGCMCMDTYPE_DISCONNECT);
rc = pVMMDevState->pHGCMDrv->pfnDisconnect (pVMMDevState->pHGCMDrv, pCmd, pHGCMDisconnect->u32ClientID);
*pfHGCMCalled = true;
return rc;
int vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCall, RTGCPHYS GCPhys, bool f64Bits)
Log(("vmmdevHGCMCall: client id = %d, function = %d, %s bit\n", pHGCMCall->u32ClientID, pHGCMCall->u32Function, f64Bits? "64": "32"));
uint32_t i;
if (f64Bits)
#ifdef VBOX_WITH_64_BITS_GUESTS
cLinPtrs++;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
#ifdef VBOX_WITH_64_BITS_GUESTS
cLinPtrs++;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
return rc;
return VERR_NO_MEMORY;
if (cLinPtrs > 0)
return VERR_NO_MEMORY;
if (cParms != 0)
if (f64Bits)
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size == 0)
rc = vmmdevHGCMSaveLinPtr (pVMMDevState->pDevIns, i, linearAddr, size, iLinPtr, pCmd->paLinPtrs, &pPages);
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size == 0)
AssertFailed();
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size == 0)
rc = vmmdevHGCMSaveLinPtr (pVMMDevState->pDevIns, i, linearAddr, size, iLinPtr, pCmd->paLinPtrs, &pPages);
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size == 0)
AssertFailed();
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMCall->header.header.size, VBOXHGCMCMDTYPE_CALL);
return rc;
static void logRelLoadStatePointerIndexMismatch (uint32_t iParm, uint32_t iSavedParm, int iLinPtr, int cLinPtrs)
LogRel(("Warning: VMMDev load state: a pointer parameter index mismatch %d (expected %d) (%d/%d)\n",
static int vmmdevHGCMCallSaved (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall, RTGCPHYS GCPhys, uint32_t cbHGCMCall, bool f64Bits, bool *pfHGCMCalled, VBOXHGCMCMD *pSavedCmd, VBOXHGCMCMD **ppCmd)
Log(("vmmdevHGCMCallSaved: client id = %d, function = %d, %s bit\n", pHGCMCall->u32ClientID, pHGCMCall->u32Function, f64Bits? "64": "32"));
uint32_t i;
if (f64Bits)
#ifdef VBOX_WITH_64_BITS_GUESTS
cLinPtrs++;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
#ifdef VBOX_WITH_64_BITS_GUESTS
cLinPtrs++;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
return rc;
AssertFailed();
return VERR_INVALID_PARAMETER;
return VERR_NO_MEMORY;
vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPhys, pHGCMCall->header.header.size, VBOXHGCMCMDTYPE_CALL);
if (cParms != 0)
int iLinPtr = 0;
if (f64Bits)
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size == 0)
logRelLoadStatePointerIndexMismatch (iParm, pCmd->paLinPtrs[iLinPtr].iParm, iLinPtr, pCmd->cLinPtrs);
if (cbRemaining == 0)
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size == 0)
AssertFailed();
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size == 0)
logRelLoadStatePointerIndexMismatch (iParm, pCmd->paLinPtrs[iLinPtr].iParm, iLinPtr, pCmd->cLinPtrs);
if (cbRemaining == 0)
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size == 0)
AssertFailed();
rc = pVMMDevState->pHGCMDrv->pfnCall (pVMMDevState->pHGCMDrv, pCmd, pHGCMCall->u32ClientID, pHGCMCall->u32Function, cParms, pCmd->paHostParms);
*pfHGCMCalled = true;
return rc;
if ( GCPhys == 0
return VERR_INVALID_PARAMETER;
if (pCmd)
return rc;
case VBOXHGCMCMDTYPE_CONNECT:
case VBOXHGCMCMDTYPE_CALL:
#ifdef VBOX_WITH_64_BITS_GUESTS
AssertFailed ();
LogRel(("VMMDEV: Invalid HGCM command: pCmd->enmCmdType = 0x%08X, pHeader->header.requestType = 0x%08X\n",
return VERR_INVALID_PARAMETER;
#define PDMIHGCMPORT_2_VMMDEVSTATE(pInterface) ( (VMMDevState *) ((uintptr_t)pInterface - RT_OFFSETOF(VMMDevState, HGCMPort)) )
DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmd)
#ifdef VBOX_WITH_DTRACE
#ifdef VBOX_WITH_64_BITS_GUESTS
/** @todo s/pVMMDevState/pThis/g */
* didn't have to mess around with PDMDevHlpPhysRead/Write. We're
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevReq_HGCMCall64:
uint32_t i;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size > 0)
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size > 0)
/* Copy pHostParm->u.pointer.addr[pHostParm->u.pointer.size] to pages. */
rc = vmmdevHGCMPageListWrite(pVMMDevState->pDevIns, pPageListInfo, pHostParm->u.pointer.addr, size);
# ifdef VBOX_WITH_DTRACE
case VMMDevReq_HGCMCall32:
uint32_t i;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size > 0)
rc = vmmdevHGCMWriteLinPtr (pVMMDevState->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size > 0)
/* Copy pHostParm->u.pointer.addr[pHostParm->u.pointer.size] to pages. */
rc = vmmdevHGCMPageListWrite(pVMMDevState->pDevIns, pPageListInfo, pHostParm->u.pointer.addr, size);
# ifdef VBOX_WITH_DTRACE
case VMMDevReq_HGCMCall:
uint32_t i;
case VMMDevHGCMParmType_32bit:
case VMMDevHGCMParmType_64bit:
if (size > 0)
rc = vmmdevHGCMWriteLinPtr (pVMMDevState->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
iLinPtr++;
HGCMPageListInfo *pPageListInfo = (HGCMPageListInfo *)((uint8_t *)pHGCMCall + pGuestParm->u.PageList.offset);
uint32_t cbPageListInfo = sizeof (HGCMPageListInfo) + (pPageListInfo->cPages - 1) * sizeof (pPageListInfo->aPages[0]);
if (size > 0)
/* Copy pHostParm->u.pointer.addr[pHostParm->u.pointer.size] to pages. */
rc = vmmdevHGCMPageListWrite(pVMMDevState->pDevIns, pPageListInfo, pHostParm->u.pointer.addr, size);
# ifdef VBOX_WITH_DTRACE
case VMMDevReq_HGCMConnect:
while (pIter)
cCmds++;
if (cCmds > 0)
while (pIter)
return rc;
while (cCmds--)
while (cCmds--)
RTGCPHYS *pPages = (RTGCPHYS *)((uint8_t *)pCmd->paLinPtrs + sizeof (VBOXHGCMLINPTR) * pCmd->cLinPtrs);
int cPages = 0;
cPages++;
return VERR_SSM_UNEXPECTED_DATA;
return rc;
pVMMDevState->pHGCMCmdList = NULL; /* Reset the list. Saved commands will be processed and deallocated. */
while (pIter)
bool fHGCMCalled = false;
return VERR_NO_MEMORY;
Log(("VMMDev: guest header version (0x%08X) differs from ours (0x%08X)\n", requestHeader->header.version, VMMDEV_REQUEST_HEADER_VERSION));
Log(("VMMDev request issued: %d, command type %d\n", requestHeader->header.requestType, pIter->enmCmdType));
case VBOXHGCMCMDTYPE_CONNECT:
requestHeader->header.rc = vmmdevHGCMConnectSaved (pVMMDevState, pHGCMConnect, pIter->GCPhys, &fHGCMCalled, pIter, &pCmd);
requestHeader->header.rc = vmmdevHGCMDisconnectSaved (pVMMDevState, pHGCMDisconnect, pIter->GCPhys, &fHGCMCalled, pIter, &pCmd);
case VBOXHGCMCMDTYPE_CALL:
#ifdef VBOX_WITH_64_BITS_GUESTS
bool f64Bits = false;
requestHeader->header.rc = vmmdevHGCMCallSaved (pVMMDevState, pHGCMCall, pIter->GCPhys, requestHeader->header.size, f64Bits, &fHGCMCalled, pIter, &pCmd);
case VMMDevReq_HGCMConnect:
case VMMDevReq_HGCMDisconnect:
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevReq_HGCMCall64:
case VMMDevReq_HGCMCall32:
case VMMDevReq_HGCMCall:
#ifdef VBOX_WITH_64_BITS_GUESTS
bool f64Bits = false;
requestHeader->header.rc = vmmdevHGCMCall (pVMMDevState, pHGCMCall, requestHeader->header.size, pIter->GCPhys, f64Bits);
LogRel(("VMMDEV: Ignoring unknown request type %x during LoadState\n", requestHeader->header.requestType));
LogRel(("VMMDEV: Ignoring unknown request type %x during LoadState\n", requestHeader->header.requestType));
if (!fHGCMCalled)
if (!fHGCMCalled)
if (pCmd)
return rc;