9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VBoxGuest kernel module, Haiku Guest Additions, implementation.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * Copyright (C) 2012-2015 Oracle Corporation
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 * This code is based on:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox Guest Additions for Haiku.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (c) 2011 Mike Smith <mike@scgtrp.net>
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * François Revol <revol@free.fr>
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 * The above copyright notice and this permission notice shall be
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * included in all copies or substantial portions of the Software.
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.
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync/*******************************************************************************
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync* Header Files *
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync*******************************************************************************/
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * IRQ related functions.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Available functions for kernel drivers.
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) VBoxGuestIDCCall(void *pvSession, unsigned iCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
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 */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * DEVFS event handler.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic void VBoxGuestHaikuClone(void *pvArg, struct ucred *pCred, char *pszName, int cchName, struct cdev **ppDev)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: pszName=%s ppDev=%p\n", pszName, ppDev));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * One device node per user, si_drv1 points to the session.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * /dev/vboxguest<N> where N = {0...255}.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else if (dev_stdclone(pszName, NULL, "vboxguest", &iUnit) != 1)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: iUnit=%d >= 256 - rejected\n", iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: pszName=%s iUnit=%d\n", pszName, iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = clone_create(&g_pVBoxGuestHaikuClones, &g_VBoxGuestHaikuDeviceHooks, &iUnit, ppDev, 0);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: clone_create -> %d; iUnit=%d\n", rc, iUnit));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log(("VBoxGuestHaikuClone: Created *ppDev=%p iUnit=%d si_drv1=%p si_drv2=%p\n",
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync *ppDev, iUnit, (*ppDev)->si_drv1, (*ppDev)->si_drv2));
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync Log(("VBoxGuestHaikuClone: make_dev iUnit=%d failed\n", iUnit));
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 * Reverse what we did in VBoxGuestHaikuAttach.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// RTLogDestroy(RTLogSetDefaultInstance(NULL));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Interrupt service routine.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns Whether the interrupt was from VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Opaque pointer to the device state.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlow((MODULE_NAME ":VBoxGuestHaikuISR pvState=%p\n", pvState));
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsyncvoid VbgdNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlow((MODULE_NAME "::NativeISRMousePollEvent:\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //dprintf(MODULE_NAME ": isr mouse\n");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Wake up poll waiters.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //selwakeup(&g_SelInfo);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //XXX:notify_select_event();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //dprintf(MODULE_NAME ": isr mouse: notify\n");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync notify_select_event(sState.selectSync, sState.selectEvent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets IRQ for VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns Haiku error code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Pointer to the state info structure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = (struct VBoxGuestDeviceState *)pvState;
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync err = install_io_interrupt_handler(pState->iIrqResId, VBoxGuestHaikuISR, pState, 0);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Removes IRQ for VMMDev.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param pvState Opaque pointer to the state info structure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct VBoxGuestDeviceState *pState = (struct VBoxGuestDeviceState *)pvState;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync remove_io_interrupt_handler(pState->iIrqResId, VBoxGuestHaikuISR, pState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t VBoxGuestHaikuAttach(const pci_info *pDevice)
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync static const char *const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Initialize IPRT R0 driver, which internally calls OS-specific r0 init.
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync /** @todo r=ramshankar: use dprintf here. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rc = RTSpinlockCreate(&g_Spinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "VBoxGuestHaiku");
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync LogRel(("VBoxGuestHaikuAttach: RTSpinlock create failed. rc=%Rrc\n", rc));
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.)
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);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogGroupSettings(pRelLogger, g_szLogGrp);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogFlags(pRelLogger, g_szLogFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync //RTLogDestinations(pRelLogger, "/var/log/vboxguest.log");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Allocate I/O port resource.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync pState->uIOPortBase = pDevice->u.h0.base_registers[0];
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync /* @todo check flags for IO? */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Map the MMIO region.
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,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pState->iVMMDevMemAreaId > 0 && pState->pMMIOBase)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Call the common device extension initializer.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync rc = VbgdCommonInitDevExt(&g_DevExt, pState->uIOPortBase, pState->pMMIOBase, pState->VMMDevMemSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Add IRQ of VMMDev.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync LogRel((MODULE_NAME ":VbgdCommonInitDevExt failed.\n"));
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ":VBoxGuestHaikuAddIRQ failed.\n"));
17aaba745fa31b3b0430507b69d231794f7d5ce6vboxsync LogRel((MODULE_NAME ":MMIO region setup failed.\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic status_t VBoxGuestHaikuProbe(pci_info *pDevice)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if ((pDevice->vendor_id == VMMDEV_VENDORID) && (pDevice->device_id == VMMDEV_DEVICEID))
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync err = get_module(B_PCI_MODULE_NAME, (module_info **)&gPCI);
2b3dc93fedb4e72ac5b3cbaa89a9fc2f559be550vboxsync while ((*gPCI->get_nth_pci_info)(ix++, &info) == B_OK)
0aec321b31e7c6329c5b4f0c2274f63773eb8824vboxsync /* We found it */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* Common code that depend on g_DevExt. */