edc0ced209cf455268870a686b88fd851f3a4188vboxsync * VBoxGuest kernel driver, Haiku Guest Additions, implementation.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * Copyright (C) 2012-2015 Oracle Corporation
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * available from http://www.virtualbox.org. This file is free software;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * you can redistribute it and/or modify it under the terms of the GNU
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * General Public License (GPL) as published by the Free Software
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * This code is based on:
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * VirtualBox Guest Additions for Haiku.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Copyright (c) 2011 Mike Smith <mike@scgtrp.net>
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Fran�ois Revol <revol@free.fr>
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Permission is hereby granted, free of charge, to any person
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * obtaining a copy of this software and associated documentation
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * files (the "Software"), to deal in the Software without
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * restriction, including without limitation the rights to use,
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * copies of the Software, and to permit persons to whom the
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Software is furnished to do so, subject to the following
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * conditions:
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * The above copyright notice and this permission notice shall be
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * included in all copies or substantial portions of the Software.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * OTHER DEALINGS IN THE SOFTWARE.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync/*******************************************************************************
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync* Header Files *
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync*******************************************************************************/
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync/*******************************************************************************
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync* Internal Functions *
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync*******************************************************************************/
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuOpen(const char *name, uint32 flags, void **cookie);
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuIOCtl(void *cookie, uint32 op, void *data, size_t len);
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuSelect(void *cookie, uint8 event, uint32 ref, selectsync *sync);
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuDeselect(void *cookie, uint8 event, selectsync *sync);
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuWrite(void *cookie, off_t position, const void *data, size_t *numBytes);
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuRead(void *cookie, off_t position, void *data, size_t *numBytes);
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver open hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param name The name of the device as returned by publish_devices.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param flags Open flags.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie Where to store the session pointer.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuOpen(const char *name, uint32 flags, void **cookie)
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Create a new session.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync rc = VbgdCommonCreateUserSession(&g_DevExt, &pSession);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log((DRIVER_NAME ":VBoxGuestHaikuOpen success: g_DevExt=%p pSession=%p rc=%d pid=%d\n",&g_DevExt, pSession, rc,(int)RTProcSelf()));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync LogRel((DRIVER_NAME ":VBoxGuestHaikuOpen: failed. rc=%d\n", rc));
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver close hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log(("VBoxGuestHaikuClose: pSession=%p\n", pSession));
cadd9de82d5169aad827fe8d68e41a78ebbc6410vboxsync /** @todo r=ramshankar: should we really be using the session spinlock here? */
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync /* @todo we don't know if it belongs to this session!! */
edc0ced209cf455268870a686b88fd851f3a4188vboxsync //dprintf(DRIVER_NAME "close: unblocking select %p %x\n", sState.selectSync, sState.selectEvent);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync notify_select_event(sState.selectSync, sState.selectEvent);
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver free hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log(("VBoxGuestHaikuFree: pSession=%p\n", pSession));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Close the session if it's still hanging on to the device...
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log(("VBoxGuestHaikuFree: si_drv1=%p!\n", pSession));
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver IOCtl entry.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param op The operation to perform.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param data The data associated with the operation.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param len Size of the data in bytes.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuIOCtl(void *cookie, uint32 op, void *data, size_t len)
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync Log((DRIVER_NAME ":VBoxGuestHaikuIOCtl cookie=%p op=0x%08x data=%p len=%lu)\n", cookie, op, data, len));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Validate the input.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Validate the request wrapper.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync Log((DRIVER_NAME ": VBoxGuestHaikuIOCtl: bad request %lu size=%lu expected=%d\n", ulCmd, IOCPARM_LEN(ulCmd),
cadd9de82d5169aad827fe8d68e41a78ebbc6410vboxsync dprintf(DRIVER_NAME ": VBoxGuestHaikuIOCtl: bad size %#x; pArg=%p Cmd=%lu.\n", (unsigned)len, data, op);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Read the request.
edc0ced209cf455268870a686b88fd851f3a4188vboxsync LogRel((DRIVER_NAME ":VBoxGuestHaikuIOCtl: RTMemTmpAlloc failed to alloc %d bytes.\n", len));
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync /** @todo r=ramshankar: replace with RTR0MemUserCopyFrom() */
edc0ced209cf455268870a686b88fd851f3a4188vboxsync LogRel((DRIVER_NAME ":VBoxGuestHaikuIOCtl: user_memcpy failed; pvBuf=%p data=%p op=%d. rc=%d\n", pvBuf, data, op, rc));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync LogRel((DRIVER_NAME ":VBoxGuestHaikuIOCtl: pvBuf invalid pointer %p\n", pvBuf));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log((DRIVER_NAME ":VBoxGuestHaikuIOCtl: pSession=%p pid=%d.\n", pSession,(int)RTProcSelf()));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync * Process the IOCtl.
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync rc = VbgdCommonIoCtl(op, &g_DevExt, pSession, pvBuf, len, &cbDataReturned);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log((DRIVER_NAME ":VBoxGuestHaikuIOCtl: too much output data %d expected %d\n", cbDataReturned, len));
edc0ced209cf455268870a686b88fd851f3a4188vboxsync Log((DRIVER_NAME ":VBoxGuestHaikuIOCtl: user_memcpy failed; pvBuf=%p pArg=%p Cmd=%lu. rc=%d\n", pvBuf, data, op, rc));
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync Log((DRIVER_NAME ":VBoxGuestHaikuIOCtl: VbgdCommonIoCtl failed. rc=%d\n", rc));
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver select hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param event The event.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param ref ???
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param sync ???
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuSelect(void *cookie, uint8 event, uint32 ref, selectsync *sync)
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync uint32_t u32CurSeq = ASMAtomicUoReadU32(&g_DevExt.u32MousePosChangedSeq);
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver deselect hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param event The event.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param sync ???
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuDeselect(void *cookie, uint8 event, selectsync *sync)
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync //dprintf(DRIVER_NAME "deselect(,%d,%p)\n", event, sync);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync //dprintf(DRIVER_NAME "deselect: dropping: %p %x\n", sState.selectSync, sState.selectEvent);
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver write hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param position The offset.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param data Pointer to the data.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param numBytes Where to store the number of bytes written.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuWrite(void *cookie, off_t position, const void *data, size_t *numBytes)
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * Driver read hook.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param cookie The session.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param position The offset.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param data Pointer to the data.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @param numBytes Where to store the number of bytes read.
ecc1743369d58e0618f528b22a7b82b57dcd47advboxsync * @return Haiku status code.
edc0ced209cf455268870a686b88fd851f3a4188vboxsyncstatic status_t VBoxGuestHaikuRead(void *cookie, off_t position, void *data, size_t *numBytes)
edc0ced209cf455268870a686b88fd851f3a4188vboxsync PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)cookie;
edc0ced209cf455268870a686b88fd851f3a4188vboxsync uint32_t u32CurSeq = ASMAtomicUoReadU32(&g_DevExt.u32MousePosChangedSeq);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync return get_module(MODULE_NAME, (module_info **)&g_VBoxGuest);
edc0ced209cf455268870a686b88fd851f3a4188vboxsync static const char *devices[] = { DEVICE_NAME, NULL };