VBoxBFE.cpp revision cc74f15083bf80fbc96723a89faa06c15d0dead8
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync/* $Id$ */
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync/** @file
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * Basic Frontend (BFE): VBoxBFE main routines.
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync *
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * VBoxBFE is a limited frontend that sits directly on the Virtual Machine
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * Manager (VMM) and does _not_ use COM to communicate.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * On Linux and Windows, VBoxBFE is based on SDL; on L4 it's based on the
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * L4 console. Much of the code has been copied over from the other frontends
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * in VBox/Main/ and src/Frontends/VBoxSDL/.
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync */
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync/*
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * Copyright (C) 2006-2009 Oracle Corporation
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync *
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * available from http://www.virtualbox.org. This file is free software;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * you can redistribute it and/or modify it under the terms of the GNU
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * General Public License (GPL) as published by the Free Software
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync */
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync/*******************************************************************************
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync* Header Files *
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync*******************************************************************************/
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#define LOG_GROUP LOG_GROUP_GUI
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifndef VBOXBFE_WITHOUT_COM
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <VBox/com/Guid.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <VBox/com/string.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncusing namespace com;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/types.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/err.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/log.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/param.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/pdm.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <VBox/version.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef VBOXBFE_WITH_USB
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <VBox/vusb.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef VBOX_WITH_HGCM
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <VBox/shflsvc.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/alloc.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/alloca.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/assert.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/ctype.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/file.h>
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#include <iprt/path.h>
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#include <iprt/initterm.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/semaphore.h>
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#include <iprt/stream.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/string.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/thread.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <iprt/uuid.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "VBoxBFE.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync#include <stdio.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <stdlib.h> /* putenv */
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <errno.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#if defined(RT_OS_LINUX) || defined(RT_OS_L4)
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <fcntl.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <net/if.h>
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#include <sys/ioctl.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include <linux/if_tun.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "ConsoleImpl.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "DisplayImpl.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "MouseImpl.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "KeyboardImpl.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "VMMDev.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "StatusImpl.h"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#include "Framebuffer.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "MachineDebuggerImpl.h"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef VBOXBFE_WITH_USB
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include "HostUSBImpl.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#if defined(USE_SDL) && ! defined(RT_OS_L4)
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "SDLConsole.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "SDLFramebuffer.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef RT_OS_L4
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "L4Console.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "L4Framebuffer.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#include "L4IDLInterface.h"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
9d4498106267e3834edc3a37bca5ca660153525cvboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef RT_OS_L4
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <l4/sys/ktrace.h>
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync# include <l4/vboxserver/file.h>
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync/*******************************************************************************
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync* Defined Constants And Macros *
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync*******************************************************************************/
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#define VBOXSDL_ADVANCED_OPTIONS
9e66213005c4dba14a83d8467a93f5f51b504c97vboxsync#define MAC_STRING_LEN 12
9e66213005c4dba14a83d8467a93f5f51b504c97vboxsync
5d69af51557e9e9db029ecd243e820383af49b18vboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/*******************************************************************************
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync* Internal Functions *
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsync*******************************************************************************/
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic DECLCALLBACK(int) vboxbfeConfigConstructor(PVM pVM, void *pvUser);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic DECLCALLBACK(void) vmstateChangeCallback(PVM pVM, VMSTATE enmState, VMSTATE enmOldState, void *pvUser);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic DECLCALLBACK(void) setVMErrorCallback(PVM pVM, void *pvUser, int rc, RT_SRC_POS_DECL,
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync const char *pszFormat, va_list args);
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncstatic DECLCALLBACK(int) VMPowerUpThread(RTTHREAD Thread, void *pvUser);
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync
ed24120b1d8a2eddf4291a9654cf45b2372135abvboxsync/*******************************************************************************
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync* Global Variables *
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync*******************************************************************************/
5d69af51557e9e9db029ecd243e820383af49b18vboxsync
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncPVM gpVM = NULL;
5d69af51557e9e9db029ecd243e820383af49b18vboxsyncMouse *gMouse = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncDisplay *gDisplay = NULL;
ed24120b1d8a2eddf4291a9654cf45b2372135abvboxsyncKeyboard *gKeyboard = NULL;
5d69af51557e9e9db029ecd243e820383af49b18vboxsyncVMMDev *gVMMDev = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncFramebuffer *gFramebuffer = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncMachineDebugger *gMachineDebugger = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncVMStatus *gStatus = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncConsole *gConsole = NULL;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef VBOXBFE_WITH_USB
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncHostUSB *gHostUSB = NULL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncVMSTATE machineState = VMSTATE_CREATING;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic PPDMLED mapFDLeds[2] = {0};
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/** flag whether keyboard/mouse events are grabbed */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/** see <l4/input/macros.h> for key definitions */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKey; /* not used */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKeySym = KEY_RIGHTCTRL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#elif defined (DEBUG_dmik)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync// my mini kbd doesn't have RCTRL...
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKey = KMOD_RSHIFT;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKeySym = SDLK_RSHIFT;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#else
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKey = KMOD_RCTRL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint gHostKeySym = SDLK_RCTRL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncbool gfAllowFullscreenToggle = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic bool g_fIOAPIC = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic bool g_fACPI = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic bool g_fAudio = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef VBOXBFE_WITH_USB
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic bool g_fUSB = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic char *g_pszHdaFile = NULL;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fHdaSpf = false;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic char *g_pszHdbFile = NULL;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fHdbSpf = false;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic char *g_pszCdromFile = NULL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic char *g_pszFdaFile = NULL;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync const char *g_pszStateFile = NULL;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic const char *g_pszBootDevice = "IDE";
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic uint32_t g_u32MemorySizeMB = 128;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic uint32_t g_u32VRamSize = 4 * _1M;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync#ifdef VBOXSDL_ADVANCED_OPTIONS
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsyncstatic bool g_fRawR0 = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic bool g_fRawR3 = true;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fPATM = true;
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsyncstatic bool g_fCSAM = true;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync#endif
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fRestoreState = false;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic const char *g_pszShareDir[MaxSharedFolders];
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic const char *g_pszShareName[MaxSharedFolders];
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fShareReadOnly[MaxSharedFolders];
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic unsigned g_uNumShares;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fPreAllocRam = false;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic int g_iBootMenu = 2;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsyncstatic bool g_fReleaseLog = true; /**< Set if we should open the release. */
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync const char *g_pszProgressString;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync unsigned g_uProgressPercent = ~0U;
4d8251400411b4dcf2c86b5b0376a326ff45938cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Network device config info.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsynctypedef struct BFENetworkDevice
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync enum
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync NOT_CONFIGURED = 0,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync NONE,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync NAT,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync HIF,
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync INTNET
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync } enmType; /**< The type of network driver. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync bool fSniff; /**< Set if the network sniffer should be installed. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync const char *pszSniff; /**< Output file for the network sniffer. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTMAC Mac; /**< The mac address for the device. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync const char *pszName; /**< The device name of a HIF device. The name of the internal network. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_OS2
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync bool fHaveConnectTo; /**< Whether fConnectTo is set. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int32_t iConnectTo; /**< The lanX to connect to (bridge with). */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#elif 1//defined(RT_OS_LINUX)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync bool fHaveFd; /**< Set if fd is valid. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int32_t fd; /**< The file descriptor of a HIF device.*/
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync} BFENETDEV, *PBFENETDEV;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/** Array of network device configurations. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic BFENETDEV g_aNetDevs[NetworkAdapterCount];
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/** @todo currently this is only set but never read. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic char szError[512];
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncbool fActivateHGCM()
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return !!(g_uNumShares > 0);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Converts the passed in network option
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync *
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @returns Index into g_aNetDevs on success. (positive)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @returns VERR_INVALID_PARAMETER on failure. (negative)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pszArg The argument.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param cchRoot The length of the argument root.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic int networkArg2Index(const char *pszArg, int cchRoot)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync uint32_t n;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync int rc = RTStrToUInt32Ex(&pszArg[cchRoot], NULL, 10, &n);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RT_FAILURE(rc))
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Error: invalid network device option (rc=%Rrc): %s\n", rc, pszArg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return -1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (n < 1 || n > NetworkAdapterCount)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Error: The network device number is out of range: %RU32 (1 <= 0 <= %u) (%s)\n",
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync n, NetworkAdapterCount, pszArg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return -1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return n;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Generates a new unique MAC address based on our vendor ID and
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * parts of a GUID.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync *
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @returns iprt status code
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pAddress An array into which to store the newly generated address
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint GenerateMACAddress(char pszAddress[MAC_STRING_LEN + 1])
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Our strategy is as follows: the first three bytes are our fixed
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * vendor ID (080027). The remaining 3 bytes will be taken from the
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * start of a GUID. This is a fairly safe algorithm.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlowFunc(("called\n"));
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTUUID uuid;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int rc = RTUuidCreate(&uuid);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RT_FAILURE(rc))
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlowFunc(("RTUuidCreate failed, returning %Rrc\n", rc));
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return rc;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTStrPrintf(pszAddress, MAC_STRING_LEN + 1, "080027%02X%02X%02X",
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync uuid.au8[0], uuid.au8[1], uuid.au8[2]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlowFunc(("generated MAC: '%s'\n", pszAddress));
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return VINF_SUCCESS;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/**
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Print a syntax error.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync *
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @returns return value for main().
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pszMsg The message format string.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param ... Format arguments.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic int SyntaxError(const char *pszMsg, ...)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_list va;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTPrintf("error: ");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_start(va, pszMsg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintfV(pszMsg, va);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_end(va);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return 1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Print a fatal error.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync *
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @returns return value for main().
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pszMsg The message format string.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param ... Format arguments.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncstatic int FatalError(const char *pszMsg, ...)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_list va;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("fatal error: ");
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync va_start(va, pszMsg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintfV(pszMsg, va);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_end(va);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return 1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Start progress display.
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync */
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsyncvoid startProgressInfo(const char *pszStr)
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync{
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync g_pszProgressString = pszStr;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync g_uProgressPercent = 0;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync}
de210ca38246009981a22de928a52566c8c53970vboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync * Update progress display.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncint callProgressInfo(PVM pVM, unsigned uPercent, void *pvUser)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (gConsole)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gConsole->progressInfo(pVM, uPercent, pvUser);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return VINF_SUCCESS;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * End progress display.
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncvoid endProgressInfo(void)
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync{
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync g_uProgressPercent = ~0U;
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync}
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync/**
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync * Print program usage.
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncstatic void show_usage()
9429e79ee2743cb878d5f3680e2dcad036125e02vboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Usage:\n"
468c2bcb36eb9a032f5dd0fcb34db10bd58e9996vboxsync " -hda <file> Set first hard disk to file\n"
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsync " -hdb <file> Set second hard disk to file\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync " -fda <file> Set first floppy disk to file\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -cdrom <file> Set CDROM to file/device ('none' to unmount)\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync " -boot <a|c|d> Set boot device (a = floppy, c = first hard disk, d = DVD)\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -boot menu <0|1|2> Boot menu (0 = disable, 1 = menu only, 2 = message + menu)\n"
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync " -m <size> Set memory size in megabytes (default 128MB)\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -vram <size> Set size of video memory in megabytes\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -prealloc Force RAM pre-allocation\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -fullscreen Start VM in fullscreen mode\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -statefile <file> Define the file name for VM save/restore\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -restore Restore the VM if the statefile exists, normal start otherwise\n"
9429e79ee2743cb878d5f3680e2dcad036125e02vboxsync " -nofstoggle Forbid switching to/from fullscreen mode\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -share <dir> <name> [readonly]\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync " Share directory <dir> as name <name>. Optionally read-only.\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -nohostkey Disable hostkey\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -[no]acpi Enable or disable ACPI (default: enabled)\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -[no]ioapic Enable or disable the IO-APIC (default: disabled)\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -audio Enable audio\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifndef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -natdev<1-N> [mac] Use NAT networking on network adapter <N>. Use hardware\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " address <mac> if specified.\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -hifdev<1-N> Use Host Interface Networking with host interface <int>\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " <int> [mac] on network adapter <N>. Use hardware address <mac> if\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " specified.\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifndef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -intnet<1-N> Attach network adapter <N> to internal network <net>. Use\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " <net> [mac] hardware address <mac> if specified.\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#if 0
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -netsniff<1-N> Enable packet sniffer\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_OS2
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -brdev<1-N> lan<X> Bridge network adaptor <N> with the 'lanX' device.\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef RT_OS_LINUX
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync " -tapfd<1-N> <fd> Use existing TAP device, don't allocate\n"
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#endif
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -vrdp [port] Listen for VRDP connections on port (default if not specified)\n"
5d69af51557e9e9db029ecd243e820383af49b18vboxsync#ifdef VBOX_SECURELABEL
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -securelabel Display a secure VM label at the top of the screen\n"
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -seclabelfnt TrueType (.ttf) font file for secure session label\n"
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -seclabelsiz Font point size for secure session label (default 12)\n"
5d69af51557e9e9db029ecd243e820383af49b18vboxsync#endif
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -[no]rellog Enable or disable the release log './VBoxBFE.log' (default: enabled)\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#ifdef VBOXSDL_ADVANCED_OPTIONS
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -[no]rawr0 Enable or disable raw ring 3\n"
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsync " -[no]rawr3 Enable or disable raw ring 0\n"
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsync " -[no]patm Enable or disable PATM\n"
5d69af51557e9e9db029ecd243e820383af49b18vboxsync " -[no]csam Enable or disable CSAM\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync " -env <var=value> Set the given environment variable to \"value\"\n"
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync "\n");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/** entry point */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncextern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp)
5d69af51557e9e9db029ecd243e820383af49b18vboxsync{
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync bool fFullscreen = false;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync int32_t portVRDP = -1;
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync#ifdef VBOX_SECURELABEL
ba8183e1a0c699f5b5131a03e157fc7e39ed3009vboxsync bool fSecureLabel = false;
de210ca38246009981a22de928a52566c8c53970vboxsync uint32_t secureLabelPointSize = 12;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync char *secureLabelFontFile = NULL;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync#endif
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync#ifdef RT_OS_L4
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync uint32_t u32MaxVRAM;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync#endif
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync int rc = VINF_SUCCESS;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync RTPrintf(VBOX_PRODUCT " Simple SDL GUI built %s %s\n", __DATE__, __TIME__);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync // less than one parameter is not possible
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync if (argc < 2)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync show_usage();
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync return 1;
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync }
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync /*
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync * Parse the command line arguments.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync for (int curArg = 1; curArg < argc; curArg++)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync const char * const pszArg = argv[curArg];
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (strcmp(pszArg, "-boot") == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing argument for boot drive!\n");
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync if (strlen(argv[curArg]) != 1)
760446f710619a9daa6cedc7f0601f49e4ea3442vboxsync return SyntaxError("invalid argument for boot drive! (%s)\n", argv[curArg]);
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync rc = VINF_SUCCESS;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync switch (argv[curArg][0])
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync case 'a':
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_pszBootDevice = "FLOPPY";
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync break;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync case 'c':
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_pszBootDevice = "IDE";
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync break;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync
760446f710619a9daa6cedc7f0601f49e4ea3442vboxsync case 'd':
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_pszBootDevice = "DVD";
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync break;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
de210ca38246009981a22de928a52566c8c53970vboxsync
de210ca38246009981a22de928a52566c8c53970vboxsync default:
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("wrong argument for boot drive! (%s)\n", argv[curArg]);
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-bootmenu") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing argument for boot menu!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (strlen(argv[curArg]) != 1 || *argv[curArg] < '0' || *argv[curArg] > '2')
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("invalid argument for boot menu! (%s)\n", argv[curArg]);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync rc = VINF_SUCCESS;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_iBootMenu = *argv[curArg] - 0;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-m") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (++curArg >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing argument for memory size!\n");
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync rc = RTStrToUInt32Ex(argv[curArg], NULL, 0, &g_u32MemorySizeMB);
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync if (RT_FAILURE(rc))
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync return SyntaxError("bad memory size: %s (error %Rrc)\n",
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync argv[curArg], rc);
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-vram") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
a2828f06a7a97fd85445ed5b2c5cb6a12a185d1dvboxsync return SyntaxError("missing argument for vram size!\n");
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync uint32_t uVRAMMB;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc = RTStrToUInt32Ex(argv[curArg], NULL, 0, &uVRAMMB);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync g_u32VRamSize = uVRAMMB * _1M;
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (RT_FAILURE(rc))
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("bad video ram size: %s (error %Rrc)\n",
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync argv[curArg], rc);
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-statefile") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing argument for restore!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_pszStateFile = argv[curArg];
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-restore") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_fRestoreState = true;
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-share") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (g_uNumShares >= MaxSharedFolders)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("too many shared folders specified!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing 1s argument for share!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_pszShareDir[g_uNumShares] = argv[curArg];
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing 2nd argument for share!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_pszShareName[g_uNumShares] = argv[curArg];
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (curArg < argc-1 && strcmp(argv[curArg+1], "readonly") == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_fShareReadOnly[g_uNumShares] = true;
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync curArg++;
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync g_uNumShares++;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-fullscreen") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync fFullscreen = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-nofstoggle") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gfAllowFullscreenToggle = false;
de210ca38246009981a22de928a52566c8c53970vboxsync else if (strcmp(pszArg, "-nohostkey") == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gHostKey = 0;
de210ca38246009981a22de928a52566c8c53970vboxsync gHostKeySym = 0;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-acpi") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fACPI = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-noacpi") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fACPI = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-ioapic") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fIOAPIC = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-noioapic") == 0)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_fIOAPIC = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-audio") == 0)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_fAudio = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef VBOXBFE_WITH_USB
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync else if (strcmp(pszArg, "-usb") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fUSB = true;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync else if (strcmp(pszArg, "-hda") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (++curArg >= argc)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return SyntaxError("missing file name for first hard disk!\n");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* resolve it. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RTPathExists(argv[curArg]))
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_pszHdaFile = RTPathRealDup(argv[curArg]);
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync if (!g_pszHdaFile)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync return SyntaxError("The path to the specified harddisk, '%s', could not be resolved.\n", argv[curArg]);
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync else if (strcmp(pszArg, "-hdaspf") == 0)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fHdaSpf = true;
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-hdb") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (++curArg >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing file name for second hard disk!\n");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* resolve it. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RTPathExists(argv[curArg]))
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync g_pszHdbFile = RTPathRealDup(argv[curArg]);
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync if (!g_pszHdbFile)
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync return SyntaxError("The path to the specified harddisk, '%s', could not be resolved.\n", argv[curArg]);
817d003403ed9395143bd4ba88fbd9cb60e5eeebvboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-hdbspf") == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_fHdbSpf = true;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if (strcmp(pszArg, "-fda") == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing file/device name for first floppy disk!\n");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* resolve it. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RTPathExists(argv[curArg]))
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync g_pszFdaFile = RTPathRealDup(argv[curArg]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (!g_pszFdaFile)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("The path to the specified floppy disk, '%s', could not be resolved.\n", argv[curArg]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-cdrom") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (++curArg >= argc)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("missing file/device name for first hard disk!\n");
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync /* resolve it. */
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync if (RTPathExists(argv[curArg]))
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync g_pszCdromFile = RTPathRealDup(argv[curArg]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (!g_pszCdromFile)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync return SyntaxError("The path to the specified cdrom, '%s', could not be resolved.\n", argv[curArg]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* This is leaving a lot of dead code in the L4 version of course,
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync but I don't think that that is a major problem. We may even
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync activate it sometime... */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if ( strncmp(pszArg, "-hifdev", 7) == 0
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync || strncmp(pszArg, "-nonetd", 7) == 0)
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync#else
9eea21d61089fe62b80ef3f4549600091c2b1967vboxsync else if ( strncmp(pszArg, "-natdev", 7) == 0
b5e27e3959258723aa2c45f72d2b2e91d10b6deevboxsync || strncmp(pszArg, "-hifdev", 7) == 0
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync || strncmp(pszArg, "-nonetd", 7) == 0
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync || strncmp(pszArg, "-intnet", 7) == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync int i = networkArg2Index(pszArg, 7);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (i < 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return 1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_aNetDevs[i].enmType = !strncmp(pszArg, "-natdev", 7)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync ? BFENETDEV::NAT
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync : !strncmp(pszArg, "-hifdev", 7)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync ? BFENETDEV::HIF
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync : !strncmp(pszArg, "-intnet", 7)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync ? BFENETDEV::INTNET
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync : BFENETDEV::NONE;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* The HIF device name / The Internal Network name. */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_aNetDevs[i].pszName = NULL;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if ( g_aNetDevs[i].enmType == BFENETDEV::HIF
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync || g_aNetDevs[i].enmType == BFENETDEV::INTNET)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (curArg + 1 >= argc)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError(g_aNetDevs[i].enmType == BFENETDEV::HIF
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync ? "The TAP network device name is missing! (%s)\n"
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync : "The internal network name is missing! (%s)\n"
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync , pszArg);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_aNetDevs[i].pszName = argv[++curArg];
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /* The MAC address. */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync const char *pszMac;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync char szMacGen[MAC_STRING_LEN + 1];
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if ((curArg + 1 < argc) && (argv[curArg + 1][0] != '-'))
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync pszMac = argv[++curArg];
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync rc = GenerateMACAddress(szMacGen);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (RT_FAILURE(rc))
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("failed to generate a hardware address for network device %d (error %Rrc)\n",
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync i, rc);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync pszMac = szMacGen;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (strlen(pszMac) != MAC_STRING_LEN)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("The network MAC address has an invalid length: %s (%s)\n", pszMac, pszArg);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync for (unsigned j = 0; j < RT_ELEMENTS(g_aNetDevs[i].Mac.au8); j++)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync char c1 = RT_C_TO_UPPER(*pszMac++) - '0';
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (c1 > 9)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync c1 -= 7;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync char c2 = RT_C_TO_UPPER(*pszMac++) - '0';
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (c2 > 9)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync c2 -= 7;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (c2 > 16 || c1 > 16)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("Invalid MAC address: %s\n", argv[curArg]);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_aNetDevs[i].Mac.au8[j] = ((c1 & 0x0f) << 4) | (c2 & 0x0f);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strncmp(pszArg, "-netsniff", 9) == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync int i = networkArg2Index(pszArg, 9);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (i < 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return 1;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_aNetDevs[i].fSniff = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /** @todo filename */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#ifdef RT_OS_OS2
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strncmp(pszArg, "-brdev", 6) == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync int i = networkArg2Index(pszArg, 6);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (i < 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return 1;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (g_aNetDevs[i].enmType != BFENETDEV::HIF)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("%d is not a hif device! Make sure you put the -hifdev argument first.\n", i);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (++curArg >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing argument for %s!\n", pszArg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if ( strncmp(argv[curArg], "lan", 3)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync || argv[curArg][3] < '0'
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync || argv[curArg][3] >= '8'
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync || argv[curArg][4])
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("bad interface name '%s' specified with '%s'. Expected 'lan0', 'lan1' and similar.\n",
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync argv[curArg], pszArg);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_aNetDevs[i].iConnectTo = argv[curArg][3] - '0';
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync g_aNetDevs[i].fHaveConnectTo = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#endif
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#ifdef RT_OS_LINUX
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strncmp(pszArg, "-tapfd", 6) == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync int i = networkArg2Index(pszArg, 6);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (i < 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync return 1;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (++curArg >= argc)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("missing argument for %s!\n", pszArg);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc = RTStrToInt32Ex(argv[curArg], NULL, 0, &g_aNetDevs[i].fd);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (RT_FAILURE(rc))
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("bad tap file descriptor: %s (error %Rrc)\n", argv[curArg], rc);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync g_aNetDevs[i].fHaveFd = true;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif /* RT_OS_LINUX */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-vrdp") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync // -vrdp might take a port number (positive).
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync portVRDP = 0; // indicate that it was encountered.
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (curArg + 1 < argc && argv[curArg + 1][0] != '-')
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync rc = RTStrToInt32Ex(argv[curArg], NULL, 0, &portVRDP);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (RT_FAILURE(rc))
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("cannot vrpd port: %s (%Rrc)\n", argv[curArg], rc);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (portVRDP < 0 || portVRDP >= 0x10000)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("vrdp port number is out of range: %RI32\n", portVRDP);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#ifdef VBOX_SECURELABEL
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-securelabel") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync fSecureLabel = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync LogFlow(("Secure labelling turned on\n"));
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-seclabelfnt") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (++curArg >= argc)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return SyntaxError("missing font file name for secure label!\n");
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync secureLabelFontFile = argv[curArg];
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync else if (strcmp(pszArg, "-seclabelsiz") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (++curArg >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing font point size for secure label!\n");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync secureLabelPointSize = atoi(argv[curArg]);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#endif
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-rellog") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fReleaseLog = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-norellog") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fReleaseLog = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-prealloc") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fPreAllocRam = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#ifdef VBOXSDL_ADVANCED_OPTIONS
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync else if (strcmp(pszArg, "-rawr0") == 0)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_fRawR0 = true;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync else if (strcmp(pszArg, "-norawr0") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fRawR0 = false;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-rawr3") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fRawR3 = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-norawr3") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fRawR3 = false;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else if (strcmp(pszArg, "-patm") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fPATM = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-nopatm") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fPATM = false;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-csam") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fCSAM = true;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-nocsam") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync g_fCSAM = false;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#endif /* VBOXSDL_ADVANCED_OPTIONS */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#ifdef RT_OS_L4
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else if (strcmp(pszArg, "-env") == 0)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync ++curArg;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif /* RT_OS_L4 */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /* just show the help screen */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync SyntaxError("unrecognized argument '%s'\n", pszArg);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync show_usage();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return 1;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gMachineDebugger = new MachineDebugger();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gStatus = new VMStatus();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gKeyboard = new Keyboard();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gMouse = new Mouse();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (FAILED(gMouse->FinalConstruct()))
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync goto leave;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gVMMDev = new VMMDev();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gDisplay = new Display();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#if defined(USE_SDL)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* First console, then framebuffer!! */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gConsole = new SDLConsole();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gFramebuffer = new SDLFramebuffer();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#elif defined(RT_OS_L4)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gConsole = new L4Console();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gFramebuffer = new L4Framebuffer();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#else
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#error "todo"
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#endif
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (!gConsole->initialized())
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync goto leave;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gDisplay->SetFramebuffer(0, gFramebuffer);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /* start with something in the titlebar */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gConsole->updateTitlebar();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /*
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * Start the VM execution thread. This has to be done
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * asynchronously as powering up can take some time
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * (accessing devices such as the host DVD drive). In
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * the meantime, we have to service the SDL event loop.
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync RTTHREAD thread;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync rc = RTThreadCreate(&thread, VMPowerUpThread, 0, 0, RTTHREADTYPE_MAIN_WORKER, 0, "PowerUp");
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if (RT_FAILURE(rc))
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync RTPrintf("Error: Thread creation failed with %d\n", rc);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync return -1;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#ifdef RT_OS_L4
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* Start the external IDL interface */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync L4CtrlInit();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* loop until the powerup processing is done */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync do
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#if defined(VBOXBFE_WITH_X11) && defined(USE_SDL)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync if ( machineState == VMSTATE_CREATING
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync || machineState == VMSTATE_LOADING)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int event = gConsole->eventWait();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync switch (event)
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync {
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync case CONEVENT_USR_SCREENRESIZE:
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync LogFlow(("CONEVENT_USR_SCREENRESIZE\n"));
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gFramebuffer->resize();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /* notify the display that the resize has been completed */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gDisplay->ResizeCompleted();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync break;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync case CONEVENT_USR_TITLEBARUPDATE:
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gConsole->updateTitlebar();
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync break;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync case CONEVENT_USR_QUIT:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTPrintf("Error: failed to power up VM! No error text available.\n");
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync goto leave;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync else
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync#endif
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync RTThreadSleep(1000);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync while ( machineState == VMSTATE_CREATING
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync || machineState == VMSTATE_LOADING);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (machineState == VMSTATE_TERMINATED)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync goto leave;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* did the power up succeed? */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (machineState != VMSTATE_RUNNING)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Error: failed to power up VM! No error text available (rc = 0x%x state = %d)\n", rc, machineState);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync goto leave;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gConsole->updateTitlebar();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef RT_OS_L4
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* The L4 console provides (currently) a fixed resolution. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (g_u32VRamSize >= gFramebuffer->getHostXres()
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * gFramebuffer->getHostYres()
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * (gDisplay->getBitsPerPixel() / 8))
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gDisplay->SetVideoModeHint(gFramebuffer->getHostXres(), gFramebuffer->getHostYres(), 0, 0);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* Limit the VRAM of the guest to the amount of memory we got actually
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * mapped from the L4 console. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync u32MaxVRAM = (gFramebuffer->getHostYres() + 18) /* don't omit the status bar */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * gFramebuffer->getHostXres()
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * (gFramebuffer->getHostBitsPerPixel() / 8);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (g_u32VRamSize > u32MaxVRAM)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Limiting the video memory to %u bytes\n", u32MaxVRAM);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync g_u32VRamSize = u32MaxVRAM;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#endif
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Main event loop
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlow(("VBoxSDL: Entering big event loop\n"));
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync while (1)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int event = gConsole->eventWait();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync switch (event)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_NONE:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* Handled internally */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync break;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_QUIT:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_USR_QUIT:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync goto leave;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_SCREENUPDATE:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /// @todo that somehow doesn't seem to work!
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gFramebuffer->repaint();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync break;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_USR_TITLEBARUPDATE:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gConsole->updateTitlebar();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync break;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_USR_SCREENRESIZE:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlow(("CONEVENT_USR_SCREENRESIZE\n"));
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gFramebuffer->resize();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* notify the display that the resize has been completed */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync gDisplay->ResizeCompleted();
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync break;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync#ifdef VBOX_SECURELABEL
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync case CONEVENT_USR_SECURELABELUPDATE:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Query the new label text
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync Bstr key = VBOXSDL_SECURELABEL_EXTRADATA;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync Bstr label;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync gMachine->COMGETTER(ExtraData)(key, label.asOutParam());
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync Utf8Str labelUtf8 = label;
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync /*
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * Now update the label
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gFramebuffer->setSecureLabelText(labelUtf8.raw());
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync break;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif /* VBOX_SECURELABEL */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncleave:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync LogFlow(("Returning from main()!\n"));
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (gpVM)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * If get here because the guest terminated using ACPI off we don't have to
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * switch off the VM because we were notified via vmstateChangeCallback()
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * that this already happened. In any other case stop the VM before killing her.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (machineState != VMSTATE_OFF)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* Power off VM */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync rc = VMR3PowerOff(gpVM);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync AssertRC(rc);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* And destroy it */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync rc = VMR3Destroy(gpVM);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync AssertRC(rc);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync delete gFramebuffer;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gConsole;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gDisplay;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gKeyboard;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gMouse->FinalRelease();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gMouse;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gStatus;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync delete gMachineDebugger;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTLogFlush(NULL);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return RT_FAILURE (rc) ? 1 : 0;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync}
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#ifndef VBOX_WITH_HARDENING
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/**
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Main entry point.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncint main(int argc, char **argv)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync{
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync# ifdef RT_OS_L4
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync# ifndef L4API_l4v2onv4
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* clear Fiasco kernel trace buffer */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync fiasco_tbuf_clear();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync# endif
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* set the environment. Must be done before the runtime is
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync initialised. Yes, it really must. */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync for (int i = 0; i < argc; i++)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (strcmp(argv[i], "-env") == 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (++i >= argc)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("missing argument to -env (format: var=value)!\n");
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /* add it to the environment */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (putenv(argv[i]) != 0)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return SyntaxError("Error setting environment string %s.\n", argv[i]);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync# endif /* RT_OS_L4 */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Before we do *anything*, we initialize the runtime.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync int rc = RTR3Init();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (RT_FAILURE(rc))
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return FatalError("RTR3Init failed rc=%Rrc\n", rc);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync return TrustedMain(argc, argv, NULL);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync}
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#endif /* !VBOX_WITH_HARDENING */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/**
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * VM state callback function. Called by the VMM
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * using its state machine states.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Primarily used to handle VM initiated power off, suspend and state saving,
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * but also for doing termination completed work (VMSTATE_TERMINATE).
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * In general this function is called in the context of the EMT.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @todo machineState is set to VMSTATE_RUNNING before all devices have received power on events
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * this can prematurely allow the main thread to enter the event loop
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param pVM The VM handle.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param enmState The new state.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param enmOldState The old state.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param pvUser The user argument.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncstatic DECLCALLBACK(void) vmstateChangeCallback(PVM pVM, VMSTATE enmState, VMSTATE enmOldState, void *pvUser)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync{
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync LogFlow(("vmstateChangeCallback: changing state from %d to %d\n", enmOldState, enmState));
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync machineState = enmState;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync switch (enmState)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * The VM has terminated
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync case VMSTATE_OFF:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync gConsole->eventQuit();
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync break;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * The VM has been completely destroyed.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Note: This state change can happen at two points:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * 1) At the end of VMR3Destroy() if it was not called from EMT.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * 2) At the end of vmR3EmulationThread if VMR3Destroy() was called by EMT.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync case VMSTATE_TERMINATED:
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync break;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync default: /* shut up gcc */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync break;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync}
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/**
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * VM error callback function. Called by the various VM components.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync *
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param pVM The VM handle.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param pvUser The user argument.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param rc VBox status code.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param pszError Error message format string.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @param args Error message arguments.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * @thread EMT.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncDECLCALLBACK(void) setVMErrorCallback(PVM pVM, void *pvUser, int rc, RT_SRC_POS_DECL,
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync const char *pszFormat, va_list args)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync{
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /** @todo accessing shared resource without any kind of synchronization */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (RT_SUCCESS(rc))
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync szError[0] = '\0';
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync else
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync va_list va2;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync va_copy(va2, args); /* Have to make a copy here or GCC will break. */
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync RTStrPrintf(szError, sizeof(szError),
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync "%N!\nVBox status code: %d (%Rrc)", pszFormat, &va2, rc, rc);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync RTPrintf("%s\n", szError);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync va_end(va2);
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync }
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync}
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync/**
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync * VM Runtime error callback function. Called by the various VM components.
3ff8aa7d3c74cfbe8da5f77b8ea6c748cc79213avboxsync *
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pVM The VM handle.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pvUser The user argument.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param fFlags The action flags. See VMSETRTERR_FLAGS_*.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pszErrorId Error ID string.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param pszError Error message format string.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @param va Error message arguments.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * @thread EMT.
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncDECLCALLBACK(void) setVMRuntimeErrorCallback(PVM pVM, void *pvUser, uint32_t fFlags,
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync const char *pszErrorId,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync const char *pszFormat, va_list va)
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync{
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync va_list va2;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_copy(va2, va); /* Have to make a copy here or GCC/AMD64 will break. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("%s: %s!\n%N!\n",
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync fFlags & VMSETRTERR_FLAGS_FATAL ? "Error" : "Warning",
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync pszErrorId, pszFormat, &va2);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTStrmFlush(g_pStdErr);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync va_end(va2);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync}
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync/** VM asynchronous operations thread */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsyncDECLCALLBACK(int) VMPowerUpThread(RTTHREAD Thread, void *pvUser)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int rc = VINF_SUCCESS;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int rc2;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Setup the release log instance in current directory.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (g_fReleaseLog)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync static char s_szError[RTPATH_MAX + 128] = "";
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync PRTLOGGER pLogger;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc2 = RTLogCreateEx(&pLogger, RTLOGFLAGS_PREFIX_TIME_PROG, "all",
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTLOGDEST_FILE, s_szError, sizeof(s_szError), "./VBoxBFE.log");
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RT_SUCCESS(rc2))
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* some introductory information */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTTIMESPEC TimeSpec;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync char szNowUct[64];
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTTimeSpecToString(RTTimeNow(&TimeSpec), szNowUct, sizeof(szNowUct));
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTLogRelLogger(pLogger, 0, ~0U,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync "VBoxBFE %s (%s %s) release log\n"
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync "Log opened %s\n",
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync VBOX_VERSION_STRING, __DATE__, __TIME__,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync szNowUct);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /* register this logger as the release logger */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTLogRelSetDefaultInstance(pLogger);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync else
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Could not open release log (%s)\n", s_szError);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync /*
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync * Start VM (also from saved state) and track progress
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync LogFlow(("VMPowerUp\n"));
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Create empty VM.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc = VMR3Create(1, NULL, setVMErrorCallback, NULL, vboxbfeConfigConstructor, NULL, &gpVM);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RT_FAILURE(rc))
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync RTPrintf("Error: VM creation failed with %Rrc.\n", rc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync goto failure;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Register VM state change handler
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc = VMR3AtStateRegister(gpVM, vmstateChangeCallback, NULL);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync if (RT_FAILURE(rc))
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync RTPrintf("Error: VMR3AtStateRegister failed with %Rrc.\n", rc);
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync goto failure;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync }
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync#ifdef VBOX_WITH_HGCM
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Add shared folders to the VM
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync if (fActivateHGCM() && gVMMDev->isShFlActive())
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync for (unsigned i=0; i<g_uNumShares; i++)
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync {
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync VBOXHGCMSVCPARM parms[SHFL_CPARMS_ADD_MAPPING];
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync SHFLSTRING *pFolderName, *pMapName;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync int cbString;
d8e12fa5dd1c35282b98cb165e42b6b395cf971bvboxsync PRTUTF16 aHostPath, aMapName;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc2 = RTStrToUtf16(g_pszShareDir[i], &aHostPath);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync AssertRC(rc2);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync rc2 = RTStrToUtf16(g_pszShareName[i], &aMapName);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync AssertRC(rc2);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync cbString = (RTUtf16Len (aHostPath) + 1) * sizeof (RTUTF16);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync pFolderName = (SHFLSTRING *) RTMemAllocZ (sizeof (SHFLSTRING) + cbString);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync Assert (pFolderName);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync memcpy (pFolderName->String.ucs2, aHostPath, cbString);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync pFolderName->u16Size = cbString;
pFolderName->u16Length = cbString - sizeof(RTUTF16);
parms[0].type = VBOX_HGCM_SVC_PARM_PTR;
parms[0].u.pointer.addr = pFolderName;
parms[0].u.pointer.size = sizeof (SHFLSTRING) + cbString;
cbString = (RTUtf16Len (aMapName) + 1) * sizeof (RTUTF16);
pMapName = (SHFLSTRING *) RTMemAllocZ (sizeof(SHFLSTRING) + cbString);
Assert (pMapName);
memcpy (pMapName->String.ucs2, aMapName, cbString);
pMapName->u16Size = cbString;
pMapName->u16Length = cbString - sizeof (RTUTF16);
parms[1].type = VBOX_HGCM_SVC_PARM_PTR;
parms[1].u.pointer.addr = pMapName;
parms[1].u.pointer.size = sizeof (SHFLSTRING) + cbString;
parms[2].type = VBOX_HGCM_SVC_PARM_32BIT;
parms[2].u.uint32 = !g_fShareReadOnly[i];
rc2 = gVMMDev->hgcmHostCall ("VBoxSharedFolders",
SHFL_FN_ADD_MAPPING, SHFL_CPARMS_ADD_MAPPING, &parms[0]);
AssertRC(rc2);
LogRel(("Added share %s: (%s)\n", g_pszShareName[i], g_pszShareDir[i]));
RTMemFree (pFolderName);
RTMemFree (pMapName);
RTUtf16Free (aHostPath);
RTUtf16Free (aMapName);
}
}
#endif
#ifdef VBOXBFE_WITH_USB
/*
* Capture USB devices.
*/
if (g_fUSB)
{
gHostUSB = new HostUSB();
gHostUSB->init(gpVM);
}
#endif /* VBOXBFE_WITH_USB */
/*
* Power on the VM (i.e. start executing).
*/
if (RT_SUCCESS(rc))
{
if ( g_fRestoreState
&& g_pszStateFile
&& *g_pszStateFile
&& RTPathExists(g_pszStateFile))
{
startProgressInfo("Restoring");
rc = VMR3LoadFromFile(gpVM, g_pszStateFile, callProgressInfo, (uintptr_t)NULL);
endProgressInfo();
if (RT_SUCCESS(rc))
{
rc = VMR3Resume(gpVM);
AssertRC(rc);
gDisplay->setRunning();
}
else
AssertMsgFailed(("VMR3LoadFromFile failed, rc=%Rrc\n", rc));
}
else
{
rc = VMR3PowerOn(gpVM);
if (RT_FAILURE(rc))
AssertMsgFailed(("VMR3PowerOn failed, rc=%Rrc\n", rc));
}
}
/*
* On failure destroy the VM.
*/
if (RT_FAILURE(rc))
goto failure;
return 0;
failure:
if (gpVM)
{
rc2 = VMR3Destroy(gpVM);
AssertRC(rc2);
gpVM = NULL;
}
machineState = VMSTATE_TERMINATED;
return 0;
}
/**
* Register the main drivers.
*
* @returns VBox status code.
* @param pCallbacks Pointer to the callback table.
* @param u32Version VBox version number.
*/
DECLCALLBACK(int) VBoxDriversRegister(PCPDMDRVREGCB pCallbacks, uint32_t u32Version)
{
int rc;
LogFlow(("VBoxDriversRegister: u32Version=%#x\n", u32Version));
AssertReleaseMsg(u32Version == VBOX_VERSION, ("u32Version=%#x VBOX_VERSION=%#x\n", u32Version, VBOX_VERSION));
rc = pCallbacks->pfnRegister(pCallbacks, &Mouse::DrvReg);
AssertRC(rc);
if (RT_FAILURE(rc))
return rc;
rc = pCallbacks->pfnRegister(pCallbacks, &Keyboard::DrvReg);
AssertRC(rc);
if (RT_FAILURE(rc))
return rc;
rc = pCallbacks->pfnRegister(pCallbacks, &Display::DrvReg);
AssertRC(rc);
if (RT_FAILURE(rc))
return rc;
rc = pCallbacks->pfnRegister(pCallbacks, &VMMDev::DrvReg);
AssertRC(rc);
if (RT_FAILURE(rc))
return rc;
rc = pCallbacks->pfnRegister(pCallbacks, &VMStatus::DrvReg);
if (RT_FAILURE(rc))
return rc;
return VINF_SUCCESS;
}
/**
* Constructs the VMM configuration tree.
*
* @returns VBox status code.
* @param pVM VM handle.
*/
static DECLCALLBACK(int) vboxbfeConfigConstructor(PVM pVM, void *pvUser)
{
int rcAll = VINF_SUCCESS;
int rc;
#define UPDATE_RC() do { if (RT_FAILURE(rc) && RT_SUCCESS(rcAll)) rcAll = rc; } while (0)
/*
* Root values.
*/
PCFGMNODE pRoot = CFGMR3GetRoot(pVM);
rc = CFGMR3InsertString(pRoot, "Name", "Default VM"); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "RamHoleSize", 512U * _1M); UPDATE_RC();
if (g_fPreAllocRam)
{
rc = CFGMR3InsertInteger(pRoot, "RamPreAlloc", 1); UPDATE_RC();
}
rc = CFGMR3InsertInteger(pRoot, "TimerMillies", 10); UPDATE_RC();
#ifdef VBOXSDL_ADVANCED_OPTIONS
rc = CFGMR3InsertInteger(pRoot, "RawR3Enabled", g_fRawR3); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "RawR0Enabled", g_fRawR0); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "PATMEnabled", g_fPATM); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "CSAMEnabled", g_fCSAM); UPDATE_RC();
#else
rc = CFGMR3InsertInteger(pRoot, "RawR3Enabled", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "RawR0Enabled", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "PATMEnabled", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pRoot, "CSAMEnabled", 1); UPDATE_RC();
#endif
/*
* PDM.
*/
rc = PDMR3RegisterDrivers(pVM, VBoxDriversRegister); UPDATE_RC();
/*
* Devices
*/
PCFGMNODE pDevices = NULL;
rc = CFGMR3InsertNode(pRoot, "Devices", &pDevices); UPDATE_RC();
/* device */
PCFGMNODE pDev = NULL;
PCFGMNODE pInst = NULL;
PCFGMNODE pCfg = NULL;
PCFGMNODE pLunL0 = NULL;
PCFGMNODE pLunL1 = NULL;
PCFGMNODE pDrv = NULL;
/*
* PC Arch.
*/
rc = CFGMR3InsertNode(pDevices, "pcarch", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
/*
* PC Bios.
*/
rc = CFGMR3InsertNode(pDevices, "pcbios", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "RamHoleSize", 512U * _1M); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "BootDevice0", g_pszBootDevice); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "BootDevice1", "NONE"); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "BootDevice2", "NONE"); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "BootDevice3", "NONE"); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "HardDiskDevice", "piix3ide"); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "FloppyDevice", "i82078"); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOAPIC", g_fIOAPIC); UPDATE_RC();
RTUUID Uuid;
RTUuidClear(&Uuid);
rc = CFGMR3InsertBytes(pCfg, "UUID", &Uuid, sizeof(Uuid)); UPDATE_RC();
/*
* ACPI
*/
if (g_fACPI)
{
rc = CFGMR3InsertNode(pDevices, "acpi", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "RamHoleSize", 512U * _1M); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOAPIC", g_fIOAPIC); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 7); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "ACPIHost"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
}
/*
* PCI bus.
*/
rc = CFGMR3InsertNode(pDevices, "pci", &pDev); /* piix3 */ UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOAPIC", g_fIOAPIC); UPDATE_RC();
/*
* DMA
*/
rc = CFGMR3InsertNode(pDevices, "8237A", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
/*
* PCI bus.
*/
rc = CFGMR3InsertNode(pDevices, "pci", &pDev); /* piix3 */ UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
/*
* PS/2 keyboard & mouse.
*/
rc = CFGMR3InsertNode(pDevices, "pckbd", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "KeyboardQueue"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "QueueSize", 64); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "MainKeyboard"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gKeyboard); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "LUN#1", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "MouseQueue"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "QueueSize", 128); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "MainMouse"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gMouse); UPDATE_RC();
/*
* i82078 Floppy drive controller
*/
rc = CFGMR3InsertNode(pDevices, "i82078", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IRQ", 6); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "DMA", 2); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "MemMapped", 0 ); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOBase", 0x3f0); UPDATE_RC();
/* Attach the status driver */
rc = CFGMR3InsertNode(pInst, "LUN#999", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "MainStatus"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&mapFDLeds[0]); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "First", 0); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Last", 0); UPDATE_RC();
if (g_pszFdaFile)
{
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "Block"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Type", "Floppy 1.44"); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Mountable", 1); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "RawImage"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Path", g_pszFdaFile); UPDATE_RC();
}
/*
* i8254 Programmable Interval Timer And Dummy Speaker
*/
rc = CFGMR3InsertNode(pDevices, "i8254", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
#ifdef DEBUG
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
#endif
/*
* i8259 Programmable Interrupt Controller.
*/
rc = CFGMR3InsertNode(pDevices, "i8259", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
/*
* Advanced Programmable Interrupt Controller.
*/
rc = CFGMR3InsertNode(pDevices, "apic", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOAPIC", g_fIOAPIC); UPDATE_RC();
/*
* I/O Advanced Programmable Interrupt Controller.
*/
if (g_fIOAPIC)
{
rc = CFGMR3InsertNode(pDevices, "ioapic", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
}
/*
* RTC MC146818.
*/
rc = CFGMR3InsertNode(pDevices, "mc146818", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
/*
* Serial ports
*/
rc = CFGMR3InsertNode(pDevices, "serial", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IRQ", 4); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOBase", 0x3f8); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "1", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IRQ", 3); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "IOBase", 0x2f8); UPDATE_RC();
/*
* VGA.
*/
rc = CFGMR3InsertNode(pDevices, "vga", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 2); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "VRamSize", g_u32VRamSize); UPDATE_RC();
/* Default: no bios logo. */
rc = CFGMR3InsertInteger(pCfg, "FadeIn", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "FadeOut", 0); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "LogoTime", 0); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "LogoFile", ""); UPDATE_RC();
/* Boot menu */
rc = CFGMR3InsertInteger(pCfg, "ShowBootMenu", g_iBootMenu); UPDATE_RC();
#ifdef RT_OS_L4
/* XXX hard-coded */
rc = CFGMR3InsertInteger(pCfg, "HeightReduction", 18); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "CustomVideoModes", 1); UPDATE_RC();
char szBuf[64];
/* Tell the guest which is the ideal video mode to use */
RTStrPrintf(szBuf, sizeof(szBuf), "%dx%dx%d",
gFramebuffer->getHostXres(),
gFramebuffer->getHostYres(),
gFramebuffer->getHostBitsPerPixel());
rc = CFGMR3InsertString(pCfg, "CustomVideoMode1", szBuf); UPDATE_RC();
#endif
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "MainDisplay"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gDisplay); UPDATE_RC();
/*
* IDE (update this when the main interface changes)
*/
rc = CFGMR3InsertNode(pDevices, "piix3ide", &pDev); /* piix3 */ UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 1); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
if (g_pszHdaFile)
{
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "Block"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Type", "HardDisk"); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Mountable", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "VD"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Path", g_pszHdaFile); UPDATE_RC();
if (g_fHdaSpf)
{
rc = CFGMR3InsertString(pCfg, "Format", "SPF"); UPDATE_RC();
}
else
{
char *pcExt = RTPathExt(g_pszHdaFile);
if ((pcExt) && (!strcmp(pcExt, ".vdi")))
{
rc = CFGMR3InsertString(pCfg, "Format", "VDI"); UPDATE_RC();
}
else
{
rc = CFGMR3InsertString(pCfg, "Format", "VMDK"); UPDATE_RC();
}
}
}
if (g_pszHdbFile)
{
rc = CFGMR3InsertNode(pInst, "LUN#1", &pLunL1); UPDATE_RC();
rc = CFGMR3InsertString(pLunL1, "Driver", "Block"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL1, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Type", "HardDisk"); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Mountable", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL1, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "VD"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Path", g_pszHdbFile); UPDATE_RC();
if (g_fHdbSpf)
{
rc = CFGMR3InsertString(pCfg, "Format", "SPF"); UPDATE_RC();
}
else
{
char *pcExt = RTPathExt(g_pszHdbFile);
if ((pcExt) && (!strcmp(pcExt, ".vdi")))
{
rc = CFGMR3InsertString(pCfg, "Format", "VDI"); UPDATE_RC();
}
else
{
rc = CFGMR3InsertString(pCfg, "Format", "VMDK"); UPDATE_RC();
}
}
}
if (g_pszCdromFile)
{
// ASSUME: DVD drive is always attached to LUN#2 (i.e. secondary IDE master)
rc = CFGMR3InsertNode(pInst, "LUN#2", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "Block"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Type", "DVD"); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Mountable", 1); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pDrv); UPDATE_RC();
rc = CFGMR3InsertString(pDrv, "Driver", "MediaISO"); UPDATE_RC();
rc = CFGMR3InsertNode(pDrv, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "Path", g_pszCdromFile); UPDATE_RC();
}
/*
* Network adapters
*/
rc = CFGMR3InsertNode(pDevices, "pcnet", &pDev); UPDATE_RC();
for (ULONG ulInstance = 0; ulInstance < NetworkAdapterCount; ulInstance++)
{
if (g_aNetDevs[ulInstance].enmType != BFENETDEV::NOT_CONFIGURED)
{
char szInstance[4];
RTStrPrintf(szInstance, sizeof(szInstance), "%lu", ulInstance);
rc = CFGMR3InsertNode(pDev, szInstance, &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo",
!ulInstance ? 3 : ulInstance - 1 + 8); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertBytes(pCfg, "MAC", &g_aNetDevs[ulInstance].Mac, sizeof(RTMAC));
UPDATE_RC();
/*
* Enable the packet sniffer if requested.
*/
if (g_aNetDevs[ulInstance].fSniff)
{
/* insert the sniffer filter driver. */
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "NetSniffer"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
if (g_aNetDevs[ulInstance].pszSniff)
{
rc = CFGMR3InsertString(pCfg, "File", g_aNetDevs[ulInstance].pszSniff);
UPDATE_RC();
}
}
/*
* Create the driver config (if any).
*/
if (g_aNetDevs[ulInstance].enmType != BFENETDEV::NONE)
{
if (g_aNetDevs[ulInstance].fSniff)
{
rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pLunL0); UPDATE_RC();
}
else
{
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
}
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
}
/*
* Configure the driver.
*/
if (g_aNetDevs[ulInstance].enmType == BFENETDEV::NAT)
{
rc = CFGMR3InsertString(pLunL0, "Driver", "NAT"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
/* (Port forwarding goes here.) */
}
else if (g_aNetDevs[ulInstance].enmType == BFENETDEV::HIF)
{
rc = CFGMR3InsertString(pLunL0, "Driver", "HostInterface"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
#if defined(RT_OS_LINUX)
if (g_aNetDevs[ulInstance].fHaveFd)
{
rc = CFGMR3InsertString(pCfg, "Device", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "FileHandle", g_aNetDevs[ulInstance].fd); UPDATE_RC();
}
else
#endif
{
#if defined(RT_OS_LINUX) || defined(RT_OS_L4)
/*
* Create/Open the TAP the device.
*/
RTFILE tapFD;
rc = RTFileOpen(&tapFD, "/dev/net/tun",
RTFILE_O_READWRITE | RTFILE_O_OPEN |
RTFILE_O_DENY_NONE | RTFILE_O_INHERIT);
if (RT_FAILURE(rc))
{
FatalError("Failed to open /dev/net/tun: %Rrc\n", rc);
return rc;
}
struct ifreq IfReq;
memset(&IfReq, 0, sizeof(IfReq));
if (g_aNetDevs[ulInstance].pszName && g_aNetDevs[ulInstance].pszName[0])
{
size_t cch = strlen(g_aNetDevs[ulInstance].pszName);
if (cch >= sizeof(IfReq.ifr_name))
{
FatalError("HIF name too long for device #%d: %s\n",
ulInstance + 1, g_aNetDevs[ulInstance].pszName);
return VERR_BUFFER_OVERFLOW;
}
memcpy(IfReq.ifr_name, g_aNetDevs[ulInstance].pszName, cch + 1);
}
else
strcpy(IfReq.ifr_name, "tun%d");
IfReq.ifr_flags = IFF_TAP | IFF_NO_PI;
rc = ioctl(tapFD, TUNSETIFF, &IfReq);
if (rc)
{
int rc2 = RTErrConvertFromErrno(errno);
FatalError("ioctl TUNSETIFF '%s' failed: errno=%d rc=%d (%Rrc)\n",
IfReq.ifr_name, errno, rc, rc2);
return rc2;
}
rc = fcntl(tapFD, F_SETFL, O_NONBLOCK);
if (rc)
{
int rc2 = RTErrConvertFromErrno(errno);
FatalError("fcntl F_SETFL/O_NONBLOCK '%s' failed: errno=%d rc=%d (%Rrc)\n",
IfReq.ifr_name, errno, rc, rc2);
return rc2;
}
rc = CFGMR3InsertString(pCfg, "Device", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "FileHandle", (RTFILE)tapFD); UPDATE_RC();
#elif defined(RT_OS_SOLARIS)
rc = CFGMR3InsertString(pCfg, "Device", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
# ifdef VBOX_WITH_CROSSBOW
rc = CFGMR3InsertBytes(pCfg, "MAC", &g_aNetDevs[ulInstance].Mac, sizeof(g_aNetDevs[ulInstance].Mac));
UPDATE_RC();
# endif
#elif defined(RT_OS_OS2)
/*
* The TAP driver does all the opening and setting up,
* as it was originally was meant to be (stupid fork() problems).
*/
rc = CFGMR3InsertString(pCfg, "Device", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
if (g_aNetDevs[ulInstance].fHaveConnectTo)
{
rc = CFGMR3InsertInteger(pCfg, "ConnectTo", g_aNetDevs[ulInstance].iConnectTo);
UPDATE_RC();
}
#elif defined(RT_OS_WINDOWS)
/*
* We need the GUID too here...
*/
rc = CFGMR3InsertString(pCfg, "Device", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "HostInterfaceName", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
rc = CFGMR3InsertString(pCfg, "GUID", g_aNetDevs[ulInstance].pszName /*pszGUID*/); UPDATE_RC();
#else
FatalError("Name based HIF devices not implemented yet for this host platform\n");
return VERR_NOT_IMPLEMENTED;
#endif
}
}
else if (g_aNetDevs[ulInstance].enmType == BFENETDEV::INTNET)
{
/*
* Internal networking.
*/
rc = CFGMR3InsertString(pCfg, "Network", g_aNetDevs[ulInstance].pszName); UPDATE_RC();
}
}
}
/*
* VMM Device
*/
rc = CFGMR3InsertNode(pDevices, "VMMDev", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 4); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
/* the VMM device's Main driver */
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "HGCM"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gVMMDev); UPDATE_RC();
/*
* AC'97 ICH audio
*/
if (g_fAudio)
{
rc = CFGMR3InsertNode(pDevices, "ichac97", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 5); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg);
/* the Audio driver */
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "AUDIO"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
#ifdef RT_OS_WINDOWS
rc = CFGMR3InsertString(pCfg, "AudioDriver", "winmm"); UPDATE_RC();
#elif defined(RT_OS_DARWIN)
rc = CFGMR3InsertString(pCfg, "AudioDriver", "coreaudio"); UPDATE_RC();
#elif defined(RT_OS_LINUX)
rc = CFGMR3InsertString(pCfg, "AudioDriver", "oss"); UPDATE_RC();
#elif defined(RT_OS_SOLARIS)
# ifdef VBOX_WITH_SOLARIS_OSS
rc = CFGMR3InsertString(pCfg, "AudioDriver", "oss"); UPDATE_RC();
# else
rc = CFGMR3InsertString(pCfg, "AudioDriver", "solaudio"); UPDATE_RC();
# endif
#elif defined(RT_OS_L4)
rc = CFGMR3InsertString(pCfg, "AudioDriver", "oss"); UPDATE_RC();
#else /* portme */
rc = CFGMR3InsertString(pCfg, "AudioDriver", "none"); UPDATE_RC();
#endif /* !RT_OS_WINDOWS */
}
#ifdef VBOXBFE_WITH_USB
/*
* The USB Controller.
*/
if (g_fUSB)
{
rc = CFGMR3InsertNode(pDevices, "usb-ohci", &pDev); UPDATE_RC();
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 6); UPDATE_RC();
rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
rc = CFGMR3InsertString(pLunL0, "Driver", "VUSBRootHub"); UPDATE_RC();
rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
}
#endif /* VBOXBFE_WITH_USB */
#undef UPDATE_RC
#undef UPDATE_RC
VMR3AtRuntimeErrorRegister (pVM, setVMRuntimeErrorCallback, NULL);
return rc;
}