ConsoleImpl2.cpp revision 24a0cc1776a88752cc25446a98e2a3881e623216
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * VBox Console COM Class implementation
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @remark We've split out the code that the 64-bit VC++ v8 compiler finds
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * problematic to optimize so we can disable optimizations and later,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * perhaps, find a real solution for it (like rewriting the code and
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * to stop resemble a tonne of spaghetti).
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Copyright (C) 2006-2010 Oracle Corporation
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * available from http://www.virtualbox.org. This file is free software;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * General Public License (GPL) as published by the Free Software
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync/*******************************************************************************
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync* Header Files *
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync*******************************************************************************/
e99772f9bf09219c532812c859fbeea513c67e65vboxsync// for some reason Windows burns in sdk\...\winsock.h if this isn't included first
e99772f9bf09219c532812c859fbeea513c67e65vboxsync// generated header
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#if 0 /* enable to play with lots of memory. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#include <VBox/pdmapi.h> /* For PDMR3DriverAttach/PDMR3DriverDetach */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync# include <hgcm/HGCM.h> /** @todo it should be possible to register a service
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * extension using a VMMDev callback. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#endif /* VBOX_WITH_GUEST_PROPS */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#endif /* VBOX_WITH_NETFLT */
e99772f9bf09219c532812c859fbeea513c67e65vboxsyncstatic int DarwinSmcKey(char *pabKey, uint32_t cbKey)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Method as described in Amit Singh's article:
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * http://osxbook.com/book/bonus/chapter7/tpmdrmmyth/
e99772f9bf09219c532812c859fbeea513c67e65vboxsync typedef struct
e99772f9bf09219c532812c859fbeea513c67e65vboxsync io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync AppleSMCBuffer inputStruct = { 0, {0}, 32, {0}, 5, };
e99772f9bf09219c532812c859fbeea513c67e65vboxsync for (int i = 0; i < 2; i++)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync inputStruct.key = (uint32_t)((i == 0) ? 'OSK0' : 'OSK1');
e99772f9bf09219c532812c859fbeea513c67e65vboxsync (const void *)&inputStruct,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync for (int j = 0; j < 32; j++)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#endif /* RT_OS_DARWIN */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync/* Darwin compile cludge */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync/* Comment out the following line to remove VMWare compatibility hack. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Translate IDE StorageControllerType_T to string representation.
e99772f9bf09219c532812c859fbeea513c67e65vboxsyncconst char* controllerString(StorageControllerType_T enmType)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync return "PIIX3";
e99772f9bf09219c532812c859fbeea513c67e65vboxsync return "PIIX4";
e99772f9bf09219c532812c859fbeea513c67e65vboxsync return "ICH6";
e99772f9bf09219c532812c859fbeea513c67e65vboxsync return "Unknown";
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Simple class for storing network boot information.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync ULONG lval = mBootPrio - 1; /* 0 will wrap around and get the lowest priority. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync return lval < rval; /* Zero compares as highest number (lowest prio). */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * VC++ 8 / amd64 has some serious trouble with this function.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * As a temporary measure, we'll drop global optimizations.
e99772f9bf09219c532812c859fbeea513c67e65vboxsyncstatic int findEfiRom(IVirtualBox* vbox, FirmwareType_T aFirmwareType, Utf8Str& aEfiRomFile)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync rc = vbox->CheckFirmwarePresent(aFirmwareType, empty,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync empty.asOutParam(), aFilePath.asOutParam(), &fPresent);
e99772f9bf09219c532812c859fbeea513c67e65vboxsyncstatic int getSmcDeviceKey(IMachine *pMachine, BSTR *aKey, bool *pfGetKeyFromRealSMC)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * The extra data takes precedence (if non-zero).
e99772f9bf09219c532812c859fbeea513c67e65vboxsync HRESULT hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/SmcDeviceKey"), aKey);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Query it here and now.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync LogRel(("Warning: DarwinSmcKey failed with rc=%Rrc!\n", rc));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Is it apple hardware in bootcamp?
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /** @todo implement + test RTSYSDMISTR_MANUFACTURER on all hosts.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Currently falling back on the product name. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync RTSystemQueryDmiString(RTSYSDMISTR_MANUFACTURER, szManufacturer, sizeof(szManufacturer));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync if ( !strcmp(szManufacturer, "Apple Computer, Inc.")
e99772f9bf09219c532812c859fbeea513c67e65vboxsync RTSystemQueryDmiString(RTSYSDMISTR_PRODUCT_NAME, szProdName, sizeof(szProdName));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync && RT_C_IS_DIGIT(szProdName[strlen(szProdName) - 1]) /* version number */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync : iprt::Error(Utf8StrFmt("%s failed: rc=%Rrc, pcszName=%s", pcszFunction, vrc, pcszName)),
e99772f9bf09219c532812c859fbeea513c67e65vboxsync AssertMsgFailed(("%s\n", what())); // in strict mode, hit a breakpoint here
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Helper that calls CFGMR3InsertString and throws an iprt::Error if that
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * fails (C-string variant).
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pParent See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pcszNodeName See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pcszValue The string value.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync const char *pcszName,
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync throw ConfigError("CFGMR3InsertString", vrc, pcszName);
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * Helper that calls CFGMR3InsertString and throws an iprt::Error if that
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * fails (Utf8Str variant).
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pParent See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pcszNodeName See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param rStrValue The string value.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync const char *pcszName,
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync throw ConfigError("CFGMR3InsertStringLengthKnown", vrc, pcszName);
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * Helper that calls CFGMR3InsertString and throws an iprt::Error if that
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * fails (Bstr variant).
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pParent See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param pcszNodeName See CFGMR3InsertStringN.
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync * @param rBstrValue The string value.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pNode, pcszName, Utf8Str(rBstrValue));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Helper that calls CFGMR3InsertBytes and throws an iprt::Error if that fails.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pNode See CFGMR3InsertBytes.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pcszName See CFGMR3InsertBytes.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pvBytes See CFGMR3InsertBytes.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param cbBytes See CFGMR3InsertBytes.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const void *pvBytes,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync throw ConfigError("CFGMR3InsertBytes", vrc, pcszName);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Helper that calls CFGMR3InsertInteger and thows an iprt::Error if that
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pNode See CFGMR3InsertInteger.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pcszName See CFGMR3InsertInteger.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param u64Integer See CFGMR3InsertInteger.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync throw ConfigError("CFGMR3InsertInteger", vrc, pcszName);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Helper that calls CFGMR3InsertNode and throws an iprt::Error if that fails.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pNode See CFGMR3InsertNode.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pcszName See CFGMR3InsertNode.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param ppChild See CFGMR3InsertNode.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync int vrc = CFGMR3InsertNode(pNode, pcszName, ppChild);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync throw ConfigError("CFGMR3InsertNode", vrc, pcszName);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Helper that calls CFGMR3RemoveValue and throws an iprt::Error if that fails.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pNode See CFGMR3RemoveValue.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pcszName See CFGMR3RemoveValue.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync const char *pcszName)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync throw ConfigError("CFGMR3RemoveValue", vrc, pcszName);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Construct the VM configuration tree (CFGM).
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * This is a callback for VMR3Create() call. It is called from CFGMR3Init()
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * in the emulation thread (EMT). Any per thread COM/XPCOM initialization
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * is done here.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pVM VM handle.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @param pvConsole Pointer to the VMPowerUpTask object.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @return VBox status code.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * @note Locks the Console object for writing.
e99772f9bf09219c532812c859fbeea513c67e65vboxsyncDECLCALLBACK(int) Console::configConstructor(PVM pVM, void *pvConsole)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Note: hardcoded assumption about number of slots; see rom bios */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync bool fFdcEnabled = false;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* initialize COM */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync LogFlow(("Console::configConstructor(): CoInitializeEx()=%08X\n", hrc));
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync ComObjPtr<Console> pConsole = static_cast<Console *>(pvConsole);
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync AssertComRCReturn(autoCaller.rc(), VERR_ACCESS_DENIED);
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync /* lock the console because we widely use internal fields and methods */
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync AutoWriteLock alock(pConsole COMMA_LOCKVAL_SRC_POS);
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync /* Save the VM pointer in the machine object */
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync#define H() AssertMsgReturn(!FAILED(hrc), ("hrc=%Rhrc\n", hrc), VERR_GENERAL_FAILURE)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Get necessary objects and frequently used parameters.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(Parent)(virtualBox.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = virtualBox->COMGETTER(Host)(host.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(BIOSSettings)(biosSettings.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(HardwareUUID)(bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync AssertMsgReturn(RT_SUCCESS(rc), ("rc=%Rrc\n", rc), rc);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(MemorySize)(&cRamMBs); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#if 0 /* enable to play with lots of memory. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync cRamMBs = RTStrToUInt64(RTEnvGet("VBOX_RAM_SIZE"));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync uint32_t const cbRamHole = MM_RAM_HOLE_SIZE_DEFAULT;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(OSTypeId)(osTypeId.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = biosSettings->COMGETTER(IOAPICEnabled)(&fIOAPIC); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = virtualBox->GetGuestOSType(osTypeId, guestOSType.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = guestOSType->COMGETTER(FamilyId)(guestTypeFamilyId.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync BOOL fOsXGuest = guestTypeFamilyId == Bstr("MacOS");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Get root node first.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * This is the only node in the tree.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync // InsertConfigString throws
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Set the root (and VMM) level values.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(Name)(bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigBytes(pRoot, "UUID", &HardwareUuid, sizeof(HardwareUuid));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "RamHoleSize", cbRamHole);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "RawR3Enabled", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "RawR0Enabled", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /** @todo Config: RawR0, PATMEnabled and CSAMEnabled needs attention later. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "PATMEnabled", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "CSAMEnabled", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Not necessary, but to make sure these two settings end up in the release log. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(PageFusionEnabled)(&fPageFusion); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "PageFusion", fPageFusion); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(MemoryBalloonSize)(&ulBalloonSize); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "MemBalloonSize", ulBalloonSize);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * CPUM values.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* cpuid leaf overrides. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_auCpuIdRanges); i += 2)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync for (uint32_t uLeaf = s_auCpuIdRanges[i]; uLeaf < s_auCpuIdRanges[i + 1]; uLeaf++)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetCPUIDLeaf(uLeaf, &ulEax, &ulEbx, &ulEcx, &ulEdx);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigNode(pCPUM, Utf8StrFmt("HostCPUID/%RX32", uLeaf).c_str(), &pLeaf);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* We must limit CPUID count for Windows NT 4, as otherwise it stops
e99772f9bf09219c532812c859fbeea513c67e65vboxsync with error 0x3e (MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED). */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync LogRel(("Limiting CPUID leaf count for NT4 guests\n"));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Expose extended MWAIT features to Mac OS X guests. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCPUM, "MWaitExtensions", true);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Hardware virtualization extensions.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_Enabled, &fHWVirtExEnabled); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync if (cCpus > 1) /** @todo SMP: This isn't nice, but things won't work on mac otherwise. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* - With more than 4GB PGM will use different RAMRANGE sizes for raw
e99772f9bf09219c532812c859fbeea513c67e65vboxsync mode and hv mode to optimize lookup times.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync - With more than one virtual CPU, raw-mode isn't a fallback option. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#else /* !VBOX_WITH_RAW_MODE */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#endif /* !VBOX_WITH_RAW_MODE */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pRoot, "HwVirtExtForced", fHwVirtExtForced);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Indicate whether 64-bit guests are supported or not. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /** @todo This is currently only forced off on 32-bit hosts only because it
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * makes a lof of difference there (REM and Solaris performance).
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = host->GetProcessorFeature(ProcessorFeature_LongMode,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = guestOSType->COMGETTER(Is64Bit)(&fIs64BitGuest); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pHWVirtExt, "64bitEnabled", 1);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#if ARCH_BITS == 32 /* The recompiler must use VBoxREM64 (32-bit host only). */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pHWVirtExt, "64bitEnabled", 0);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /** @todo Not exactly pretty to check strings; VBOXOSTYPE would be better, but that requires quite a bit of API change in Main. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Only allow TPR patching for NT, Win2k, XP and Windows Server 2003. (32 bits mode)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * We may want to consider adding more guest OSes (Solaris) later on.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pHWVirtExt, "TPRPatchingEnabled", 1);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* HWVirtEx exclusive mode */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_Exclusive, &fHWVirtExExclusive); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pHWVirtExt, "Exclusive", fHWVirtExExclusive);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Nested paging (VT-x/AMD-V) */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_NestedPaging, &fEnableNestedPaging); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pHWVirtExt, "EnableNestedPaging", fEnableNestedPaging);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Large pages; requires nested paging */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_LargePages, &fEnableLargePages); H();
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync InsertConfigInteger(pHWVirtExt, "EnableLargePages", fEnableLargePages);
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync /* VPID (VT-x) */
b20cc298c1a3191a4e6ce780c19313117902675dvboxsync hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_VPID, &fEnableVPID); H();
768888227f95954ce8676ae279645fae10e24ba2vboxsync InsertConfigInteger(pHWVirtExt, "EnableVPID", fEnableVPID);
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync /* Physical Address Extension (PAE) */
768888227f95954ce8676ae279645fae10e24ba2vboxsync hrc = pMachine->GetCPUProperty(CPUPropertyType_PAE, &fEnablePAE); H();
768888227f95954ce8676ae279645fae10e24ba2vboxsync InsertConfigInteger(pRoot, "EnablePAE", fEnablePAE);
768888227f95954ce8676ae279645fae10e24ba2vboxsync /* Synthetic CPU */
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync hrc = pMachine->GetCPUProperty(CPUPropertyType_Synthetic, &fSyntheticCpu); H();
62b88df0b51ed81807d485b371b90aff7dfd7beevboxsync InsertConfigInteger(pRoot, "SyntheticCpu", fSyntheticCpu);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = biosSettings->COMGETTER(PXEDebugEnabled)(&fPXEDebug); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync * PDM config.
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync * Load drivers in VBoxC.[so|dll]
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync // VBoxC is located in the components subdirectory
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rc = RTPathAppPrivateArch(szPathVBoxC, RTPATH_MAX - sizeof("/components/VBoxC")); AssertRC(rc);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * I/O settings (cach, max bandwidth, ...).
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigNode(pPDM, "AsyncCompletion", &pPDMAc);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /* Builtin I/O cache */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync hrc = pMachine->COMGETTER(IoCacheEnabled)(&fIoCache); H();
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigInteger(pPDMAcFile, "CacheEnabled", fIoCache);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /* I/O cache size */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync hrc = pMachine->COMGETTER(IoCacheSize)(&ioCacheSize); H();
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigInteger(pPDMAcFile, "CacheSize", ioCacheSize * _1M);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /* Maximum I/O bandwidth */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync hrc = pMachine->COMGETTER(IoBandwidthMax)(&ioBandwidthMax); H();
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigInteger(pPDMAcFile, "VMTransferPerSecMax", ioBandwidthMax * _1M);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pCfg = NULL; /* /Devices/Dev/.../Config/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pLunL0 = NULL; /* /Devices/Dev/0/LUN#0/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pLunL1 = NULL; /* /Devices/Dev/0/LUN#0/AttachedDriver/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pLunL2 = NULL; /* /Devices/Dev/0/LUN#0/AttachedDriver/Config/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pBiosCfg = NULL; /* /Devices/pcbios/0/Config/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PCFGMNODE pNetBootCfg = NULL; /* /Devices/pcbios/0/Config/NetBoot/ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * The time offset
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync hrc = biosSettings->COMGETTER(TimeOffset)(&timeOffset); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pTMNode, "UTCOffset", timeOffset * 1000000);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * PCI buses.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigNode(pDevices, "pci", &pDev); /* piix3 */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync#if 0 /* enable this to test PCI bridging */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync rc = CFGMR3InsertInteger(pInst, "PCIBusNo", 0);/* -> pci[0] */ RC_CHECK();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync rc = CFGMR3InsertInteger(pInst, "PCIBusNo", 1);/* ->pcibridge[0] */ RC_CHECK();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync rc = CFGMR3InsertInteger(pInst, "PCIBusNo", 1);/* ->pcibridge[0] */ RC_CHECK();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Enable 3 following devices: HPET, SMC, LPC on MacOS X guests
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * High Precision Event Timer (HPET)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Other guests may wish to use HPET too, but MacOS X not functional without it */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(HpetEnabled)(&fHpetEnabled); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* so always enable HPET in extended profile */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * System Management Controller (SMC)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync rc = getSmcDeviceKey(pMachine, bstrKey.asOutParam(), &fGetKeyFromRealSMC);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync AssertMsgReturn(RT_SUCCESS(rc), ("rc=%Rrc\n", rc), rc);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "GetKeyFromRealSMC", fGetKeyFromRealSMC);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Low Pin Count (LPC) bus
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /** @todo: implement appropriate getter */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * PS/2 keyboard & mouse.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pLunL0, "Driver", "KeyboardQueue");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pLunL1, "Driver", "MainKeyboard");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "Object", (uintptr_t)pKeyboard);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pLunL0, "Driver", "MouseQueue");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * i8254 Programmable Interval Timer And Dummy Speaker
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * i8259 Programmable Interrupt Controller.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Advanced Programmable Interrupt Controller.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * SMP: Each CPU has a LAPIC, but we have a single device representing all LAPICs states,
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * thus only single insert
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * I/O Advanced Programmable Interrupt Controller.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * RTC MC146818.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(RTCUseUTC)(&fRTCUseUTC); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "UseUTC", fRTCUseUTC ? 1 : 0);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(VRAMSize)(&cVRamMBs); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "VRamSize", cVRamMBs * _1M);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->COMGETTER(MonitorCount)(&cMonitorCount); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "MonitorCount", cMonitorCount);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "R0Enabled", fHWVirtExEnabled);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * BIOS logo
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = biosSettings->COMGETTER(LogoFadeIn)(&fFadeIn); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "FadeIn", fFadeIn ? 1 : 0);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = biosSettings->COMGETTER(LogoFadeOut)(&fFadeOut); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "FadeOut", fFadeOut ? 1: 0);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = biosSettings->COMGETTER(LogoDisplayTime)(&logoDisplayTime); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "LogoTime", logoDisplayTime);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = biosSettings->COMGETTER(LogoImagePath)(logoImagePath.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pCfg, "LogoFile", Utf8Str(logoImagePath ? logoImagePath : "") );
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Boot menu
e99772f9bf09219c532812c859fbeea513c67e65vboxsync biosSettings->COMGETTER(BootMenuMode)(&eBootMenuMode);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync case BIOSBootMenuMode_Disabled: iShowBootMenu = 0; break;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync case BIOSBootMenuMode_MenuOnly: iShowBootMenu = 1; break;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "ShowBootMenu", iShowBootMenu);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Custom VESA mode list */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync unsigned cModes = 0;
e99772f9bf09219c532812c859fbeea513c67e65vboxsync RTStrPrintf(szExtraDataKey, sizeof(szExtraDataKey), "CustomVideoMode%u", iMode);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetExtraData(Bstr(szExtraDataKey), bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "CustomVideoModes", cModes);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* VESA height reduction */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync IFramebuffer *pFramebuffer = pConsole->getDisplay()->getFramebuffer();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pFramebuffer->COMGETTER(HeightReduction)(&ulHeightReduction); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* If framebuffer is not available, there is no height reduction. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "HeightReduction", ulHeightReduction);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* Attach the display. */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pLunL0, "Driver", "MainDisplay");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "Object", (uintptr_t)pDisplay);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * Firmware.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync hrc = pMachine->COMGETTER(FirmwareType)(&eFwType); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync BOOL fEfiEnabled = (eFwType >= FirmwareType_EFI) && (eFwType <= FirmwareType_EFIDUAL);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pBiosCfg, "RamHoleSize", cbRamHole);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pBiosCfg, "HardDiskDevice", "piix3ide");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pBiosCfg, "FloppyDevice", "i82078");
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pBiosCfg, "PXEDebug", fPXEDebug);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigBytes(pBiosCfg, "UUID", &HardwareUuid,sizeof(HardwareUuid));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigNode(pBiosCfg, "NetBoot", &pNetBootCfg);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync for (ULONG pos = 1; pos <= SchemaDefs::MaxBootPosition; ++pos)
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetBootOrder(pos, &bootDevice); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync szParamName[sizeof(szParamName) - 2] = ((char (pos - 1)) + '0');
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync AssertMsgFailed(("Invalid bootDevice=%d\n", bootDevice));
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync return VMSetError(pVM, VERR_INVALID_PARAMETER, RT_SRC_POS,
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigString(pBiosCfg, szParamName, pszBootDevice);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Autodetect firmware type, basing on guest type */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync AssertMsgReturn(RT_SUCCESS(rc), ("rc=%Rrc\n", rc), rc);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Get boot args */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiBootArgs"), bootArgs.asOutParam()); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Get device props */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiDeviceProps"), deviceProps.asOutParam()); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Get GOP mode settings */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiGopMode"), bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* UGA mode settings */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiUgaHorizontalResolution"), bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiUgaVerticalResolution"), bstr.asOutParam()); H();
e99772f9bf09219c532812c859fbeea513c67e65vboxsync * EFI subtree.
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "RamHoleSize", cbRamHole);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigString(pCfg, "DeviceProps", deviceProps);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigBytes(pCfg, "UUID", &HardwareUuid,sizeof(HardwareUuid));
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "64BitEntry", f64BitEntry); /* boolean */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "UgaHorizontalResolution", u32UgaHorisontal);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "UgaVerticalResolution", u32UgaVertical);
e99772f9bf09219c532812c859fbeea513c67e65vboxsync /* For OS X guests we'll force passing host's DMI info to the guest */
e99772f9bf09219c532812c859fbeea513c67e65vboxsync InsertConfigInteger(pCfg, "DmiExposeMemoryTable", 1);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync * Storage controllers.
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync PCFGMNODE aCtrlNodes[StorageControllerType_LsiLogicSas + 1] = {};
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = pMachine->COMGETTER(StorageControllers)(ComSafeArrayAsOutParam(ctrls)); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync rc = ctrls[i]->COMGETTER(ControllerType)(&enmCtrlType); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync AssertRelease((unsigned)enmCtrlType < RT_ELEMENTS(aCtrlNodes));
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync rc = ctrls[i]->COMGETTER(Name)(controllerName.asOutParam()); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync rc = ctrls[i]->COMGETTER(Instance)(&ulInstance); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync rc = ctrls[i]->COMGETTER(UseHostIOCache)(&fUseHostIOCache); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* /Devices/<ctrldev>/ */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync const char *pszCtrlDev = pConsole->convertControllerTypeToDev(enmCtrlType);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync aCtrlNodes[enmCtrlType] = pDev; /* IDE variants are handled in the switch */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* /Devices/<ctrldev>/<instance>/ */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigNode(pDev, Utf8StrFmt("%u", ulInstance).c_str(), &pCtlInst);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Device config: /Devices/<ctrldev>/<instance>/<values> & /ditto/Config/<values> */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Attach the status driver */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigString(pLunL0, "Driver", "MainStatus");
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedScsi]);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync paLedDevType = &pConsole->maStorageDevType[iLedScsi];
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Attach the status driver */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigString(pLunL0, "Driver", "MainStatus");
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedScsi]);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync paLedDevType = &pConsole->maStorageDevType[iLedScsi];
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = ctrls[i]->COMGETTER(PortCount)(&cPorts); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Needed configuration values for the bios. */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigString(pBiosCfg, "SataHardDiskDevice", "ahci");
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync { "PrimaryMaster", "PrimarySlave", "SecondaryMaster", "SecondarySlave" };
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync { "SataPrimaryMasterLUN", "SataPrimarySlaveLUN", "SataSecondaryMasterLUN", "SataSecondarySlaveLUN" };
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync hrc = ctrls[i]->GetIDEEmulationPort(j, &lPortNumber); H();
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigInteger(pCfg, s_apszConfig[j], lPortNumber);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigInteger(pBiosCfg, s_apszBiosConfig[j], lPortNumber);
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync /* Attach the status driver */
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigString(pLunL0, "Driver", "MainStatus");
b07b4216b07447c916723417ee9b44f69c2fc11fvboxsync InsertConfigInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedSata]);
fFdcEnabled = true;
AssertMsgFailedReturn(("invalid storage controller type: %d\n", enmCtrlType), VERR_GENERAL_FAILURE);
atts[j],
pVM,
return rc;
#ifdef VMWARE_NET_IN_SLOT_11
bool fSwapSlots3and11 = false;
#ifdef VBOX_WITH_E1000
#ifdef VBOX_WITH_VIRTIO
if (!fEnabled)
switch (adapterType)
#ifdef VBOX_WITH_E1000
#ifdef VBOX_WITH_VIRTIO
if (ulInstance)
#ifdef VMWARE_NET_IN_SLOT_11
fSwapSlots3and11 = true;
switch (adapterType)
pCfg,
return rc;
unsigned uBootIdx = 0;
if (serialPort)
if (!fEnabled)
if (parallelPort)
if (!fEnabled)
if (audioAdapter)
if (enabled)
switch (audioController)
case AudioControllerType_AC97:
case AudioControllerType_SB16:
case AudioControllerType_HDA:
switch (audioDriver)
case AudioDriverType_Null:
#ifdef RT_OS_WINDOWS
#ifdef VBOX_WITH_WINMM
case AudioDriverType_WinMM:
#ifdef RT_OS_SOLARIS
case AudioDriverType_SolAudio:
#ifdef RT_OS_LINUX
# ifdef VBOX_WITH_ALSA
case AudioDriverType_ALSA:
# ifdef VBOX_WITH_PULSE
case AudioDriverType_Pulse:
case AudioDriverType_OSS:
#ifdef RT_OS_FREEBSD
# ifdef VBOX_WITH_PULSE
case AudioDriverType_Pulse:
#ifdef RT_OS_DARWIN
if (USBCtlPtr)
if (fOhciEnabled)
#ifdef VBOX_WITH_EHCI
if (fEhciEnabled)
#ifdef VBOX_WITH_USB
// VBoxManage setextradata "myvm" "VBoxInternal/USB/USBProxy/GlobalConfig/Force11PacketSize" 1
switch (mode)
case ClipboardMode_Disabled:
pConsole->mVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm);
#ifdef VBOX_WITH_CROGL
if (fEnabled)
#ifdef VBOX_WITH_GUEST_PROPS
#ifdef VBOX_WITH_GUEST_CONTROL
if (fACPI)
fShowCpu = true;
if (fCpuHotPlug)
if (fCpuAttached)
if (pszCFGMValueName)
if (pNode)
AssertLogRelMsgRC(rc, ("failed to insert CFGM value '%s' to key '%s'\n", strCFGMValueUtf8.c_str(), pszExtraDataKey));
catch (ConfigError &x)
return x.m_vrc;
#undef H
return rc;
void Console::setVMRuntimeErrorCallbackF(PVM pVM, void *pvConsole, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
const char *pcszDevice,
unsigned uInstance,
bool fUseHostIOCache,
bool fSetupMerge,
unsigned uMergeSource,
unsigned uMergeTarget,
bool fAttachDetach,
bool fForceUnmount,
unsigned uLUN;
if (pLunL0)
if (fAttachDetach)
#ifdef RT_OS_WINDOWS
const char *pszUnit;
&& maxSize > 0
const char *pszUnitSiz;
const char *pszUnitMax;
const char *pszUnit;
#ifdef RT_OS_WINDOWS
mfSnapshotFolderSizeWarningShown = true;
#ifdef RT_OS_LINUX
&& !fUseHostIOCache
fUseHostIOCache = true;
&& !fUseHostIOCache
fUseHostIOCache = true;
mfSnapshotFolderExt4WarningShown = true;
!!fPassthrough,
phrc);
return rc;
if (fAttachDetach)
if (paLedDevType)
catch (ConfigError &x)
return x.m_vrc;
#undef H
return VINF_SUCCESS;;
bool fPassthrough,
bool fUseHostIOCache,
bool fSetupMerge,
unsigned uMergeSource,
unsigned uMergeTarget,
#define H() AssertMsgReturnStmt(!FAILED(hrc), ("hrc=%Rhrc\n", hrc), if (phrc) *phrc = hrc, VERR_GENERAL_FAILURE)
if (pMedium)
if (fHostDrive)
switch (enmType)
case DeviceType_DVD:
case DeviceType_Floppy:
case DeviceType_HardDisk:
if ( pMedium
"The image file '%ls' is inaccessible and is being ignored. Please select a different image file for the virtual %s drive.",
if (pMedium)
unsigned uImage = 0;
while (pTmp)
uImage++;
uImage--;
if (!fUseHostIOCache)
if (fSetupMerge)
bool fHostIP = true;
fHostIP = false;
uImage--;
if (!pMedium)
if (fSetupMerge)
fHostIP = false;
if (!fHostIP)
catch (ConfigError &x)
return x.m_vrc;
#undef H
return VINF_SUCCESS;
unsigned uInstance,
unsigned uLun,
bool fAttachDetach)
if (pLunAD)
switch (eAttachmentType)
if (fSniffer)
InsertConfigString(pCfg, "TFTPPrefix", Utf8StrFmt("%ls%c%s", bstr.raw(), RTPATH_DELIMITER, "TFTP"));
if (mtu)
if (sockRcv)
if (sockSnd)
if (tcpRcv)
if (tcpSnd)
bool fValid = true;
switch (proto)
case NATProtocol_UDP:
case NATProtocol_TCP:
fValid = false;
if (!fValid)
if (port)
if (port)
switch (hrc)
case VERR_ACCESS_DENIED:
if (fSniffer)
if (fSniffer)
# if defined(RT_OS_DARWIN)
if (!pszColon)
if (pszSpace)
if (pszColon)
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: FindByName failed, rc=%Rhrc (0x%x)", hrc, hrc));
&pNc,
&pszApp);
hrc = VBoxNetCfgWinGetComponentByGuid(pNc, &GUID_DEVCLASS_NET, (GUID*)hostIFGuid.ptr(), pAdaptorComponent.asOutParam());
wchar_t * pswzBindName;
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: WideCharToMultiByte failed, hr=%Rhrc (0x%x) err=%u\n", hrc, hrc, err));
AssertFailed();
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: VBoxNetCfgWinGetComponentByGuid failed, hrc (0x%x)", hrc));
/* we're not releasing the INetCfg stuff here since we use it later to figure out whether it is wireless */
# if defined(RT_OS_FREEBSD)
switch (hrc)
case VERR_ACCESS_DENIED:
"permissions of that node, and that the net.link.tap.user_open "
if (iSock >= 0)
setVMRuntimeErrorCallbackF(pVM, this, 0, "BridgedInterfaceDown", "Bridged interface %s is down. Guest will not be able to use this interface", pszHifName);
# if defined(RT_OS_DARWIN)
/** @todo Come up with a better deal here. Problem is that IHostNetworkInterface is completely useless here. */
if (iSock >= 0)
if (fSharedMacOnWire)
if (iSock >= 0)
if (fSharedMacOnWire)
NULL,
NULL);
bool fSharedMacOnWire = false;
&Oid,
sizeof(Oid),
&PhMedium,
sizeof(PhMedium),
&cbResult,
NULL))
fSharedMacOnWire = true;
Assert(winEr == ERROR_INVALID_PARAMETER || winEr == ERROR_NOT_SUPPORTED || winEr == ERROR_BAD_COMMAND);
if (fSharedMacOnWire)
AssertLogRelMsgFailed(("Console::configConstructor: CreateFile failed, err (0x%x), ignoring\n", winEr));
# if defined(RT_OS_SOLARIS)
if (fSniffer)
if (fSniffer)
#if defined(RT_OS_WINDOWS)
# ifndef VBOX_WITH_NETFLT
&pNc,
&pszApp);
hrc = VBoxNetCfgWinGetComponentByGuid(pNc, &GUID_DEVCLASS_NET, (GUID*)hostIFGuid.ptr(), pAdaptorComponent.asOutParam());
LogRel(("NetworkAttachmentType_HostOnly: VBoxNetCfgWinGetComponentByGuid failed, hrc=%Rhrc (0x%x)\n", hrc, hrc));
wchar_t * pswzBindName;
AssertLogRelMsgFailed(("NetworkAttachmentType_HostOnly: WideCharToMultiByte failed, hr=%Rhrc (0x%x) err=%u\n", hrc, hrc, err));
AssertFailed();
AssertLogRelMsgFailed(("NetworkAttachmentType_HostOnly: VBoxNetCfgWinGetComponentByGuid failed, hrc=%Rhrc (0x%x)\n", hrc, hrc));
/* Grab the IP number from the 'vboxnetX' instance number (see netif.h) */
hrc = virtualBox->GetExtraData(BstrFmt("HostOnly/%s/IPV6Address", pszHifName), tmpAddr.asOutParam());
hrc = virtualBox->GetExtraData(BstrFmt("HostOnly/%s/IPV6NetMask", pszHifName), tmpMask.asOutParam());
#if defined(VBOX_WITH_VDE)
switch (eAttachmentType)
#if defined(VBOX_WITH_VDE)
if (fAttachDetach)
if (fEnabled)
catch (ConfigError &x)
return x.m_vrc;
#undef H
return VINF_SUCCESS;
#ifdef VBOX_WITH_GUEST_PROPS
void *names,
void *values,
void *timestamps,
void *flags)
&parms[0]);
&parms[0]);
&paParm);
return rc;
#ifdef VBOX_WITH_GUEST_PROPS
if (valuesOut[i])
if (flagsOut[i])
(void *)papszNames,
(void *)papszValues,
(void *)pau64Timestamps,
(void *)papszFlags);
for (unsigned i = 0; i < cProps; ++i)
if (valuesOut[i])
if (flagsOut[i])
return VINF_SUCCESS;
return VERR_NOT_SUPPORTED;
#ifdef VBOX_WITH_GUEST_CONTROL
return rc;
return VERR_NOT_SUPPORTED;