vm.h revision 8b0f6d2d53953de1ce264626b185fb4f2298295e
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * VM - The Virtual Machine, data.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * Copyright (C) 2006-2007 Sun Microsystems, Inc.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * This file is part of VirtualBox Open Source Edition (OSE), as
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * available from http://www.virtualbox.org. This file is free software;
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * you can redistribute it and/or modify it under the terms of the GNU
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * General Public License (GPL) as published by the Free Software
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * Foundation, in version 2 as it comes in the "COPYING" file of the
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * The contents of this file may alternatively be used under the terms
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * of the Common Development and Distribution License Version 1.0
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * VirtualBox OSE distribution, in which case the provisions of the
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * CDDL are applicable instead of those of the GPL.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * You may elect to license modified versions of this file under the
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * terms and conditions of either the GPL or the CDDL or both.
ab359738f77f6061fd76982ba391ae52e07b0203Paul Bryan * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
f56ff38befd2d32c4d47af7794303ee7c3a36f94Andi Egloff * Clara, CA 95054 USA or visit http://www.sun.com if you need
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * additional information or have any questions.
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** @defgroup grp_vm The Virtual Machine
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** Maximum number of virtual CPUs per VM. */
5779b9adde0a838db067a3d76f3124eeb8e86d4cJason Vincent * The state of a virtual CPU.
5779b9adde0a838db067a3d76f3124eeb8e86d4cJason Vincent * The VM running states are a sub-states of the VMSTATE_RUNNING state. While
5779b9adde0a838db067a3d76f3124eeb8e86d4cJason Vincent * VMCPUSTATE_NOT_RUNNING is a place holder for the other VM states.
90e23b56c7ebf9dffe7ad87f1031103d2b49c08ePaul Bryan /** The customary invalid zero. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle /** Running guest code (VM running). */
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle /** Running guest code in the recompiler (VM running). */
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle /** Halted (VM running). */
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle /** All the other bits we do while running a VM (VM running). */
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle /** VM not running, we're servicing requests or whatever. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle /** The end of valid virtual CPU states. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** Ensure 32-bit type. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * Per virtual CPU data.
9697d1ddb3900b1f7f16af9e3be0d1bb34c1f965Paul Bryantypedef struct VMCPU
47196c962e3caf7cdf7ea5d00ccdefc9f208bdceLaszlo Hordos /** Per CPU forced action.
47196c962e3caf7cdf7ea5d00ccdefc9f208bdceLaszlo Hordos * See the VMCPU_FF_* \#defines. Updated atomically. */
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall /** The CPU state. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan /** Ring-3 Host Context VM Pointer. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** Ring-0 Host Context VM Pointer. */
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall /** Raw-mode Context VM Pointer. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** The CPU ID.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * This is the index into the VM::aCpu array. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** The native thread handle. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** Align the next bit on a 64-byte boundary. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos uint32_t au32Alignment[HC_ARCH_BITS == 32 ? 9 : 6];
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** CPUM part. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos /** VMM part. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan /** PGM part. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle /** HWACCM part. */
376d1bf8f8ca562eecccbf0a0d34aa7c7352e152Laszlo Hordos /** EM part. */
0901148a508a9c433851a650cd8eb52899d1222bLaszlo Hordos /** TM part. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Pointer to a VMCPU. */
376d1bf8f8ca562eecccbf0a0d34aa7c7352e152Laszlo Hordos/** The name of the Guest Context VMM Core module. */
9c8c2c05a3d08f94d29b4a42b8a0506a4e97e4faLaszlo Hordos/** The name of the Ring 0 Context VMM Core module. */
376d1bf8f8ca562eecccbf0a0d34aa7c7352e152Laszlo Hordos/** VM Forced Action Flags.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * Use the VM_FF_SET() and VM_FF_CLEAR() macros to change the force
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos * action mask of a VM.
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos/** This action forces the VM to service check and pending interrups on the APIC. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos/** This action forces the VM to service check and pending interrups on the PIC. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** This action forces the VM to schedule and run pending timer (TM). */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos/** PDM Queues are pending. */
376d1bf8f8ca562eecccbf0a0d34aa7c7352e152Laszlo Hordos/** PDM DMA transfers are pending. */
376d1bf8f8ca562eecccbf0a0d34aa7c7352e152Laszlo Hordos/** PDM critical section unlocking is pending, process promptly upon return to R3. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** This action forces the VM to call DBGF so DBGF can service debugger
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * requests in the emulation thread.
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle * This action flag stays asserted till DBGF clears it.*/
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** This action forces the VM to service pending requests from other
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle * thread or requests which must be executed in another context. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Terminate the VM immediately. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Reset the VM. (postponed) */
2aa8de21e6cca211bdb436c58886b60f4d32d073Brendan Miller/** This action forces the VM to resync the page tables before going
2aa8de21e6cca211bdb436c58886b60f4d32d073Brendan Miller * back to execute guest code. (GLOBAL FLUSH) */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Same as VM_FF_PGM_SYNC_CR3 except that global pages can be skipped.
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle * (NON-GLOBAL FLUSH) */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle#define VM_FF_PGM_SYNC_CR3_NON_GLOBAL RT_BIT_32(17)
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** PGM needs to allocate handy pages. */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Check the interupt and trap gates */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Check Guest's TSS ring 0 stack */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Check Guest's GDT table */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Check Guest's LDT table */
dd291c383b4490ed77e47d65b4c52595d915f802Chad Kienle/** Inhibit interrupts pending. See EMGetInhibitInterruptsPC(). */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** CSAM needs to scan the page that's being executed */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** CSAM needs to do some homework. */
90e23b56c7ebf9dffe7ad87f1031103d2b49c08ePaul Bryan/** Force return to Ring-3. */
9697d1ddb3900b1f7f16af9e3be0d1bb34c1f965Paul Bryan/** REM needs to be informed about handler changes. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** Suspend the VM - debug only. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** Externally forced actions. Used to quit the idle/wait loop. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan#define VM_FF_EXTERNAL_SUSPENDED_MASK (VM_FF_TERMINATE | VM_FF_DBGF | VM_FF_REQUEST)
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** Externally forced actions. Used to quit the idle/wait loop. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan#define VM_FF_EXTERNAL_HALTED_MASK (VM_FF_TERMINATE | VM_FF_DBGF | VM_FF_TIMER | VM_FF_INTERRUPT_APIC | VM_FF_INTERRUPT_PIC | VM_FF_REQUEST | VM_FF_PDM_QUEUES | VM_FF_PDM_DMA)
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** High priority pre-execution actions. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan#define VM_FF_HIGH_PRIORITY_PRE_MASK (VM_FF_TERMINATE | VM_FF_DBGF | VM_FF_INTERRUPT_APIC | VM_FF_INTERRUPT_PIC | VM_FF_TIMER | VM_FF_DEBUG_SUSPEND \
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan | VM_FF_PGM_SYNC_CR3 | VM_FF_PGM_SYNC_CR3_NON_GLOBAL | VM_FF_SELM_SYNC_TSS | VM_FF_TRPM_SYNC_IDT | VM_FF_SELM_SYNC_GDT | VM_FF_SELM_SYNC_LDT | VM_FF_PGM_NEED_HANDY_PAGES)
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos/** High priority pre raw-mode execution mask. */
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos#define VM_FF_HIGH_PRIORITY_PRE_RAW_MASK (VM_FF_PGM_SYNC_CR3 | VM_FF_PGM_SYNC_CR3_NON_GLOBAL | VM_FF_SELM_SYNC_TSS | VM_FF_TRPM_SYNC_IDT | VM_FF_SELM_SYNC_GDT | VM_FF_SELM_SYNC_LDT | VM_FF_PGM_NEED_HANDY_PAGES \
88f2d7061bb42999901dcff81c37089b000d32e0Paul Bryan/** High priority post-execution actions. */
ab359738f77f6061fd76982ba391ae52e07b0203Paul Bryan#define VM_FF_HIGH_PRIORITY_POST_MASK (VM_FF_PDM_CRITSECT | VM_FF_CSAM_PENDING_ACTION)
2ae41f94c30465830758177491494f918a7a79bcLaszlo Hordos/** Normal priority post-execution actions. */
0da1e22d2b01edcea9b1b42072454ef841f17bfaPaul Bryan#define VM_FF_NORMAL_PRIORITY_POST_MASK (VM_FF_TERMINATE | VM_FF_DBGF | VM_FF_RESET | VM_FF_CSAM_SCAN_PAGE)
0da1e22d2b01edcea9b1b42072454ef841f17bfaPaul Bryan/** Normal priority actions. */
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan#define VM_FF_NORMAL_PRIORITY_MASK (VM_FF_REQUEST | VM_FF_PDM_QUEUES | VM_FF_PDM_DMA | VM_FF_REM_HANDLER_NOTIFY)
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan/** Flags to check before resuming guest execution. */
88f2d7061bb42999901dcff81c37089b000d32e0Paul Bryan/** All the forced flags. */
88f2d7061bb42999901dcff81c37089b000d32e0Paul Bryan/** All the forced flags. */
90e23b56c7ebf9dffe7ad87f1031103d2b49c08ePaul Bryan#define VM_FF_ALL_BUT_RAW_MASK (~(VM_FF_HIGH_PRIORITY_PRE_RAW_MASK | VM_FF_CSAM_PENDING_ACTION | VM_FF_PDM_CRITSECT))
0da1e22d2b01edcea9b1b42072454ef841f17bfaPaul Bryan/** @def VM_FF_SET
0da1e22d2b01edcea9b1b42072454ef841f17bfaPaul Bryan * Sets a force action flag.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * @param pVM VM Handle.
4b93fff6cbed4e2ae34e954b9b9bd4f318d34cd4Andi Egloff * @param fFlag The flag to set.
4b93fff6cbed4e2ae34e954b9b9bd4f318d34cd4Andi Egloff# define VM_FF_SET(pVM, fFlag) ASMAtomicOrU32(&(pVM)->fForcedActions, (fFlag))
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall do { ASMAtomicOrU32(&(pVM)->fForcedActions, (fFlag)); \
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall RTLogPrintf("VM_FF_SET : %08x %s - %s(%d) %s\n", (pVM)->fForcedActions, #fFlag, __FILE__, __LINE__, __FUNCTION__); \
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall/** @def VMCPU_FF_SET
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * Sets a force action flag for given VCPU.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * @param pVM VM Handle.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * @param idCpu Virtual CPU ID.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * @param fFlag The flag to set.
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall# define VMCPU_FF_SET(pVM, idCpu, fFlag) ASMAtomicOrU32(&(pVM)->aCpu[idCpu].fForcedActions, (fFlag))
47196c962e3caf7cdf7ea5d00ccdefc9f208bdceLaszlo Hordos# define VMCPU_FF_SET(pVM, idCpu, fFlag) VM_FF_SET(pVM, fFlag)
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall/** @def VM_FF_CLEAR
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall * Clears a force action flag.
88f2d7061bb42999901dcff81c37089b000d32e0Paul Bryan * @param pVM VM Handle.
88f2d7061bb42999901dcff81c37089b000d32e0Paul Bryan * @param fFlag The flag to clear.
4b93fff6cbed4e2ae34e954b9b9bd4f318d34cd4Andi Egloff# define VM_FF_CLEAR(pVM, fFlag) ASMAtomicAndU32(&(pVM)->fForcedActions, ~(fFlag))
4b93fff6cbed4e2ae34e954b9b9bd4f318d34cd4Andi Egloff do { ASMAtomicAndU32(&(pVM)->fForcedActions, ~(fFlag)); \
7483266ec82ab642b8991a17132b83b6b5d72c3dTravis Hall RTLogPrintf("VM_FF_CLEAR: %08x %s - %s(%d) %s\n", (pVM)->fForcedActions, #fFlag, __FILE__, __LINE__, __FUNCTION__); \
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VMCPU_FF_CLEAR
5c6780831f7f32502f025e2e795378ae5712dfffchad.kienle * Clears a force action flag for given VCPU.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param pVM VM Handle.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param idCpu Virtual CPU ID.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param fFlag The flag to clear.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_CLEAR(pVM, idCpu, fFlag) ASMAtomicAndU32(&(pVM)->aCpu[idCpu].fForcedActions, ~(fFlag))
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_CLEAR(pVM, idCpu, fFlag) VM_FF_CLEAR(pVM, fFlag)
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VM_FF_ISSET
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * Checks if a force action flag is set.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param pVM VM Handle.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param fFlag The flag to check.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle#define VM_FF_ISSET(pVM, fFlag) (((pVM)->fForcedActions & (fFlag)) == (fFlag))
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VMCPU_FF_ISSET
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * Checks if a force action flag is set for given VCPU.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param pVM VM Handle.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param idCpu Virtual CPU ID.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param fFlag The flag to check.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_ISSET(pVM, idCpu, fFlag) (((pVM)->aCpu[idCpu].fForcedActions & (fFlag)) == (fFlag))
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_ISSET(pVM, idCpu, fFlag) VM_FF_ISSET(pVM, fFlag)
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VM_FF_ISPENDING
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * Checks if one or more force action in the specified set is pending.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param pVM VM Handle.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param fFlags The flags to check for.
03f0437b30a5f4e8c85a5da94eadfa1f8faca90dBrendan Miller#define VM_FF_ISPENDING(pVM, fFlags) ((pVM)->fForcedActions & (fFlags))
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VMCPU_FF_ISPENDING
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * Checks if one or more force action in the specified set is pending for given VCPU.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param pVM VM Handle.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param idCpu Virtual CPU ID.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * @param fFlags The flags to check for.
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_ISPENDING(pVM, idCpu, fFlags) ((pVM)->aCpu[idCpu].fForcedActions & (fFlags))
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle# define VMCPU_FF_ISPENDING(pVM, idCpu, fFlags) VM_FF_ISPENDING(pVM, fFlags)
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle/** @def VM_IS_EMT
0d225a5b73f6420cb2afb27337f53e9772d8e610chad.kienle * Checks if the current thread is the emulation thread (EMT).
10a9be648c010204b8ba63b283aa177749227e11Paul Bryan * @remark The ring-0 variation will need attention if we expand the ring-0
#ifdef IN_RC
#ifdef IN_RC
("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), VMR3GetVMCPUNativeThread(pVM)))
#ifdef IN_RC
("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), VMR3GetVMCPUNativeThread(pVM)), \
(rc))
(rc))
typedef struct VM
bool fRawR3Enabled;
bool fRawR0Enabled;
bool fPATMEnabled;
bool fCSAMEnabled;
bool fHWACCMEnabled;
bool fPARAVEnabled;
#ifdef ___CPUMInternal_h
struct CPUM s;
} cpum;
#ifdef ___VMMInternal_h
struct VMM s;
} vmm;
#ifdef ___PGMInternal_h
struct PGM s;
} pgm;
#ifdef ___HWACCMInternal_h
struct HWACCM s;
} hwaccm;
#ifdef ___TRPMInternal_h
struct TRPM s;
} trpm;
#ifdef ___SELMInternal_h
struct SELM s;
} selm;
#ifdef ___MMInternal_h
struct MM s;
} mm;
#ifdef ___CFGMInternal_h
struct CFGM s;
} cfgm;
#ifdef ___PDMInternal_h
struct PDM s;
} pdm;
#ifdef ___IOMInternal_h
struct IOM s;
} iom;
#ifdef ___PATMInternal_h
struct PATM s;
} patm;
#ifdef ___CSAMInternal_h
struct CSAM s;
} csam;
#ifdef ___PARAVInternal_h
struct PARAV s;
} parav;
#ifdef ___EMInternal_h
struct EM s;
} em;
#ifdef ___TMInternal_h
struct TM s;
} tm;
#ifdef ___DBGFInternal_h
struct DBGF s;
} dbgf;
#ifdef ___SSMInternal_h
struct SSM s;
} ssm;
#ifdef ___VMInternal_h
struct VMINT s;
} vm;
#ifdef ___REMInternal_h
struct REM s;
#ifdef VBOX_WITH_NEW_RECOMPILER
* Must be multiple of 32 and coherent with REM_ENV_SIZE from REMInternal.h. */
} rem;
} VM;
#ifndef ___VBox_types_h
#ifdef IN_RC