REMInternal.h revision 4af48bf7c72ef1e201c64bd475377b5af9d8e8a1
/* $Id$ */
/** @file
* REM - Internal header file.
*/
/*
* Copyright (C) 2006-2007 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#ifndef ___REMInternal_h
#define ___REMInternal_h
#ifdef REM_INCLUDE_CPU_H
# include "target-i386/cpu.h"
#endif
/** @defgroup grp_rem_int Internals
* @ingroup grp_rem
* @internal
* @{
*/
/** The saved state version number. */
#define REM_SAVED_STATE_VERSION_VER1_6 6
#define REM_SAVED_STATE_VERSION 7
/** @def REM_MONITOR_CODE_PAGES
* Enable to monitor code pages that have been translated by the recompiler. */
/** Currently broken and interferes with CSAM monitoring (see #2784) */
////#define REM_MONITOR_CODE_PAGES
#ifdef DOXYGEN_RUNNING
# define REM_MONITOR_CODE_PAGES
#endif
typedef enum REMHANDLERNOTIFICATIONKIND
{
/** The usual invalid 0 entry. */
/** REMR3NotifyHandlerPhysicalRegister. */
/** REMR3NotifyHandlerPhysicalDeregister. */
/** REMR3NotifyHandlerPhysicalModify. */
/** The usual 32-bit hack. */
REMHANDLERNOTIFICATIONKIND_32BIT_HACK = 0x7fffffff
/**
* A recorded handler notification.
*/
typedef struct REMHANDLERNOTIFICATION
{
/** The notification kind. */
/** Type specific data. */
union
{
struct
{
bool fHasHCHandler;
struct
{
bool fHasHCHandler;
bool fRestoreAsRAM;
struct
{
bool fHasHCHandler;
bool fRestoreAsRAM;
} u;
/** Pointer to a handler notification record. */
/**
* Converts a REM pointer into a VM pointer.
* @returns Pointer to the VM structure the REM is part of.
* @param pREM Pointer to REM instance data.
*/
/**
* REM Data (part of VM)
*/
typedef struct REM
{
/** Offset to the VM structure. */
/** Alignment padding. */
/** Cached pointer of the register context of the current VCPU. */
/** In REM mode.
* I.e. the correct CPU state and some other bits are with REM. */
bool volatile fInREM;
/** In REMR3State. */
bool fInStateSync;
/** Set when the translation blocks cache need to be flushed. */
bool fFlushTBs;
/** Ignore CR3 load notifications from the REM. */
bool fIgnoreCR3Load;
/** Ignore invlpg notifications from the REM. */
bool fIgnoreInvlPg;
/** Ignore CR0, CR4 and EFER load. */
bool fIgnoreCpuMode;
/** Ignore set page. */
bool fIgnoreSetPage;
bool bPadding1;
/** Ignore all that can be ignored. */
/** Number of times REMR3CanExecuteRaw has been called.
* It is used to prevent rescheduling on the first call. */
/** Pending interrupt (~0 -> nothing). */
/** Number of recorded invlpg instructions. */
uint32_t volatile cInvalidatedPages;
#if HC_ARCH_BITS == 32
#endif
/** Array of recorded invlpg instruction.
* These instructions are replayed when entering REM. */
/** Array of recorded handler notifications.
* These are replayed when entering REM. */
volatile uint32_t idxPendingList;
volatile uint32_t idxFreeList;
/** MMIO memory type.
* This is used to register MMIO physical access handlers. */
/** Handler memory type.
* This is used to register non-MMIO physical access handlers which are executed in HC. */
/** Pending exception */
/** Nr of pending exceptions */
/** Pending exception's EIP */
/** Pending exception's CR2 */
/** The highest known RAM address. */
/** Whether GCPhysLastRam has been fixed (see REMR3Init()). */
bool fGCPhysLastRamFixed;
/** Pending rc. */
/** REM critical section.
* This protects cpu_register_physical_memory usage
*/
/** Time spent in QEMU. */
/** Time spent in rawmode.c. */
/** Time spent switching state. */
/** Time spent switching state back. */
/** Padding the CPUX86State structure to 64 byte. */
# define REM_ENV_SIZE 0xff00
/** Recompiler CPU state. */
#ifdef REM_INCLUDE_CPU_H
#else
struct FakeEnv
{
char achPadding[REM_ENV_SIZE];
} Env;
#endif /* !REM_INCLUDE_CPU_H */
} REM;
/** Pointer to the REM Data. */
#ifdef REM_INCLUDE_CPU_H
#endif /* REM_INCLUDE_CPU_H */
/** @todo r=bird: clean up the RAWEx stats. */
/* temporary hacks */
#define RAWEx_ProfileStart(a, b) remR3ProfileStart(b)
#define RAWEx_ProfileStop(a, b) remR3ProfileStop(b)
#ifdef VBOX_WITH_STATISTICS
# define STATS_EMULATE_SINGLE_INSTR 1
# define STATS_QEMU_COMPILATION 2
# define STATS_QEMU_RUN_EMULATED_CODE 3
# define STATS_QEMU_TOTAL 4
# define STATS_QEMU_RUN_TIMERS 5
# define STATS_TLB_LOOKUP 6
# define STATS_IRQ_HANDLING 7
# define STATS_RAW_CHECK 8
void remR3ProfileStart(int statcode);
void remR3ProfileStop(int statcode);
#else /* !VBOX_WITH_STATISTICS */
# define remR3ProfileStart(c) do { } while (0)
# define remR3ProfileStop(c) do { } while (0)
#endif /* !VBOX_WITH_STATISTICS */
/** @} */
#endif