VMMDevInterface.cpp revision c74ea5ca6312c23032dca359df1759780503475e
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * VirtualBox Driver Interface to VMM device.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * available from http://www.virtualbox.org. This file is free software;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * you can redistribute it and/or modify it under the terms of the GNU
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * General Public License (GPL) as published by the Free Software
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * additional information or have any questions.
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# if defined(RT_OS_DARWIN) && defined(VBOX_WITH_CROGL)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync * VMMDev driver instance data.
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the VMMDev object. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the driver instance structure. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the VMMDev port interface of the driver/device above us. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Our VMM device connector interface. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the HGCM port interface of the driver/device above us. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Our HGCM connector interface. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/** Converts PDMIVMMDEVCONNECTOR pointer to a DRVMAINVMMDEV pointer. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface) ( (PDRVMAINVMMDEV) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINVMMDEV, Connector)) )
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/** Converts PDMIHGCMCONNECTOR pointer to a DRVMAINVMMDEV pointer. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface) ( (PDRVMAINVMMDEV) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINVMMDEV, HGCMConnector)) )
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// constructor / destructor
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif /* VBOX_WITH_HGCM */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif /* VBOX_WITH_HGCM */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// public methods
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Wait on event semaphore for guest credential judgement result.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::WaitCredentialsJudgement (uint32_t u32Timeout, uint32_t *pu32CredentialsFlags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = RTSemEventWait (mCredentialsEvent, u32Timeout);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::SetCredentialsJudgementResult (uint32_t u32Flags)
d331ca5667e19a46f1e967617184483bec985e86vboxsync * Report guest OS version.
d331ca5667e19a46f1e967617184483bec985e86vboxsync * Called whenever the Additions issue a guest version report request or the VM is reset.
d331ca5667e19a46f1e967617184483bec985e86vboxsync * @param pInterface Pointer to this interface.
d331ca5667e19a46f1e967617184483bec985e86vboxsync * @param guestInfo Pointer to guest information structure
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncDECLCALLBACK(void) vmmdevUpdateGuestVersion(PPDMIVMMDEVCONNECTOR pInterface, VBoxGuestInfo *guestInfo)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTStrPrintf(version, sizeof(version), "%d", guestInfo->additionsVersion);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setAdditionsVersion(Bstr(version), guestInfo->osType);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync * so that it can notify its consumers.
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * The guest additions was disabled because of a reset
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * or driver unload.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setAdditionsVersion (Bstr(), guestInfo->osType);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the guest additions capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the guest additions capabilities change. The new capabilities
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * are given and the connector should update its internal state.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param newCapabilities New capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsyncDECLCALLBACK(void) vmmdevUpdateGuestCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setSupportsSeamless(BOOL (newCapabilities & VMMDEV_GUEST_SUPPORTS_SEAMLESS));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setSupportsGraphics(BOOL (newCapabilities & VMMDEV_GUEST_SUPPORTS_GRAPHICS));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * so that it can notify its consumers.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the mouse capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the mouse capabilities change. The new capabilities
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * are given and the connector should update its internal state.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param newCapabilities New capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) vmmdevUpdateMouseCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * so that it can notify its consumers.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Mouse *pMouse = pDrv->pVMMDev->getParent()->getMouse();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pMouse) /** @todo and if not? Can that actually happen? */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMouse->onVMMDevCanAbsChange(!!(newCapabilities & VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMouse->onVMMDevNeedsHostChange(!!(newCapabilities & VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the pointer shape or visibility.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the mouse pointer shape changes or pointer is hidden/displaying.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * The new shape is passed as a caller allocated buffer that will be freed after returning.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param fVisible Whether the pointer is visible or not.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param fAlpha Alpha channel information is present.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param xHot Horizontal coordinate of the pointer hot spot.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param yHot Vertical coordinate of the pointer hot spot.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param width Pointer width in pixels.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param height Pointer height in pixels.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pShape The shape buffer. If NULL, then only pointer visibility is being changed.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) vmmdevUpdatePointerShape(PPDMIVMMDEVCONNECTOR pInterface, bool fVisible, bool fAlpha,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* tell the console about it */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onMousePointerShapeChange(fVisible, fAlpha,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) iface_VideoAccelEnable(PPDMIVMMDEVCONNECTOR pInterface, bool fEnable, VBVAMEMORY *pVbvaMemory)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Display *display = pDrv->pVMMDev->getParent()->getDisplay();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("MAIN::VMMDevInterface::iface_VideoAccelEnable: %d, %p\n", fEnable, pVbvaMemory));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return display->VideoAccelEnable (fEnable, pVbvaMemory);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) iface_VideoAccelFlush(PPDMIVMMDEVCONNECTOR pInterface)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Display *display = pDrv->pVMMDev->getParent()->getDisplay();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("MAIN::VMMDevInterface::iface_VideoAccelFlush\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevVideoModeSupported(PPDMIVMMDEVCONNECTOR pInterface, uint32_t display, uint32_t width, uint32_t height,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Log(("vmmdevVideoModeSupported: [%d]: %dx%dx%d\n", display, width, height, bpp));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync HRESULT hrc = pDrv->pVMMDev->getParent()->getDisplay()->GetFramebuffer(display, &framebuffer, &xOrigin, &yOrigin);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->VideoModeSupported(width, height, bpp, (BOOL*)fSupported);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Log(("vmmdevVideoModeSupported: hrc %x, framebuffer %p!!!\n", hrc, framebuffer));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevGetHeightReduction(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *heightReduction)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->COMGETTER(HeightReduction)((ULONG*)heightReduction);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevSetCredentialsJudgementResult(PPDMIVMMDEVCONNECTOR pInterface, uint32_t u32Flags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int rc = pDrv->pVMMDev->SetCredentialsJudgementResult (u32Flags);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevSetVisibleRegion(PPDMIVMMDEVCONNECTOR pInterface, uint32_t cRect, PRTRECT pRect)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->SetVisibleRegion((BYTE *)pRect, cRect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#if defined(RT_OS_DARWIN) && defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->machine()->COMGETTER(Accelerate3DEnabled)(&is3denabled);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[0].u.pointer.size = 0; /* We don't actually care. */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = pDrv->pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_SET_VISIBLE_REGION, 2, &parms[0]);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncDECLCALLBACK(int) vmmdevQueryVisibleRegion(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcRect, PRTRECT pRect)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->GetVisibleRegion((BYTE *)pRect, cRect, &cRect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Request the statistics interval
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @returns VBox status code.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @param pInterface Pointer to this interface.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @param pulInterval Pointer to interval in seconds
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @thread The emulation thread.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncDECLCALLBACK(int) vmmdevQueryStatisticsInterval(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pulInterval)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* store that information in IGuest */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Query the current balloon size
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pcbBalloon Balloon size
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevQueryBalloonSize(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcbBalloon)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Report new guest statistics
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pGuestStats Guest statistics
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevReportStatistics(PPDMIVMMDEVCONNECTOR pInterface, VBoxGuestStatistics *pGuestStats)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_IDLE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUIDLE, pGuestStats->u32CpuLoad_Idle);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_KERNEL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUKERNEL, pGuestStats->u32CpuLoad_Kernel);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_USER)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUUSER, pGuestStats->u32CpuLoad_User);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /** @todo r=bird: Convert from 4KB to 1KB units?
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * CollectorGuestHAL::getGuestMemLoad says it returns KB units to
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * preCollect(). I might be wrong ofc, this is convoluted code... */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_TOTAL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMTOTAL, pGuestStats->u32PhysMemTotal);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_AVAIL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMFREE, pGuestStats->u32PhysMemAvail);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_BALLOON)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMBALLOON, pGuestStats->u32PhysMemBalloon);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_MEM_SYSTEM_CACHE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMCACHE, pGuestStats->u32MemSystemCache);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PAGE_FILE_SIZE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_PAGETOTAL, pGuestStats->u32PageFileSize);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/* HGCM connector interface */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmConnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, PHGCMSERVICELOCATION pServiceLocation, uint32_t *pu32ClientID)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync || ( pServiceLocation->type != VMMDevHGCMLoc_LocalHost
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync && pServiceLocation->type != VMMDevHGCMLoc_LocalHost_Existing))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestConnect (pDrv->pHGCMPort, pCmd, pServiceLocation->u.host.achName, pu32ClientID);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmDisconnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestDisconnect (pDrv->pHGCMPort, pCmd, u32ClientID);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmCall (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID, uint32_t u32Function,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestCall (pDrv->pHGCMPort, pCmd, u32ClientID, u32Function, cParms, paParms);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Execute state save operation.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns Driver instance of the driver which registered the data unit.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pSSM SSM operation handle.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmSave(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Execute state load operation.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns Driver instance of the driver which registered the data unit.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pSSM SSM operation handle.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param uVersion Data layout version.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param uPass The data pass.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmLoad(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::hgcmLoadService (const char *pszServiceLibrary, const char *pszServiceName)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostLoad (pszServiceLibrary, pszServiceName);
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsyncint VMMDev::hgcmHostCall (const char *pszServiceName, uint32_t u32Function,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostCall (pszServiceName, u32Function, cParms, paParms);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* HGCM */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void *) VMMDev::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIVMMDEVCONNECTOR, &pDrv->Connector);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHGCMCONNECTOR, &pDrv->HGCMConnector);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Destruct a VMMDev driver instance.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns The driver instance data.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) VMMDev::drvDestruct(PPDMDRVINS pDrvIns)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("VMMDev::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* HGCM is shut down on the VMMDev destructor. */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* VBOX_WITH_HGCM */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Reset notification.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns The driver instance data.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) VMMDev::drvReset(PPDMDRVINS pDrvIns)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("VMMDev::drvReset: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* VBOX_WITH_HGCM */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Construct a VMMDev driver instance.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @copydoc FNPDMDRVCONSTRUCT
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) VMMDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("Keyboard::drvConstruct: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Validate configuration.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ("Configuration error: Not possible to attach anything to this driver!\n"),
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrvIns->IBase.pfnQueryInterface = VMMDev::drvQueryInterface;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateGuestVersion = vmmdevUpdateGuestVersion;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateGuestCapabilities = vmmdevUpdateGuestCapabilities;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateMouseCapabilities = vmmdevUpdateMouseCapabilities;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnUpdatePointerShape = vmmdevUpdatePointerShape;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoAccelEnable = iface_VideoAccelEnable;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoAccelFlush = iface_VideoAccelFlush;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoModeSupported = vmmdevVideoModeSupported;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnGetHeightReduction = vmmdevGetHeightReduction;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnSetCredentialsJudgementResult = vmmdevSetCredentialsJudgementResult;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnSetVisibleRegion = vmmdevSetVisibleRegion;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryVisibleRegion = vmmdevQueryVisibleRegion;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnReportStatistics = vmmdevReportStatistics;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryStatisticsInterval = vmmdevQueryStatisticsInterval;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryBalloonSize = vmmdevQueryBalloonSize;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->HGCMConnector.pfnConnect = iface_hgcmConnect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->HGCMConnector.pfnDisconnect = iface_hgcmDisconnect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Get the IVMMDevPort interface of the above driver/device.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pUpPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIVMMDEVPORT);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pData->pUpPort, ("Configuration error: No VMMDev port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pHGCMPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIHGCMPORT);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pData->pHGCMPort, ("Configuration error: No HGCM port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Get the Console object pointer and update the mpDrv member.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = CFGMR3QueryPtr(pCfgHandle, "Object", &pv);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgFailed(("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pVMMDev = (VMMDev*)pv; /** @todo Check this cast! */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = pData->pVMMDev->hgcmLoadService (VBOXSHAREDFOLDERS_DLL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync "VBoxSharedFolders");
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pVMMDev->fSharedFolderActive = RT_SUCCESS(rc);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pLedPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMILEDPORTS);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pLedPort, ("Configuration error: No LED port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = pLedPort->pfnQueryStatusLed(pLedPort, 0, &pLed);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = HGCMHostCall("VBoxSharedFolders", SHFL_FN_SET_STATUS_LED, 1, &parm);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgFailed(("pfnQueryStatusLed failed with %Rrc (pLed=%x)\n", rc, pLed));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync LogRel(("Failed to load Shared Folders service %Rrc\n", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = PDMDrvHlpSSMRegisterEx(pDrvIns, HGCM_SSM_VERSION, 4096 /* bad guess */,
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync#endif /* VBOX_WITH_HGCM */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * VMMDevice driver registration record.
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* u32Version */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szName */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szRCMod */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szR0Mod */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* pszDescription */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync "Main VMMDev driver (Main as in the API).",
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* fFlags */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* fClass. */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* cMaxInstances */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* cbInstance */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnConstruct */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnDestruct */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnRelocate */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnIOCtl */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnPowerOn */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnReset */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnSuspend */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnResume */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnAttach */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnDetach */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnPowerOff */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnSoftReset */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* u32EndVersion */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */