9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* $Id$ */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @file
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VBoxGuest kernel module, Haiku Guest Additions, implementation.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * Copyright (C) 2012-2015 Oracle Corporation
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * available from http://www.virtualbox.org. This file is free software;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * General Public License (GPL) as published by the Free Software
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This code is based on:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox Guest Additions for Haiku.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (c) 2011 Mike Smith <mike@scgtrp.net>
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * François Revol <revol@free.fr>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Permission is hereby granted, free of charge, to any person
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * obtaining a copy of this software and associated documentation
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * files (the "Software"), to deal in the Software without
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * restriction, including without limitation the rights to use,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * copies of the Software, and to permit persons to whom the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Software is furnished to do so, subject to the following
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * conditions:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The above copyright notice and this permission notice shall be
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * included in all copies or substantial portions of the Software.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * OTHER DEALINGS IN THE SOFTWARE.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync/*******************************************************************************
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync* Header Files *
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync*******************************************************************************/
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define IN_VBOXGUEST
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <sys/param.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <sys/types.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <sys/uio.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <OS.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <Drivers.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <KernelExport.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <PCI.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "VBoxGuest-haiku.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "VBoxGuestInternal.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/log.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/assert.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/initterm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/process.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/mem.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/memobj.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/asm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/timer.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/heap.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define MODULE_NAME VBOXGUEST_MODULE_NAME
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * IRQ related functions.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic void VBoxGuestHaikuRemoveIRQ(void *pvState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int VBoxGuestHaikuAddIRQ(void *pvState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int32 VBoxGuestHaikuISR(void *pvState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Available functions for kernel drivers.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(int) VBoxGuestHaikuServiceCall(void *pvSession, unsigned uCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(void *) VBoxGuestHaikuServiceOpen(uint32_t *pu32Version);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(int) VBoxGuestHaikuServiceClose(void *pvSession);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(void *) VBoxGuestIDCOpen(uint32_t *pu32Version);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(int) VBoxGuestIDCClose(void *pvSession);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLVBGL(int) VBoxGuestIDCCall(void *pvSession, unsigned iCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t std_ops(int32 op, ...);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic RTSPINLOCK g_Spinlock = NIL_RTSPINLOCK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncint32 api_version = B_CUR_DRIVER_API_VERSION;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** List of cloned device. Managed by the kernel. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync//static struct clonedevs *g_pVBoxGuestHaikuClones;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** The dev_clone event handler tag. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync//static eventhandler_tag g_VBoxGuestHaikuEHTag;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** selinfo structure used for polling. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync//static struct selinfo g_SelInfo;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** PCI Bus Manager Module */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic pci_module_info *gPCI;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsyncstatic struct vboxguest_module_info g_VBoxGuest =
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync MODULE_NAME,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync 0,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync std_ops
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync },
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync { 0 },
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync { 0 },
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync 0,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogBackdoorPrintf,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogBackdoorPrintfV,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogSetDefaultInstanceThread,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemAllocExTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemContAlloc,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemContFree,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemFreeEx,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpIsCpuPossible,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpNotificationDeregister,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpNotificationRegister,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpOnAll,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpOnOthers,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMpOnSpecific,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPowerNotificationDeregister,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPowerNotificationRegister,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPowerSignalEvent,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0AssertPanicSystem,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0Init,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAddress,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAddressR3,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocContTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocLowTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocPageTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocPhysExTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocPhysNCTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjAllocPhysTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjEnterPhysTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjFree,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjGetPagePhysAddr,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjIsMapping,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjLockKernelTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjLockUserTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjMapKernelExTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjMapKernelTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjMapUserTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjProtect,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjReserveKernelTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjReserveUserTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0MemObjSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0ProcHandleSelf,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0Term,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0TermForced,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTProcSelf,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventGetResolution,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventMultiGetResolution,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventMultiWaitEx,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventMultiWaitExDebug,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventWaitEx,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemEventWaitExDebug,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadIsInInterrupt,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptDisable,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptIsEnabled,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptIsPending,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptIsPendingTrusty,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptIsPossible,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTThreadPreemptRestore,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTTimerGetSystemGranularity,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTTimerReleaseSystemGranularity,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTTimerRequestSystemGranularity,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSpinlockAcquire,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSpinlockRelease,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemTmpAllocTag,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTMemTmpFree,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogDefaultInstance,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogRelDefaultInstance,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTErrConvertToErrno,
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VbgdCommonIoCtl,
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VbgdCommonCreateUserSession,
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VbgdCommonCloseSession,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VBoxGuestIDCOpen,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VBoxGuestIDCClose,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VBoxGuestIDCCall,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTAssertMsg1Weak,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTAssertMsg2Weak,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTAssertMsg2WeakV,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTAssertShouldPanic,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemFastMutexCreate,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemFastMutexDestroy,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemFastMutexRelease,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemFastMutexRequest,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemMutexCreate,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemMutexDestroy,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemMutexRelease,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSemMutexRequest,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapSimpleRelocate,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapOffsetInit,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapSimpleInit,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapOffsetAlloc,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapSimpleAlloc,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapOffsetFree,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHeapSimpleFree
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync};
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if 0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * DEVFS event handler.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic void VBoxGuestHaikuClone(void *pvArg, struct ucred *pCred, char *pszName, int cchName, struct cdev **ppDev)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int iUnit;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: pszName=%s ppDev=%p\n", pszName, ppDev));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * One device node per user, si_drv1 points to the session.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * /dev/vboxguest<N> where N = {0...255}.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!ppDev)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (strcmp(pszName, "vboxguest") == 0)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync iUnit = -1;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else if (dev_stdclone(pszName, NULL, "vboxguest", &iUnit) != 1)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (iUnit >= 256)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: iUnit=%d >= 256 - rejected\n", iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: pszName=%s iUnit=%d\n", pszName, iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = clone_create(&g_pVBoxGuestHaikuClones, &g_VBoxGuestHaikuDeviceHooks, &iUnit, ppDev, 0);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: clone_create -> %d; iUnit=%d\n", rc, iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (rc)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *ppDev = make_dev(&g_VBoxGuestHaikuDeviceHooks,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync iUnit,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync UID_ROOT,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync GID_WHEEL,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync 0644,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync "vboxguest%d", iUnit);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (*ppDev)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync dev_ref(*ppDev);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync (*ppDev)->si_flags |= SI_CHEAPCLONE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: Created *ppDev=%p iUnit=%d si_drv1=%p si_drv2=%p\n",
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync *ppDev, iUnit, (*ppDev)->si_drv1, (*ppDev)->si_drv2));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync (*ppDev)->si_drv1 = (*ppDev)->si_drv2 = NULL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync Log(("VBoxGuestHaikuClone: make_dev iUnit=%d failed\n", iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync Log(("VBoxGuestHaikuClone: Existing *ppDev=%p iUnit=%d si_drv1=%p si_drv2=%p\n",
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync *ppDev, iUnit, (*ppDev)->si_drv1, (*ppDev)->si_drv2));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t VBoxGuestHaikuDetach(void)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = &sState;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (cUsers > 0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return EBUSY;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Reverse what we did in VBoxGuestHaikuAttach.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VBoxGuestHaikuRemoveIRQ(pState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pState->iVMMDevMemAreaId)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync delete_area(pState->iVMMDevMemAreaId);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VbgdCommonDeleteDevExt(&g_DevExt);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef DO_LOG
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogSetDefaultInstance(NULL);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// RTLogDestroy(RTLogSetDefaultInstance(NULL));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSpinlockDestroy(g_Spinlock);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync g_Spinlock = NIL_RTSPINLOCK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0Term();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return B_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Interrupt service routine.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns Whether the interrupt was from VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Opaque pointer to the device state.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int32 VBoxGuestHaikuISR(void *pvState)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlow((MODULE_NAME ":VBoxGuestHaikuISR pvState=%p\n", pvState));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync bool fOurIRQ = VbgdCommonISR(&g_DevExt);
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync if (fOurIRQ)
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return B_HANDLED_INTERRUPT;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return B_UNHANDLED_INTERRUPT;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsyncvoid VbgdNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlow((MODULE_NAME "::NativeISRMousePollEvent:\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync status_t err = B_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //dprintf(MODULE_NAME ": isr mouse\n");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Wake up poll waiters.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //selwakeup(&g_SelInfo);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //XXX:notify_select_event();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSpinlockAcquire(g_Spinlock);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync if (sState.selectSync)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //dprintf(MODULE_NAME ": isr mouse: notify\n");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync notify_select_event(sState.selectSync, sState.selectEvent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync sState.selectEvent = (uint8_t)0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync sState.selectRef = (uint32_t)0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync sState.selectSync = NULL;
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync }
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync err = B_ERROR;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSpinlockRelease(g_Spinlock);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets IRQ for VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns Haiku error code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Pointer to the state info structure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int VBoxGuestHaikuAddIRQ(void *pvState)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync status_t err;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = (struct VBoxGuestDeviceState *)pvState;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync AssertReturn(pState, VERR_INVALID_PARAMETER);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync err = install_io_interrupt_handler(pState->iIrqResId, VBoxGuestHaikuISR, pState, 0);
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync if (err == B_OK)
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return VINF_SUCCESS;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return VERR_DEV_IO_ERROR;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Removes IRQ for VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Opaque pointer to the state info structure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic void VBoxGuestHaikuRemoveIRQ(void *pvState)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = (struct VBoxGuestDeviceState *)pvState;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync AssertPtr(pState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync remove_io_interrupt_handler(pState->iIrqResId, VBoxGuestHaikuISR, pState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t VBoxGuestHaikuAttach(const pci_info *pDevice)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync status_t status;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rc = VINF_SUCCESS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int iResId = 0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = &sState;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync static const char *const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync PRTLOGGER pRelLogger;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync AssertReturn(pDevice, B_BAD_VALUE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync cUsers = 0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Initialize IPRT R0 driver, which internally calls OS-specific r0 init.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = RTR0Init(0);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_FAILURE(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync /** @todo r=ramshankar: use dprintf here. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFunc(("RTR0Init failed.\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return ENXIO;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = RTSpinlockCreate(&g_Spinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "VBoxGuestHaiku");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_FAILURE(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync LogRel(("VBoxGuestHaikuAttach: RTSpinlock create failed. rc=%Rrc\n", rc));
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return ENXIO;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef DO_LOG
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Create the release log.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * (We do that here instead of common code because we want to log
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * early failures using the LogRel macro.)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync rc = RTLogCreate(&pRelLogger, 0 | RTLOGFLAGS_PREFIX_THREAD /* fFlags */, "all",
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLOGDEST_STDOUT | RTLOGDEST_DEBUGGER | RTLOGDEST_USER, NULL);
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync dprintf(MODULE_NAME ": RTLogCreate: %d\n", rc);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogGroupSettings(pRelLogger, g_szLogGrp);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogFlags(pRelLogger, g_szLogFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogDestinations(pRelLogger, "/var/log/vboxguest.log");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTLogRelSetDefaultInstance(pRelLogger);
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync RTLogSetDefaultInstance(pRelLogger); //XXX
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Allocate I/O port resource.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pState->uIOPortBase = pDevice->u.h0.base_registers[0];
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync /* @todo check flags for IO? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pState->uIOPortBase)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Map the MMIO region.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32 phys = pDevice->u.h0.base_registers[1];
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync /* @todo Check flags for mem? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pState->VMMDevMemSize = pDevice->u.h0.base_register_sizes[1];
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync pState->iVMMDevMemAreaId = map_physical_memory("VirtualBox Guest MMIO", phys, pState->VMMDevMemSize,
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync B_ANY_KERNEL_BLOCK_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync &pState->pMMIOBase);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pState->iVMMDevMemAreaId > 0 && pState->pMMIOBase)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Call the common device extension initializer.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync rc = VbgdCommonInitDevExt(&g_DevExt, pState->uIOPortBase, pState->pMMIOBase, pState->VMMDevMemSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if ARCH_BITS == 64
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VBOXOSTYPE_Haiku_x64,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#else
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VBOXOSTYPE_Haiku,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VMMDEV_EVENT_MOUSE_POSITION_CHANGED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Add IRQ of VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pState->iIrqResId = pDevice->u.h0.interrupt_line;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = VBoxGuestHaikuAddIRQ(pState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS(rc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ": loaded successfully\n"));
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return B_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync LogRel((MODULE_NAME ":VbgdCommonInitDevExt failed.\n"));
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync VbgdCommonDeleteDevExt(&g_DevExt);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ":VBoxGuestHaikuAddIRQ failed.\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ":MMIO region setup failed.\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ":IOport setup failed.\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0Term();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return ENXIO;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t VBoxGuestHaikuProbe(pci_info *pDevice)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((pDevice->vendor_id == VMMDEV_VENDORID) && (pDevice->device_id == VMMDEV_DEVICEID))
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync return B_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return ENXIO;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatus_t init_module(void)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync status_t err = B_ENTRY_NOT_FOUND;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pci_info info;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int ix = 0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync err = get_module(B_PCI_MODULE_NAME, (module_info **)&gPCI);
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync if (err != B_OK)
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync return err;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync while ((*gPCI->get_nth_pci_info)(ix++, &info) == B_OK)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync {
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync if (VBoxGuestHaikuProbe(&info) == 0)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync {
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync /* We found it */
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync err = VBoxGuestHaikuAttach(&info);
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync return err;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync return B_ENTRY_NOT_FOUND;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncvoid uninit_module(void)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VBoxGuestHaikuDetach();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync put_module(B_PCI_MODULE_NAME);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsyncstatic status_t std_ops(int32 op, ...)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync{
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync switch (op)
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync {
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync case B_MODULE_INIT:
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return init_module();
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync case B_MODULE_UNINIT:
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync {
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync uninit_module();
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return B_OK;
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync }
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync default:
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync return B_ERROR;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync_EXPORT module_info *modules[] =
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync{
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync (module_info *)&g_VBoxGuest,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync NULL
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync};
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* Common code that depend on g_DevExt. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "VBoxGuestIDC-unix.c.h"
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync