VMMR0.cpp revision 293f7221f6f43c3c53c52b3d2788f7d196bb383c
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VMM - Host Context Ring 0.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * available from http://www.virtualbox.org. This file is free software;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * General Public License (GPL) as published by the Free Software
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * additional information or have any questions.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/*******************************************************************************
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync* Header Files *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync*******************************************************************************/
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#if defined(_MSC_VER) && defined(RT_ARCH_AMD64) /** @todo check this with with VC7! */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/*******************************************************************************
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync* Internal Functions *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync*******************************************************************************/
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/*******************************************************************************
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync* Global Variables *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync*******************************************************************************/
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/** Pointer to the internal networking service instance. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initialize the module.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * This is called when we're first loaded.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns 0 on success.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns VBox status on failure.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initialize the GVMM, GMM, HWACCM, PGM (Darwin) and INTNET.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlow(("ModuleInit: g_pIntNet=%p\n", g_pIntNet));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlow(("ModuleInit: g_pIntNet=%p should be NULL now...\n", g_pIntNet));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlow(("ModuleInit: returns success. g_pIntNet=%p\n", g_pIntNet));
54d3b0107d9bf326fe6e0de92e012c791dbb1587vboxsync /* bail out */
9e293277b378073ce86910209a246b744b4caa2cvboxsync * Terminate the module.
9e293277b378073ce86910209a246b744b4caa2cvboxsync * This is called when we're finally unloaded.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Destroy the internal networking instance.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * PGM (Darwin) and HWACCM global cleanup.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Destroy the GMM and GVMM instances.
9e293277b378073ce86910209a246b744b4caa2cvboxsync * Initaties the R0 driver for a particular VM instance.
9e293277b378073ce86910209a246b744b4caa2cvboxsync * @returns VBox status code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM instance in question.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param uSvnRev The SVN revision of the ring-3 part.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @thread EMT.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Match the SVN revisions.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Register the EMT R0 logger instance.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#if 0 /* testing of the logger. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: before %p\n", RTLogDefaultInstance()));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: pfnFlush=%p actual=%p\n", pR0Logger->Logger.pfnFlush, vmmR0LoggerFlush));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: pfnLogger=%p actual=%p\n", pR0Logger->Logger.pfnLogger, vmmR0LoggerWrapper));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: offScratch=%d fFlags=%#x fDestFlags=%#x\n", pR0Logger->Logger.offScratch, pR0Logger->Logger.fFlags, pR0Logger->Logger.fDestFlags));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogSetDefaultInstanceThread(&pR0Logger->Logger, (uintptr_t)pVM->pSession);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: after %p reg\n", RTLogDefaultInstance()));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: after %p dereg\n", RTLogDefaultInstance()));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync pR0Logger->Logger.pfnLogger("hello ring-0 logger\n");
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: returned succesfully from direct logger call.\n"));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: returned succesfully from direct flush call.\n"));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogSetDefaultInstanceThread(&pR0Logger->Logger, (uintptr_t)pVM->pSession);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: after %p reg2\n", RTLogDefaultInstance()));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync pR0Logger->Logger.pfnLogger("hello ring-0 logger\n");
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: returned succesfully from direct logger call (2). offScratch=%d\n", pR0Logger->Logger.offScratch));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: after %p dereg2\n", RTLogDefaultInstance()));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogLoggerEx(&pR0Logger->Logger, 0, ~0U, "hello ring-0 logger (RTLogLoggerEx)\n");
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: RTLogLoggerEx returned fine offScratch=%d\n", pR0Logger->Logger.offScratch));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogSetDefaultInstanceThread(&pR0Logger->Logger, (uintptr_t)pVM->pSession);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogPrintf("hello ring-0 logger (RTLogPrintf)\n");
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogCom(("vmmR0InitVM: RTLogPrintf returned fine offScratch=%d\n", pR0Logger->Logger.offScratch));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Log(("Switching to per-thread logging instance %p (key=%p)\n", &pR0Logger->Logger, pVM->pSession));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RTLogSetDefaultInstanceThread(&pR0Logger->Logger, (uintptr_t)pVM->pSession);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initialize the per VM data for GVMM and GMM.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// if (RT_SUCCESS(rc))
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// rc = GMMR0InitPerVMData(pVM);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Init HWACCM, CPUM and PGM (Darwin only).
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync rc = CPUMR0Init(pVM); /** @todo rename to CPUMR0InitVM */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* bail out */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Terminates the R0 driver for a particular VM instance.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * This is normally called by ring-3 as part of the VM termination process, but
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * may alternatively be called during the support driver session cleanup when
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * the VM object is destroyed (see GVMM).
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns VBox status code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM instance in question.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pGVM Pointer to the global VM structure. Optional.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @thread EMT or session clean up thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Tell GVMM what we're up to and check that we only do this once.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Deregister the logger.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Calls the ring-3 host code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns VBox status code of the ring-3 call.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM handle.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param enmOperation The operation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param uArg The argument to the operation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncVMMR0DECL(int) VMMR0CallHost(PVM pVM, VMMCALLHOST enmOperation, uint64_t uArg)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/** @todo profile this! */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync int rc = vmmR0CallHostLongJmp(&pVM->vmm.s.CallHostR0JmpBuf, VINF_VMM_CALL_HOST);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Record return code statistics
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM handle.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param rc The status code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Collect statistics.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetInterruptHyper);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetRingSwitchInt);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetExceptionPrivilege);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetStaleSelector);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOReadWrite);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOPatchRead);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOPatchWrite);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPatchEmulate);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPatchIretIRQ);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPageOverflow);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetRescheduleREM);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetTimerPending);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetInterruptPending);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPDMQueueFlush);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMPoolGrow);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMMapChunk);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMAllocHandy);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallPGMGrowRAM);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallVMSetError);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZCallVMSetRuntimeError);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPATMDuplicateFn);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPGMChangeMode);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetPendingRequest);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#endif /* VBOX_WITH_STATISTICS */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Unused ring-0 entry point that used to be called from the interrupt gate.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Will be removed one of the next times we do a major SUPDrv version bump.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns VBox status code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM to operate on.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param enmOperation Which operation to execute.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pvArg Argument to the operation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @remarks Assume called with interrupts disabled.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncVMMR0DECL(int) VMMR0EntryInt(PVM pVM, VMMR0OPERATION enmOperation, void *pvArg)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * We're returning VERR_NOT_SUPPORT here so we've got something else
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * than -1 which the interrupt gate glue code might return.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Log(("operation %#x is not supported\n", enmOperation));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * The Ring 0 entry point, called by the fast-ioctl path.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM to operate on.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * The return code is stored in pVM->vmm.s.iLastGZRc.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param idCpu VMCPU id.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param enmOperation Which operation to execute.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @remarks Assume called with interrupts _enabled_.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncVMMR0DECL(void) VMMR0EntryFast(PVM pVM, unsigned idCpu, VMMR0OPERATION enmOperation)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Switch to GC and run guest raw mode code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Disable interrupts before doing the world switch.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Safety precaution as hwaccm disables the switcher. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Run guest code using the available hardware acceleration technology.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Disable interrupts before we do anything interesting. On Windows we avoid
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * this by having the support driver raise the IRQL before calling us, this way
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * we hope to get away with page faults and later calling into the kernel.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#ifndef RT_OS_WINDOWS /** @todo check other hosts */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync rc = vmmR0CallHostSetJmp(&pVM->vmm.s.CallHostR0JmpBuf, HWACCMR0RunGuestCode, pVM, pVCpu); /* this may resume code. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* System is about to go into suspend mode; go back to ring 3. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#ifndef RT_OS_WINDOWS /** @todo check other hosts */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* No special action required for external interrupts, just return. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * For profiling.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Impossible.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Validates a session or VM session argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns true / false accordingly.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pSession The session argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncDECLINLINE(bool) vmmR0IsValidSession(PVM pVM, PSUPDRVSESSION pClaimedSession, PSUPDRVSESSION pSession)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* This must be set! */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Only one out of the two. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VMMR0EntryEx worker function, either called directly or when ever possible
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * called thru a longjmp so we can exit safely on failure.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @returns VBox status code.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pVM The VM to operate on.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param enmOperation Which operation to execute.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pReqHdr This points to a SUPVMMR0REQHDR packet. Optional.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * The support driver validates this if it's present.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param u64Arg Some simple constant argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param pSession The session of the caller.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @remarks Assume called with interrupts _enabled_.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncstatic int vmmR0EntryExWorker(PVM pVM, VMMR0OPERATION enmOperation, PSUPVMMR0REQHDR pReqHdr, uint64_t u64Arg, PSUPDRVSESSION pSession)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Common VM pointer validation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync SUPR0Printf("vmmR0EntryExWorker: Invalid pVM=%p! (op=%d)\n", pVM, enmOperation);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (RT_UNLIKELY( pVM->enmVMState < VMSTATE_CREATING
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync SUPR0Printf("vmmR0EntryExWorker: Invalid pVM=%p:{enmVMState=%d, .pVMR0=%p}! (op=%d)\n",
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * GVM requests
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GVMMR0CreateVMReq((PGVMMCREATEVMREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GVMMR0QueryStatisticsReq(pVM, (PGVMMQUERYSTATISTICSSREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GVMMR0ResetStatisticsReq(pVM, (PGVMMRESETSTATISTICSSREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initialize the R0 part of a VM instance.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Terminate the R0 part of a VM instance.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Attempt to enable hwacc mode and check the current setting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return HWACCMR0EnableAllCpus(pVM, (HWACCMSTATE)u64Arg);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Setup the hardware accelerated raw-mode session.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Switch to GC to execute Hypervisor function.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Safety precaution as HWACCM can disable the switcher. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** @todo dispatch interrupts? */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * PGM wrappers.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * GMM wrappers.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GMMR0InitialReservationReq(pVM, (PGMMINITIALRESERVATIONREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GMMR0UpdateReservationReq(pVM, (PGMMUPDATERESERVATIONREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GMMR0AllocatePagesReq(pVM, (PGMMALLOCATEPAGESREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GMMR0FreePagesReq(pVM, (PGMMFREEPAGESREQ)pReqHdr);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return GMMR0BalloonedPagesReq(pVM, (PGMMBALLOONEDPAGESREQ)pReqHdr);
if (pReqHdr)
return VERR_INVALID_PARAMETER;
if (u64Arg)
return VERR_INVALID_PARAMETER;
case VMMR0_DO_GMM_SEED_CHUNK:
if (pReqHdr)
return VERR_INVALID_PARAMETER;
case VMMR0_DO_GCFGM_SET_VALUE:
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
int rc;
return rc;
case VMMR0_DO_INTNET_OPEN:
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
case VMMR0_DO_INTNET_IF_CLOSE:
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFCLOSEREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFGETRING3BUFFERREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFSETPROMISCUOUSMODEREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
return INTNETR0IfSetPromiscuousModeReq(g_pIntNet, pSession, (PINTNETIFSETPROMISCUOUSMODEREQ)pReqHdr);
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFSETMACADDRESSREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFSETACTIVEREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
case VMMR0_DO_INTNET_IF_SEND:
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFSENDREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
case VMMR0_DO_INTNET_IF_WAIT:
if (u64Arg || !pReqHdr || !vmmR0IsValidSession(pVM, ((PINTNETIFWAITREQ)pReqHdr)->pSession, pSession))
return VERR_INVALID_PARAMETER;
if (!g_pIntNet)
return VERR_NOT_SUPPORTED;
case VMMR0_DO_NOP:
case VMMR0_DO_SLOW_NOP:
return VINF_SUCCESS;
case VMMR0_DO_TESTS:
return VINF_SUCCESS;
return VERR_NOT_SUPPORTED;
typedef struct VMMR0ENTRYEXARGS
VMMR0DECL(int) VMMR0EntryEx(PVM pVM, VMMR0OPERATION enmOperation, PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION pSession)
switch (enmOperation)
case VMMR0_DO_GMM_FREE_PAGES:
case VMMR0_DO_GMM_SEED_CHUNK:
case VMMR0_DO_VMMR0_INIT:
case VMMR0_DO_VMMR0_TERM:
#ifdef DEBUG
#ifdef DEBUG
#ifdef RT_ARCH_X86
#ifdef DEBUG
if (pVM)
#ifdef RT_ARCH_X86
#ifdef RT_OS_LINUX
DECLEXPORT(void) RTCALL AssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)
if (pVM)
#ifdef RT_OS_DARWIN
return cbChars;
if (pLog)
if (pVM)
#ifdef RT_OS_DARWIN