Init.cpp revision ff9cdf7159a5f304cf849db728c7c5fbc7d325cf
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/* $Revision$ */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/** @file
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * VBoxGuestLibR0 - Library initialization.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/*
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Copyright (C) 2006-2007 Oracle Corporation
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync *
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 *
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 *
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
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/*******************************************************************************
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync* Header Files *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync*******************************************************************************/
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#define VBGL_DECL_DATA
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#include "VBGLInternal.h"
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
60958a376981c0531d09bd841015ea0c75f9a348vboxsync#include <iprt/string.h>
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#include <iprt/assert.h>
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#include <iprt/semaphore.h>
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/*******************************************************************************
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync* Global Variables *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync*******************************************************************************/
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/** The global VBGL instance data. */
60958a376981c0531d09bd841015ea0c75f9a348vboxsyncVBGLDATA g_vbgldata;
60958a376981c0531d09bd841015ea0c75f9a348vboxsync
60958a376981c0531d09bd841015ea0c75f9a348vboxsync/**
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * Used by vbglQueryDriverInfo and VbglInit to try get the host feature mask and
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * version information (g_vbgldata::hostVersion).
60958a376981c0531d09bd841015ea0c75f9a348vboxsync *
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * This was first implemented by the host in 3.1 and we quietly ignore failures
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * for that reason.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncstatic void vbglR0QueryHostVersion (void)
60958a376981c0531d09bd841015ea0c75f9a348vboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync VMMDevReqHostVersion *pReq;
60958a376981c0531d09bd841015ea0c75f9a348vboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc = VbglGRAlloc ((VMMDevRequestHeader **) &pReq, sizeof (*pReq), VMMDevReq_GetHostVersion);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS (rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
60958a376981c0531d09bd841015ea0c75f9a348vboxsync rc = VbglGRPerform (&pReq->header);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS (rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
60958a376981c0531d09bd841015ea0c75f9a348vboxsync g_vbgldata.hostVersion = *pReq;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync Log (("vbglR0QueryHostVersion: %u.%u.%ur%u %#x\n",
60958a376981c0531d09bd841015ea0c75f9a348vboxsync pReq->major, pReq->minor, pReq->build, pReq->revision, pReq->features));
60958a376981c0531d09bd841015ea0c75f9a348vboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
60958a376981c0531d09bd841015ea0c75f9a348vboxsync VbglGRFree (&pReq->header);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
60958a376981c0531d09bd841015ea0c75f9a348vboxsync}
60958a376981c0531d09bd841015ea0c75f9a348vboxsync
60958a376981c0531d09bd841015ea0c75f9a348vboxsync#ifndef VBGL_VBOXGUEST
60958a376981c0531d09bd841015ea0c75f9a348vboxsync/**
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.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync *
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * The VbglEnter checks the current library status, tries to retrieve these
60958a376981c0531d09bd841015ea0c75f9a348vboxsync * values and fails if they are unavailable.
60958a376981c0531d09bd841015ea0c75f9a348vboxsync *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync */
60958a376981c0531d09bd841015ea0c75f9a348vboxsyncstatic void vbglQueryDriverInfo (void)
60958a376981c0531d09bd841015ea0c75f9a348vboxsync{
60958a376981c0531d09bd841015ea0c75f9a348vboxsync int rc = VINF_SUCCESS;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
60958a376981c0531d09bd841015ea0c75f9a348vboxsync rc = RTSemMutexRequest(g_vbgldata.mutexDriverInit, RT_INDEFINITE_WAIT);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_FAILURE(rc))
60958a376981c0531d09bd841015ea0c75f9a348vboxsync return;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status == VbglStatusReady)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync RTSemMutexRelease(g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = vbglDriverOpen(&g_vbgldata.driver);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /*
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Try query the port info.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync VBoxGuestPortInfo port;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = vbglDriverIOCtl (&g_vbgldata.driver,
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync VBOXGUEST_IOCTL_GETVMMDEVPORT, &port,
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync sizeof (port));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS (rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf (("port = 0x%04X, mem = %p\n", port.portAddress, port.pVMMDevMemory));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.portVMMDev = port.portAddress;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.pVMMDevMemory = port.pVMMDevMemory;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusReady;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglR0QueryHostVersion();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync RTSemMutexRelease(g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf (("vbglQueryDriverInfo rc = %d\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#endif /* !VBGL_VBOXGUEST */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync/**
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * Checks if VBGL has been initialized.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * The client library, this will lazily complete the initialization.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync *
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * @return VINF_SUCCESS or VERR_VBGL_NOT_INITIALIZED.
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncint vbglR0Enter (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#ifndef VBGL_VBOXGUEST
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status == VbglStatusInitializing)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglQueryDriverInfo ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#endif
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = g_vbgldata.status == VbglStatusReady? VINF_SUCCESS: VERR_VBGL_NOT_INITIALIZED;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync // dprintf(("VbglEnter: rc = %d\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncint vbglInitCommon (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc = VINF_SUCCESS;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync RT_ZERO(g_vbgldata);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusInitializing;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = VbglPhysHeapInit ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* other subsystems, none yet */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync ;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync else
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync LogRel(("vbglInitCommon: VbglPhysHeapInit failed. rc=%Rrc\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusNotInitialized;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf(("vbglInitCommon: rc = %d\n", rc));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(void) vbglTerminateCommon (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync VbglPhysHeapTerminate ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusNotInitialized;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#ifdef VBGL_VBOXGUEST
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(int) VbglInit (VBGLIOPORT portVMMDev, VMMDevMemory *pVMMDevMemory)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc = VINF_SUCCESS;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
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
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status == VbglStatusInitializing
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync || g_vbgldata.status == VbglStatusReady)
60958a376981c0531d09bd841015ea0c75f9a348vboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Initialization is already in process. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# else
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync dprintf(("vbglInit: starts\n"));
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# endif
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = vbglInitCommon ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync if (RT_SUCCESS(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.portVMMDev = portVMMDev;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.pVMMDevMemory = pVMMDevMemory;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusReady;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync vbglR0QueryHostVersion();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync else
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.status = VbglStatusNotInitialized;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(void) VbglTerminate (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglTerminateCommon ();
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#else /* !VBGL_VBOXGUEST */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(int) VbglInit (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync int rc = VINF_SUCCESS;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status == VbglStatusInitializing
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync || g_vbgldata.status == VbglStatusReady)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Initialization is already in process. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = vbglInitCommon ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = RTSemMutexCreate(&g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_SUCCESS(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* Try to obtain VMMDev port via IOCTL to VBoxGuest main driver. */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglQueryDriverInfo ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# ifdef VBOX_WITH_HGCM
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync rc = vbglR0HGCMInit ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# endif /* VBOX_WITH_HGCM */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_FAILURE(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync RTSemMutexDestroy(g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.mutexDriverInit = NIL_RTSEMMUTEX;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (RT_FAILURE(rc))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglTerminateCommon ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
60958a376981c0531d09bd841015ea0c75f9a348vboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
60958a376981c0531d09bd841015ea0c75f9a348vboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return rc;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(bool) VbglIsReady(void)
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return(g_vbgldata.status == VbglStatusReady);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncDECLVBGL(void) VbglTerminate (void)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# ifdef VBOX_WITH_HGCM
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync vbglR0HGCMTerminate ();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync# endif
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync /* driver open could fail, which does not prevent VbglInit from succeeding,
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync * close the driver only if it is opened */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (vbglDriverIsOpened(&g_vbgldata.driver))
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglDriverClose(&g_vbgldata.driver);
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync RTSemMutexDestroy(g_vbgldata.mutexDriverInit);
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync g_vbgldata.mutexDriverInit = NIL_RTSEMMUTEX;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
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 vbglTerminateCommon ();
c9e08fdf5fa9ba16094b8e37f257f4267044ad6fvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsyncint vbglGetDriver(VBGLDRIVER **ppDriver)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync{
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status != VbglStatusReady)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync {
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync vbglQueryDriverInfo();
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync if (g_vbgldata.status != VbglStatusReady)
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return VERR_TRY_AGAIN;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync }
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync *ppDriver = &g_vbgldata.driver;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync return VINF_SUCCESS;
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync}
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync#endif /* !VBGL_VBOXGUEST */
d9dcb7404c5146ec833ff95fd450ba177237db0bvboxsync