VBoxGuest-haiku.c revision 9fc464631dc4a68fbb5eb6419d61fbe91b6b16bd
/* $Id$ */
/** @file
* VBoxGuest kernel module, Haiku Guest Additions, implementation.
*/
/*
* Copyright (C) 2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/*
* This code is based on:
*
* VirtualBox Guest Additions for Haiku.
* Copyright (c) 2011 Mike Smith <mike@scgtrp.net>
* Fran�ois Revol <revol@free.fr>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#define IN_VBOXGUEST
#define LOG_GROUP LOG_GROUP_SUP_DRV
//#undef LOG_DISABLED
//#define LOG_ENABLED
//#define LOG_ENABLE_FLOW
//#define DO_LOG
#include <OS.h>
#include <Drivers.h>
#include <KernelExport.h>
#include <PCI.h>
#include "VBoxGuest-haiku.h"
#include "VBoxGuestInternal.h"
#include <iprt/initterm.h>
#define MODULE_NAME VBOXGUEST_MODULE_NAME
/*
* IRQ related functions.
*/
static void VBoxGuestHaikuRemoveIRQ(void *pvState);
static int VBoxGuestHaikuAddIRQ(void *pvState);
/*
* Available functions for kernel drivers.
*/
DECLVBGL(int) VBoxGuestHaikuServiceCall(void *pvSession, unsigned uCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
DECLVBGL(int) VBoxGuestIDCCall(void *pvSession, unsigned iCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
/** List of cloned device. Managed by the kernel. */
//static struct clonedevs *g_pVBoxGuestHaikuClones;
/** The dev_clone event handler tag. */
//static eventhandler_tag g_VBoxGuestHaikuEHTag;
/** selinfo structure used for polling. */
//static struct selinfo g_SelInfo;
/** PCI Bus Manager Module */
static pci_module_info *gPCI;
static struct vboxguest_module_info g_VBoxGuest = {
{
0,
},
{0},
{0},
0,
};
#if 0
/**
* DEVFS event handler.
*/
static void VBoxGuestHaikuClone(void *pvArg, struct ucred *pCred, char *pszName, int cchName, struct cdev **ppDev)
{
int iUnit;
int rc;
/*
* One device node per user, si_drv1 points to the session.
*/
if (!ppDev)
return;
iUnit = -1;
return;
if (iUnit >= 256)
{
return;
}
if (rc)
{
0644,
"vboxguest%d", iUnit);
if (*ppDev)
{
Log(("VBoxGuestHaikuClone: Created *ppDev=%p iUnit=%d si_drv1=%p si_drv2=%p\n",
}
else
}
else
Log(("VBoxGuestHaikuClone: Existing *ppDev=%p iUnit=%d si_drv1=%p si_drv2=%p\n",
}
#endif
static status_t VBoxGuestHaikuDetach(void)
{
if (cUsers > 0)
return EBUSY;
/*
* Reverse what we did in VBoxGuestHaikuAttach.
*/
if (pState->iVMMDevMemAreaId)
#ifdef DO_LOG
// RTLogDestroy(RTLogSetDefaultInstance(NULL));
#endif
RTR0Term();
return B_OK;
}
/**
* Interrupt service routine.
*
* @returns Whether the interrupt was from VMMDev.
* @param pvState Opaque pointer to the device state.
*/
{
}
{
//dprintf(MODULE_NAME ": isr mouse\n");
/*
* Wake up poll waiters.
*/
//selwakeup(&g_SelInfo);
//XXX:notify_select_event();
if (sState.selectSync) {
//dprintf(MODULE_NAME ": isr mouse: notify\n");
} else
}
/**
* Sets IRQ for VMMDev.
*
* @returns Haiku error code.
* @param pvState Pointer to the state info structure.
*/
static int VBoxGuestHaikuAddIRQ(void *pvState)
{
{
return VERR_DEV_IO_ERROR;
}
return VINF_SUCCESS;
}
/**
* Removes IRQ for VMMDev.
*
* @param pvState Opaque pointer to the state info structure.
*/
static void VBoxGuestHaikuRemoveIRQ(void *pvState)
{
}
{
int rc = VINF_SUCCESS;
int iResId = 0;
static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
cUsers = 0;
/*
* Initialize IPRT R0 driver, which internally calls OS-specific r0 init.
*/
if (RT_FAILURE(rc))
{
/** @todo r=ramshankar: use dprintf here */
LogFunc(("RTR0Init failed.\n"));
return ENXIO;
}
if (RT_FAILURE(rc))
{
return ENXIO;
}
#ifdef DO_LOG
/*
* Create the release log.
* (We do that here instead of common code because we want to log
* early failures using the LogRel macro.)
*/
if (RT_SUCCESS(rc))
{
//RTLogGroupSettings(pRelLogger, g_szLogGrp);
//RTLogFlags(pRelLogger, g_szLogFlags);
//RTLogDestinations(pRelLogger, "/var/log/vboxguest.log");
}
#endif
/*
* Allocate I/O port resource.
*/
//XXX check flags for IO ?
if (pState->uIOPortBase)
{
/*
* Map the MMIO region.
*/
//XXX check flags for mem ?
{
/*
* Call the common device extension initializer.
*/
#if ARCH_BITS == 64
#else
#endif
if (RT_SUCCESS(rc))
{
/*
* Add IRQ of VMMDev.
*/
if (RT_SUCCESS(rc))
{
return 0;
}
else
}
else
}
else
}
else
RTR0Term();
return ENXIO;
}
{
return 0;
return ENXIO;
}
status_t init_module(void)
{
int ix = 0;
return ENOSYS;
if (VBoxGuestHaikuProbe(&info) == 0) {
// we found it
break;
}
}
return status;
}
void uninit_module(void)
{
}
switch(op) {
case B_MODULE_INIT:
return init_module();
case B_MODULE_UNINIT:
return B_OK;
default:
return B_ERROR;
}
}
(module_info*) &g_VBoxGuest,
};
/* Common code that depend on g_DevExt. */
#include "VBoxGuestIDC-unix.c.h"