SUPDrv-freebsd.c revision 4b30f6c72b07654509606857da385afcc09aaae3
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/* $Id$ */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @file
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VBoxDrv - FreeBSD specifics.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
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 *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The above copyright notice and this permission notice shall be
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * included in all copies or substantial portions of the Software.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
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
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Header Files *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/* Deal with conflicts first. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/param.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#undef PVM
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/types.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/module.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/systm.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/errno.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/kernel.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/conf.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <sys/uio.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include "SUPDRV.h"
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <VBox/version.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/initterm.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/string.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/spinlock.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/process.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/assert.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/log.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Internal Functions *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDModuleEvent(struct module *pMod, int enmEventType, void *pvArg);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDLoad(void);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDUnload(void);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic d_fdopen_t VBoxDrvFreeBSDOpen;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic d_close_t VBoxDrvFreeBSDClose;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic d_ioctl_t VBoxDrvFreeBSDIOCtl;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBsdErr2Native(int rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Global Variables *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Module info structure used by the kernel.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic moduledata_t g_VBoxDrvFreeBSDModule =
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "vboxdrv",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync VBoxDrvFreeBSDModuleEvent,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync};
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Declare the module as a pseudo device. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncDECLARE_MODULE(vboxdrv, g_VBoxDrvFreeBSDModule, SI_SUB_PSEUDO, SI_ORDER_ANY);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The /dev/vboxdrv character device entry points.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic struct cdevsw g_VBoxDrvFreeBSDChrDevSW =
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_version = D_VERSION,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_flags = D_TRACKCLOSE,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_fdopen = VBoxDrvFreeBSDOpen,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_close = VBoxDrvFreeBSDClose,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_ioctl = VBoxDrvFreeBSDIOCtl,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync .d_name = "vboxdrv"
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync};
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** The make_dev result. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic struct cdev *g_pVBoxDrvFreeBSDChrDev;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** The device extention. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic SUPDRVDEVEXT g_DevExt;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Spinlock protecting g_apSessionHashTab. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic RTSPINLOCK g_Spinlock = NIL_RTSPINLOCK;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Hash table */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic PSUPDRVSESSION g_apSessionHashTab[19];
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Calculates the index into g_apSessionHashTab.*/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define SESSION_HASH(sfn) ((sfn) % RT_ELEMENTS(g_apSessionHashTab))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Module event handler.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod The module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param enmEventType The event type (modeventtype_t).
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pvArg Module argument. NULL.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @return 0 on success, errno.h status code on failure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDModuleEvent(struct module *pMod, int enmEventType, void *pvArg)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync switch (enmEventType)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case MOD_LOAD:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = VBoxDrvFreeBSDLoad();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync break;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case MOD_UNLOAD:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = VBoxDrvFreeBSDUnload();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync break;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case MOD_SHUTDOWN:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case MOD_QUIESCE:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync default:
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return EOPNOTSUPP;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return 0;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VBoxDrvFreeBsdErr2Native(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDLoad(void)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDLoad:\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the runtime.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
4b30f6c72b07654509606857da385afcc09aaae3vboxsync int rc = RTR0Init(0);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the device extension.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo rc = supdrvInitDevExt(&g_DevExt);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Initialize the session hash table.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
4b30f6c72b07654509606857da385afcc09aaae3vboxsync rc = RTSpinlockCreate(&g_Spinlock);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Create our device node.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
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 0,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync UID_ROOT,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync GID_WHEEL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync 0666,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "vboxdrv");
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (g_pVBoxDrvFreeBSDChrDev)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDLoad: returns successfully\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: make_dev failed\n");
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = SUPDRV_ERR_ALREADY_LOADED;
4b30f6c72b07654509606857da385afcc09aaae3vboxsync RTSpinlockDestroy(g_Spinlock);
4b30f6c72b07654509606857da385afcc09aaae3vboxsync g_Spinlock = NIL_RTSPINLOCK;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: RTSpinlockCreate failed, rc=%d\n", rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /// @todo supdrvDeleteDevExt(&g_DevExt);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: supdrvInitDevExt failed, rc=%d\n", rc);
4b30f6c72b07654509606857da385afcc09aaae3vboxsync RTR0Term();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync printf("vboxdrv: RTR0Init failed, rc=%d\n", rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDUnload(void)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDUnload:\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** @todo verify that FreeBSD does reference counting. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Reserve what we did in VBoxDrvFreeBSDInit.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (g_pVBoxDrvFreeBSDChrDev)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync destroy_dev(g_pVBoxDrvFreeBSDChrDev);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync g_pVBoxDrvFreeBSDChrDev = NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = 0; /// @todo supdrvDeleteDevExt(&g_DevExt);
4b30f6c72b07654509606857da385afcc09aaae3vboxsync AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
4b30f6c72b07654509606857da385afcc09aaae3vboxsync rc = RTSpinlockDestroy(g_Spinlock);
4b30f6c72b07654509606857da385afcc09aaae3vboxsync AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync g_Spinlock = NIL_RTSPINLOCK;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
4b30f6c72b07654509606857da385afcc09aaae3vboxsync RTR0Term();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync memset(&g_DevExt, 0, sizeof(g_DevExt));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDUnload: returns\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDOpen(struct cdev *dev, int oflags, struct thread *td, int fdidx)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDOpen:\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return EOPNOTSUPP;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDClose(struct cdev *dev, int fflag, int devtype, struct thread *td)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDClose:\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return EBADF;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBSDIOCtl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync dprintf(("VBoxDrvFreeBSDIOCtl:\n"));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return EINVAL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Converts an supdrv error code to a FreeBSD error code.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @returns corresponding FreeBSD error code.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param rc supdrv error code (SUPDRV_ERR_* defines).
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int VBoxDrvFreeBsdErr2Native(int rc)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync switch (rc)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case 0: return 0;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_GENERAL_FAILURE: return EACCES;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_INVALID_PARAM: return EINVAL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_INVALID_MAGIC: return EILSEQ;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_INVALID_HANDLE: return ENXIO;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_INVALID_POINTER: return EFAULT;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_LOCK_FAILED: return ENOLCK;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_ALREADY_LOADED: return EEXIST;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_PERMISSION_DENIED: return EPERM;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync case SUPDRV_ERR_VERSION_MISMATCH: return ENOSYS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return EPERM;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync