VMMInternal.h revision 5f441bbe75b75de6f100c510a451642f3ab178eb
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/* $Id$ */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @file
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VMM - Internal header file.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Copyright (C) 2006 InnoTek Systemberatung GmbH
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * available from http://www.virtualbox.org. This file is free software;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * General Public License as published by the Free Software Foundation,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * If you received this file as part of a commercial VirtualBox
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * distribution, then only the terms of your commercial VirtualBox
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * license agreement apply instead of the previous paragraph.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#ifndef __VMMInternal_h__
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#define __VMMInternal_h__
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#include <VBox/cdefs.h>
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#include <x86context.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <VBox/stam.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <VBox/log.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/critsect.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#if !defined(IN_VMM_R3) && !defined(IN_VMM_R0) && !defined(IN_VMM_GC)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync# error "Not in VMM! This is an internal header!"
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @defgroup grp_vmm_int Internals
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @ingroup grp_vmm
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @internal
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @def VBOX_WITH_GC_AND_R0_RELEASE_LOG
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Enabled GC and R0 release logging (the latter is not implemented yet). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#define VBOX_WITH_GC_AND_R0_RELEASE_LOG
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Converts a VMM pointer into a VM pointer.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns Pointer to the VM structure the VMM is part of.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pVMM Pointer to VMM instance data.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#define VMM2VM(pVMM) ( (PVM)((char*)pVMM - pVMM->offVM) )
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Switcher function, HC to GC.
acca7ab818eb8c2832aa27e27ce53133fba927dbvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pVM The VM handle.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns Return code indicating the action to take.
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsynctypedef DECLASMTYPE(int) FNVMMSWITCHERHC(PVM pVM);
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync/** Pointer to switcher function. */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsynctypedef FNVMMSWITCHERHC *PFNVMMSWITCHERHC;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync/**
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync * Switcher function, GC to HC.
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync *
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync * @param rc VBox status code.
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync */
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsynctypedef DECLASMTYPE(void) FNVMMSWITCHERGC(int rc);
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync/** Pointer to switcher function. */
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsynctypedef FNVMMSWITCHERGC *PFNVMMSWITCHERGC;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync/**
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync * The ring-0 logger instance.
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync * We need to be able to find the VM handle from the logger instance.
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsynctypedef struct VMMR0LOGGER
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync{
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync /** Pointer to the VM handle. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PVM pVM;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync /** Size of the allocated logger instance (Logger). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t cbLogger;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Flag indicating whether we've create the logger Ring-0 instance yet. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync bool fCreated;
5eb36887f6970e0033f63fa135f3bb8fbfd6059bvboxsync#if HC_ARCH_BITS == 32
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t u32Alignment;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The ring-0 logger instance. This extends beyon the size.*/
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTLOGGER Logger;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync} VMMR0LOGGER, *PVMMR0LOGGER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Jump buffer for the setjmp/longjmp like constructs used to
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * quickly 'call' back into Ring-3.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsynctypedef struct VMMR0JMPBUF
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Tranditional jmp_buf stuff
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @{ */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#if HC_ARCH_BITS == 32
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t ebx;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t esi;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t edi;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t ebp;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t esp;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t eip;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync uint32_t u32Padding;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync#endif
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync#if HC_ARCH_BITS == 64
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync uint64_t rbx;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync# ifdef __WIN__
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync uint64_t rsi;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync uint64_t rdi;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync# endif
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync uint64_t rbp;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t r12;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t r13;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t r14;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t r15;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t rsp;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t rip;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** @} */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Flag that indicates that we've done a ring-3 call. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync bool fInRing3Call;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync /** The number of bytes we've saved. */
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync uint32_t cbSavedStack;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync /** Pointer to the buffer used to save the stack.
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync * This is assumed to be 8KB. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTR0PTR pvSavedStack;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync /** Esp we we match against esp on resume to make sure the stack wasn't relocated. */
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RTHCUINTREG SpCheck;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync /** The esp we should resume execution with after the restore. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTHCUINTREG SpResume;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync} VMMR0JMPBUF, *PVMMR0JMPBUF;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VMM Data (part of VMM)
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync */
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsynctypedef struct VMM
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync /** Offset to the VM structure.
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync * See VMM2VM(). */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync RTINT offVM;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync /** Size of the core code. */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync RTUINT cbCoreCode;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Physical address of core code. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTHCPHYS HCPhysCoreCode;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @todo pvHCCoreCodeR3 -> pvCoreCodeR3, pvHCCoreCodeR0 -> pvCoreCodeR0 */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to core code ring-3 mapping - contiguous memory.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * At present this only means the context switcher code. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTR3PTR pvHCCoreCodeR3;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to core code ring-0 mapping - contiguous memory.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * At present this only means the context switcher code. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTR0PTR pvHCCoreCodeR0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to core code guest context mapping. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR pvGCCoreCode;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef VBOX_WITH_NMI
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The guest context address of the APIC (host) mapping. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR GCPtrApicBase;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR pGCPadding0; /**< Alignment padding */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The current switcher.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This will be set before the VMM is fully initialized. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMSWITCHER enmSwitcher;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Array of offsets to the different switchers within the core code. */
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync RTUINT aoffSwitchers[VMMSWITCHER_MAX];
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Flag to disable the switcher permanently (VMX) (boolean) */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync bool fSwitcherDisabled;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Host to guest switcher entry point. */
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync R0PTRTYPE(PFNVMMSWITCHERHC) pfnR0HostToGuest;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Guest to host switcher entry point. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync GCPTRTYPE(PFNVMMSWITCHERGC) pfnGCGuestToHost;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Call Trampoline. See vmmGCCallTrampoline(). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR pfnGCCallTrampoline;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Resume Guest Execution. See CPUMGCResumeGuest(). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR pfnCPUMGCResumeGuest;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Resume Guest Execution in V86 mode. See CPUMGCResumeGuestV86(). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTGCPTR pfnCPUMGCResumeGuestV86;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The last GC return code. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTINT iLastGCRc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#if HC_ARCH_BITS == 64 && GC_ARCH_BITS == 32
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t u32Padding0; /**< Alignment padding. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** VMM stack, pointer to the top of the stack in HC.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Stack is allocated from the hypervisor heap and is page aligned
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * and always writable in GC. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync HCPTRTYPE(uint8_t *) pbHCStack;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the bottom of the stack - needed for doing relocations. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync GCPTRTYPE(uint8_t *) pbGCStack;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the bottom of the stack - needed for doing relocations. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync GCPTRTYPE(uint8_t *) pbGCStackBottom;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the GC logger instance - GC Ptr.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This is NULL if logging is disabled. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync GCPTRTYPE(PRTLOGGERGC) pLoggerGC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Size of the allocated logger instance (pLoggerGC/pLoggerHC). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTUINT cbLoggerGC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the GC logger instance - HC Ptr.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This is NULL if logging is disabled. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync HCPTRTYPE(PRTLOGGERGC) pLoggerHC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the R0 logger instance.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This is NULL if logging is disabled. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync HCPTRTYPE(PVMMR0LOGGER) pR0Logger;
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef VBOX_WITH_GC_AND_R0_RELEASE_LOG
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the GC release logger instance - GC Ptr. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync GCPTRTYPE(PRTLOGGERGC) pRelLoggerGC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Size of the allocated release logger instance (pRelLoggerGC/pRelLoggerHC).
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This may differ from cbLoggerGC. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTUINT cbRelLoggerGC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Pointer to the GC release logger instance - HC Ptr. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync HCPTRTYPE(PRTLOGGERGC) pRelLoggerHC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif /* VBOX_WITH_GC_AND_R0_RELEASE_LOG */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Global VM critical section. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTCRITSECT CritSectVMLock;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The EMT yield timer. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PTMTIMERHC pYieldTimer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The period to the next timeout when suspended or stopped.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This is 0 when running. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t cYieldResumeMillies;
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync /** The EMT yield timer interval (milliseconds). */
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync uint32_t cYieldEveryMillies;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#if HC_ARCH_BITS == 32
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t u32Padding0; /**< Alignment padding. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
316572fd6bf59ec1038f0476f6536fc10163beebvboxsync /** The timestamp of the previous yield. (nano) */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint64_t u64LastYield;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** @name CallHost
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @{ */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The pending operation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMCALLHOST enmCallHostOperation;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The result of the last operation. */
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync int32_t rcCallHost;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync /** The argument to the operation. */
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync uint64_t u64CallHostArg;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync /** The Ring-0 jmp buffer. */
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync VMMR0JMPBUF CallHostR0JmpBuf;
602e0e27740395dba64bee2e0a8aef023ebd7650vboxsync /** @} */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Number of VMMR0_DO_RUN_GC calls. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatRunGC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Statistics for each of the GC return codes.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @{ */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetNormal;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetInterrupt;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetInterruptHyper;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetGuestTrap;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetRingSwitch;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetRingSwitchInt;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetExceptionPrivilege;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetStaleSelector;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetIRETTrap;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetEmulate;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPatchEmulate;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetIORead;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetIOWrite;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetMMIORead;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetMMIOWrite;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetMMIOPatchRead;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetMMIOPatchWrite;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetMMIOReadWrite;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetLDTFault;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetGDTFault;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetIDTFault;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetTSSFault;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPDFault;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetCSAMTask;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetSyncCR3;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetMisc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetPatchInt3;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetPatchPF;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync STAMCOUNTER StatGCRetPatchGP;
78df65edff21c11c537f38e736707ea434ab5623vboxsync STAMCOUNTER StatGCRetPatchIretIRQ;
78df65edff21c11c537f38e736707ea434ab5623vboxsync STAMCOUNTER StatGCRetPageOverflow;
78df65edff21c11c537f38e736707ea434ab5623vboxsync STAMCOUNTER StatGCRetRescheduleREM;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync STAMCOUNTER StatGCRetToR3;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync STAMCOUNTER StatGCRetTimerPending;
78df65edff21c11c537f38e736707ea434ab5623vboxsync STAMCOUNTER StatGCRetInterruptPending;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync STAMCOUNTER StatGCRetCallHost;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync STAMCOUNTER StatGCRetPATMDuplicateFn;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync STAMCOUNTER StatGCRetPGMChangeMode;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetEmulHlt;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPendingRequest;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPGMGrowRAM;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPDMLock;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetLogFlush;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPDMQueueFlush;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync STAMCOUNTER StatGCRetPGMPoolGrow;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync STAMCOUNTER StatGCRetRemReplay;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync STAMCOUNTER StatGCRetVMSetError;
78df65edff21c11c537f38e736707ea434ab5623vboxsync STAMCOUNTER StatGCRetVMSetRuntimeError;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync STAMCOUNTER StatGCRetPGMLock;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /** @} */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
78df65edff21c11c537f38e736707ea434ab5623vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync} VMM, *PVMM;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * The VMMGCEntry() codes.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsynctypedef enum VMMGCOPERATION
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync{
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** Do GC module init. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_VMMGC_INIT = 1,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** The first Trap testcase. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_FIRST = 0x0dead000,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 0 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_0 = VMMGC_DO_TESTCASE_TRAP_FIRST,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 1 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_1,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 2 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_2,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 3 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_3,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 4 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_4,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 5 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_5,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 6 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_6,
78df65edff21c11c537f38e736707ea434ab5623vboxsync /** Trap 7 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_7,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Trap 8 testcases, uArg selects the variation. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_TRAP_8,
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /** Trap 9 testcases, uArg selects the variation. */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync VMMGC_DO_TESTCASE_TRAP_9,
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /** Trap 0a testcases, uArg selects the variation. */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync VMMGC_DO_TESTCASE_TRAP_0A,
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /** Trap 0b testcases, uArg selects the variation. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_TESTCASE_TRAP_0B,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** Trap 0c testcases, uArg selects the variation. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_TESTCASE_TRAP_0C,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** Trap 0d testcases, uArg selects the variation. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_TESTCASE_TRAP_0D,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** Trap 0e testcases, uArg selects the variation. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_TESTCASE_TRAP_0E,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** The last trap testcase (exclusive). */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync VMMGC_DO_TESTCASE_TRAP_LAST,
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /** Testcase for checking interrupt forwarding. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_HYPER_INTERRUPT,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Switching testing and profiling stub. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_NOP,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Testcase for checking interrupt masking.. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_INTERRUPT_MASKING,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** Switching testing and profiling stub. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_TESTCASE_HWACCM_NOP,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** The usual 32-bit hack. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VMMGC_DO_32_BIT_HACK = 0x7fffffff
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync} VMMGCOPERATION;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync__BEGIN_DECLS
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef IN_RING0
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * World switcher assembly routine.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * It will call VMMGCEntry().
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns return code from VMMGCEntry().
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pVM The VM in question.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param uArg See VMMGCEntry().
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @internal
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmR0WorldSwitch(PVM pVM, unsigned uArg);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Callback function for vmmR0CallHostSetJmp.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns VBox status code.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pVM The VM handle.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsynctypedef DECLCALLBACK(int) FNVMMR0SETJMP(PVM pVM);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** Pointer to FNVMMR0SETJMP(). */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsynctypedef FNVMMR0SETJMP *PFNVMMR0SETJMP;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * The setjmp variant used for calling Ring-3.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This differs from the normal setjmp in that it will resume VMMR0CallHost if we're
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * in the middle of a ring-3 call. Another differences is the function pointer and
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * argument. This has to do with resuming code and the stack frame of the caller.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync * @returns VINF_SUCCESS on success or whatever is passed to vmmR0CallHostLongJmp.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pJmpBuf The jmp_buf to set.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pfn The function to be called when not resuming..
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pVM The argument of that function.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmR0CallHostSetJmp(PVMMR0JMPBUF pJmpBuf, PFNVMMR0SETJMP pfn, PVM pVM);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Worker for VMMR0CallHost.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This will save the stack and registers.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns rc.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pJmpBuf Pointer to the jump buffer.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param rc The return code.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmR0CallHostLongJmp(PVMMR0JMPBUF pJmpBuf, int rc);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Internal R0 logger worker: Logger wrapper.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncVMMR0DECL(void) vmmR0LoggerWrapper(const char *pszFormat, ...);
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Internal R0 logger worker: Flush logger.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pLogger The logger instance to flush.
48807baed22246206b9855f41d1fd106f0679b3avboxsync * @remark This function must be exported!
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncVMMR0DECL(void) vmmR0LoggerFlush(PRTLOGGER pLogger);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif /* IN_RING0 */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef IN_GC
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Internal GC logger worker: Logger wrapper.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncVMMGCDECL(void) vmmGCLoggerWrapper(const char *pszFormat, ...);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Internal GC release logger worker: Logger wrapper.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncVMMGCDECL(void) vmmGCRelLoggerWrapper(const char *pszFormat, ...);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Internal GC logger worker: Flush logger.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns VINF_SUCCESS.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pLogger The logger instance to flush.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @remark This function must be exported!
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncVMMGCDECL(int) vmmGCLoggerFlush(PRTLOGGERGC pLogger);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @name Trap testcases and related labels.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @{ */
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsyncDECLASM(void) vmmGCEnableWP(void);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(void) vmmGCDisableWP(void);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmGCTestTrap3(void);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmGCTestTrap8(void);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmGCTestTrap0d(void);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncDECLASM(int) vmmGCTestTrap0e(void);
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsyncDECLASM(int) vmmGCTestTrap0e_FaultEIP(void); /**< a label */
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsyncDECLASM(int) vmmGCTestTrap0e_ResumeEIP(void); /**< a label */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @} */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif /* IN_GC */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync__END_DECLS
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync/** @} */
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync#endif
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync