Init.cpp revision ff9cdf7159a5f304cf849db728c7c5fbc7d325cf
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/* $Revision$ */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * VBoxGuestLibR0 - Library initialization.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Copyright (C) 2006-2007 Oracle Corporation
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * available from http://www.virtualbox.org. This file is free software;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * General Public License (GPL) as published by the Free Software
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * The contents of this file may alternatively be used under the terms
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * of the Common Development and Distribution License Version 1.0
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * CDDL are applicable instead of those of the GPL.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * You may elect to license modified versions of this file under the
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * terms and conditions of either the GPL or the CDDL or both.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/*******************************************************************************
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync* Header Files *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync*******************************************************************************/
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/*******************************************************************************
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync* Global Variables *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync*******************************************************************************/
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/** The global VBGL instance data. */
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * Used by vbglQueryDriverInfo and VbglInit to try get the host feature mask and
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * version information (g_vbgldata::hostVersion).
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * This was first implemented by the host in 3.1 and we quietly ignore failures
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * for that reason.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncstatic void vbglR0QueryHostVersion (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc = VbglGRAlloc ((VMMDevRequestHeader **) &pReq, sizeof (*pReq), VMMDevReq_GetHostVersion);
60958a376981c0531d09bd841015ea0c75f9a348vboxsync pReq->major, pReq->minor, pReq->build, pReq->revision, pReq->features));
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * The guest library uses lazy initialization for VMMDev port and memory,
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * because these values are provided by the VBoxGuest driver and it might
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * be loaded later than other drivers.
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * The VbglEnter checks the current library status, tries to retrieve these
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * values and fails if they are unavailable.
60958a376981c0531d09bd841015ea0c75f9a348vboxsyncstatic void vbglQueryDriverInfo (void)
60958a376981c0531d09bd841015ea0c75f9a348vboxsync rc = RTSemMutexRequest(g_vbgldata.mutexDriverInit, RT_INDEFINITE_WAIT);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Try query the port info.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf (("port = 0x%04X, mem = %p\n", port.portAddress, port.pVMMDevMemory));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#endif /* !VBGL_VBOXGUEST */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Checks if VBGL has been initialized.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * The client library, this will lazily complete the initialization.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * @return VINF_SUCCESS or VERR_VBGL_NOT_INITIALIZED.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = g_vbgldata.status == VbglStatusReady? VINF_SUCCESS: VERR_VBGL_NOT_INITIALIZED;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync // dprintf(("VbglEnter: rc = %d\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* other subsystems, none yet */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync LogRel(("vbglInitCommon: VbglPhysHeapInit failed. rc=%Rrc\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(int) VbglInit (VBGLIOPORT portVMMDev, VMMDevMemory *pVMMDevMemory)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# ifdef RT_OS_WINDOWS /** @todo r=bird: this doesn't make sense. Is there something special going on on windows? */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf(("vbglInit: starts g_vbgldata.status %d\n", g_vbgldata.status));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Initialization is already in process. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#else /* !VBGL_VBOXGUEST */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Initialization is already in process. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = RTSemMutexCreate(&g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Try to obtain VMMDev port via IOCTL to VBoxGuest main driver. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# endif /* VBOX_WITH_HGCM */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* driver open could fail, which does not prevent VbglInit from succeeding,
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * close the driver only if it is opened */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* note: do vbglTerminateCommon as a last step since it zeroez up the g_vbgldata
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * conceptually, doing vbglTerminateCommon last is correct
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * since this is the reverse order to how init is done */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#endif /* !VBGL_VBOXGUEST */