35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync/* $Id$ */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/** @file
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * VBoxSF - OS/2 Shared Folders, Initialization.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/*
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * Permission is hereby granted, free of charge, to any person
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * obtaining a copy of this software and associated documentation
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * files (the "Software"), to deal in the Software without
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * restriction, including without limitation the rights to use,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * copies of the Software, and to permit persons to whom the
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * Software is furnished to do so, subject to the following
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * conditions:
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * The above copyright notice and this permission notice shall be
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * included in all copies or substantial portions of the Software.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * OTHER DEALINGS IN THE SOFTWARE.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/*******************************************************************************
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync* Header Files *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync*******************************************************************************/
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#define LOG_GROUP LOG_GROUP_DEFAULT
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#include "VBoxSFInternal.h"
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#include <VBox/VBoxGuestLib.h>
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#include <VBox/log.h>
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#include <iprt/assert.h>
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#include <iprt/initterm.h>
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/*******************************************************************************
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync* Global Variables *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync*******************************************************************************/
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_BEGIN
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/* from VBoxSFA.asm */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncextern RTFAR16 g_fpfnDevHlp;
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncextern VBOXGUESTOS2IDCCONNECT g_VBoxGuestIDC;
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncextern uint32_t g_u32Info;
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/* from sys0.asm and the linker/end.lib. */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncextern char _text, _etext, _data, _end;
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_END
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync/**
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * 32-bit Ring-0 init routine.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * This is called the first time somebody tries to use the IFS.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * It will initialize IPRT, Vbgl and whatever else is required.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * The caller will do the necessary AttachDD and calling of the 16 bit
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * IDC to initialize the g_VBoxGuestIDC global. Perhaps we should move
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * this bit to VbglInit? It's just that it's so much simpler to do it
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * while we're on the way here...
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync *
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncDECLASM(void)
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsyncVBoxSFR0Init(void)
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync{
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync Log(("VBoxSFR0Init: g_fpfnDevHlp=%lx u32Version=%RX32 u32Session=%RX32 pfnServiceEP=%p g_u32Info=%u (%#x)\n",
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync g_fpfnDevHlp, g_VBoxGuestIDC.u32Version, g_VBoxGuestIDC.u32Session, g_VBoxGuestIDC.pfnServiceEP, g_u32Info, g_u32Info));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync /*
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * Start by initializing IPRT.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync if ( g_VBoxGuestIDC.u32Version == VMMDEV_VERSION
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync && VALID_PTR(g_VBoxGuestIDC.u32Session)
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync && VALID_PTR(g_VBoxGuestIDC.pfnServiceEP))
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync {
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync int rc = RTR0Init(0);
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync if (RT_SUCCESS(rc))
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync {
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync rc = VbglInit();
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync if (RT_SUCCESS(rc))
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync {
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#ifndef DONT_LOCK_SEGMENTS
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync /*
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync * Lock the 32-bit segments in memory.
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync */
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync static KernVMLock_t s_Text32, s_Data32;
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync rc = KernVMLock(VMDHL_LONG,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync &_text, (uintptr_t)&_etext - (uintptr_t)&_text,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync &s_Text32, (KernPageList_t *)-1, NULL);
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync AssertMsg(rc == NO_ERROR, ("locking text32 failed, rc=%d\n"));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync rc = KernVMLock(VMDHL_LONG | VMDHL_WRITE,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync &_data, (uintptr_t)&_end - (uintptr_t)&_data,
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync &s_Data32, (KernPageList_t *)-1, NULL);
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync AssertMsg(rc == NO_ERROR, ("locking text32 failed, rc=%d\n"));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync#endif
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync Log(("VBoxSFR0Init: completed successfully\n"));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync return;
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync }
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync }
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync LogRel(("VBoxSF: RTR0Init failed, rc=%Rrc\n", rc));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync }
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync else
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync LogRel(("VBoxSF: Failed to connect to VBoxGuest.sys.\n"));
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync}
0f0fa99ce6af43d7a38d97fdecc89eae0bf89fdfvboxsync