SUPDrv-freebsd.c revision bb73206f5ad484c56a70984ee9897e9ffee18b8b
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VBoxDrv - FreeBSD specifics.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Permission is hereby granted, free of charge, to any person
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * obtaining a copy of this software and associated documentation
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * files (the "Software"), to deal in the Software without
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * restriction, including without limitation the rights to use,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * copies of the Software, and to permit persons to whom the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Software is furnished to do so, subject to the following
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * conditions:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The above copyright notice and this permission notice shall be
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * included in all copies or substantial portions of the Software.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * OTHER DEALINGS IN THE SOFTWARE.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Header Files *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/* Deal with conflicts first. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Internal Functions *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDModuleEvent(struct module *pMod, int enmEventType, void *pvArg);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDLoad(void);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDUnload(void);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Global Variables *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Module info structure used by the kernel.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Declare the module as a pseudo device. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncDECLARE_MODULE(vboxdrv, g_VBoxDrvFreeBSDModule, SI_SUB_PSEUDO, SI_ORDER_ANY);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The /dev/vboxdrv character device entry points.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** The make_dev result. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** The device extention. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Spinlock protecting g_apSessionHashTab. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Hash table */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Calculates the index into g_apSessionHashTab.*/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define SESSION_HASH(sfn) ((sfn) % RT_ELEMENTS(g_apSessionHashTab))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Module event handler.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod The module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param enmEventType The event type (modeventtype_t).
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pvArg Module argument. NULL.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @return 0 on success, errno.h status code on failure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDModuleEvent(struct module *pMod, int enmEventType, void *pvArg)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDLoad(void)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the runtime.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the device extension.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo rc = supdrvInitDevExt(&g_DevExt);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the session hash table.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo rc = RTSpinlockCreate(&g_Spinlock);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Create our device node.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** @todo find a way to fix this 0666 permission issue. Perhaps by defining some vboxusers group with a fixed gid? */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync g_pVBoxDrvFreeBSDChrDev = make_dev(&g_VBoxDrvFreeBSDChrDevSW,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "vboxdrv");
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDLoad: returns successfully\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: RTSpinlockCreate failed, rc=%d\n", rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo supdrvDeleteDevExt(&g_DevExt);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: supdrvInitDevExt failed, rc=%d\n", rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo RTR0Term();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDUnload(void)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** @todo verify that FreeBSD does reference counting. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Reserve what we did in VBoxDrvFreeBSDInit.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo rc = RTSpinlockDestroy(g_Spinlock);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo RTR0Term();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDOpen(struct cdev *dev, int oflags, struct thread *td, int fdidx)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDClose(struct cdev *dev, int fflag, int devtype, struct thread *td)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDIOCtl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Converts an supdrv error code to a FreeBSD error code.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @returns corresponding FreeBSD error code.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param rc supdrv error code (SUPDRV_ERR_* defines).
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case 0: return 0;