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