pgm.h revision 13b9db9ae2c12b6c4e00eda5c79772d57a0d29e1
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * PGM - Page Monitor / Monitor. (VMM)
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * available from http://www.virtualbox.org. This file is free software;
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * General Public License (GPL) as published by the Free Software
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b52c24239bed9dc9f284d829b6059073afcb1894vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * The contents of this file may alternatively be used under the terms
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * of the Common Development and Distribution License Version 1.0
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * CDDL are applicable instead of those of the GPL.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * You may elect to license modified versions of this file under the
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * terms and conditions of either the GPL or the CDDL or both.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * additional information or have any questions.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** @defgroup grp_pgm The Page Monitor / Manager API
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Chunk size for dynamically allocated physical memory. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Shift GC physical address by 20 bits to get the offset into the pvHCChunkHC array. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Dynamic chunk offset mask. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Dynamic chunk base mask. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync#define PGM_DYNAMIC_CHUNK_BASE_MASK (~(RTGCPHYS)PGM_DYNAMIC_CHUNK_OFFSET_MASK)
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * FNPGMRELOCATE callback mode.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** The callback is for checking if the suggested address is suitable. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** The callback is for executing the relocation. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Callback function which will be called when PGM is trying to find
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * a new location for the mapping.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * The callback is called in two modes, 1) the check mode and 2) the relocate mode.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * In 1) the callback should say if it objects to a suggested new location. If it
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * accepts the new location, it is called again for doing it's relocation.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns true if the location is ok.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns false if another location should be found.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param GCPtrOld The old virtual address.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param GCPtrNew The new virtual address.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param enmMode Used to indicate the callback mode.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvUser User argument.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @remark The return value is no a failure indicator, it's an acceptance
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * indicator. Relocation can not fail!
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(bool) FNPGMRELOCATE(PVM pVM, RTGCPTR GCPtrOld, RTGCPTR GCPtrNew, PGMRELOCATECALL enmMode, void *pvUser);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Pointer to a relocation callback function. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Physical page access handler type.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** MMIO range. Pages are not present, all access is done in interpreter or recompiler. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Handler all write access to a physical page range. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Handler all access to a physical page range. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * \#PF Handler callback for physical access handler ranges in RC.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns VBox status code (appropriate for RC return).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pVM VM Handle.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param uErrorCode CPU Error code.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pRegFrame Trap register frame.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * NULL on DMA and other non CPU access.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvFault The fault address (cr2).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param GCPhysFault The GC physical address corresponding to pvFault.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvUser User argument.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(int) FNPGMRCPHYSHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Pointer to PGM access callback. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * \#PF Handler callback for physical access handler ranges in R0.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns VBox status code (appropriate for R0 return).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pVM VM Handle.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param uErrorCode CPU Error code.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pRegFrame Trap register frame.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * NULL on DMA and other non CPU access.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvFault The fault address (cr2).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param GCPhysFault The GC physical address corresponding to pvFault.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvUser User argument.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(int) FNPGMR0PHYSHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Pointer to PGM access callback. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Guest Access type
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Read access. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Write access. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * \#PF Handler callback for physical access handler ranges (MMIO among others) in HC.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * The handler can not raise any faults, it's mainly for monitoring write access
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * to certain pages.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns VINF_SUCCESS if the handler have carried out the operation.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns VINF_PGM_HANDLER_DO_DEFAULT if the caller should carry out the access operation.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pVM VM Handle.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param GCPhys The physical address the guest is writing to.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvPhys The HC mapping of that address.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvBuf What the guest is reading/writing.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param cbBuf How much it's reading/writing.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param enmAccessType The access type.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvUser User argument.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(int) FNPGMR3PHYSHANDLER(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Pointer to PGM access callback. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Virtual access handler type.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Write access handled. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** All access handled. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** Hypervisor write access handled.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * This is used to catch the guest trying to write to LDT, TSS and any other
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * system structure which the brain dead intel guys let unprivilegde code find. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * \#PF Handler callback for virtual access handler ranges, RC.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * Important to realize that a physical page in a range can have aliases, and
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * for ALL and WRITE handlers these will also trigger.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @returns VBox status code (appropriate for GC return).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pVM VM Handle.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param uErrorCode CPU Error code.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param pRegFrame Trap register frame.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvFault The fault address (cr2).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param pvRange The base address of the handled virtual range.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param offRange The offset of the access into this range.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * (If it's a EIP range this's the EIP, if not it's pvFault.)
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(int) FNPGMRCVIRTHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Pointer to PGM access callback. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * \#PF Handler callback for virtual access handler ranges, R3.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Important to realize that a physical page in a range can have aliases, and
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * for ALL and WRITE handlers these will also trigger.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @returns VINF_SUCCESS if the handler have carried out the operation.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns VINF_PGM_HANDLER_DO_DEFAULT if the caller should carry out the access operation.
dcc837f3a6f10996beb8aa7965f67f7f6c273fb4vboxsync * @param pVM VM Handle.
dcc837f3a6f10996beb8aa7965f67f7f6c273fb4vboxsync * @param GCPtr The virtual address the guest is writing to. (not correct if it's an alias!)
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param pvPtr The HC mapping of that address.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param pvBuf What the guest is reading/writing.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param cbBuf How much it's reading/writing.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param enmAccessType The access type.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param pvUser User argument.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsynctypedef DECLCALLBACK(int) FNPGMR3VIRTHANDLER(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync/** Pointer to PGM access callback. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * \#PF Handler callback for invalidation of virtual access handler ranges.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param pVM VM Handle.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * @param GCPtr The virtual address the guest has changed.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsynctypedef DECLCALLBACK(int) FNPGMR3VIRTINVALIDATE(PVM pVM, RTGCPTR GCPtr);
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync/** Pointer to PGM invalidation callback. */
dcc837f3a6f10996beb8aa7965f67f7f6c273fb4vboxsynctypedef FNPGMR3VIRTINVALIDATE *PFNPGMR3VIRTINVALIDATE;
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync * Paging mode.
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** The usual invalid value. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** Real mode. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** Protected mode, no paging. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync /** 32-bit paging. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** PAE paging. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** PAE paging with NX enabled. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** 64-bit AMD paging (long mode). */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** 64-bit AMD paging (long mode) with NX enabled. */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** Nested paging mode (shadow only; guest physical to host physical). */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** Extended paging (Intel) mode. */
2782c227354d0c29f08a7933a07f8aa9b30e010dvboxsync /** The max number of modes */
8c1c3e6cfb2f0d0c4656d1d03ada68a8318ca11fvboxsync /** 32bit hackishness. */
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Macro for checking if the guest is using paging.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param enmMode PGMMODE_*.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @remark ASSUMES certain order of the PGMMODE_* values.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync#define PGMMODE_WITH_PAGING(enmMode) ((enmMode) >= PGMMODE_32_BIT)
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync/** Macro for checking if it's one of the long mode modes.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param enmMode PGMMODE_*.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync#define PGMMODE_IS_LONG_MODE(enmMode) ((enmMode) == PGMMODE_AMD64_NX || (enmMode) == PGMMODE_AMD64)
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * Is the ROM mapped (true) or is the shadow RAM mapped (false).
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @returns boolean.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsync * @param enmProt The PGMROMPROT value, must be valid.
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(RTHCPHYS) PGMGetNestedCR3(PVMCPU pVCpu, PGMMODE enmShadowMode);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(RTHCPHYS) PGMGetInterRCCR3(PVM pVM, PVMCPU pVCpu);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMTrap0eHandler(PVMCPU pVCpu, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMPrefetchPage(PVMCPU pVCpu, RTGCPTR GCPtrPage);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMVerifyAccess(PVMCPU pVCpu, RTGCPTR Addr, uint32_t cbSize, uint32_t fAccess);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMIsValidAccess(PVMCPU pVCpu, RTGCPTR Addr, uint32_t cbSize, uint32_t fAccess);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMMap(PVM pVM, RTGCPTR GCPtr, RTHCPHYS HCPhys, uint32_t cbPages, unsigned fFlags);
dcc837f3a6f10996beb8aa7965f67f7f6c273fb4vboxsyncVMMDECL(int) PGMMapSetPage(PVM pVM, RTGCPTR GCPtr, uint64_t cb, uint64_t fFlags);
dcc837f3a6f10996beb8aa7965f67f7f6c273fb4vboxsyncVMMDECL(int) PGMMapModifyPage(PVM pVM, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMShwGetPage(PVMCPU pVCpu, RTGCPTR GCPtr, uint64_t *pfFlags, PRTHCPHYS pHCPhys);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMShwSetPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMShwModifyPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMGstGetPage(PVMCPU pVCpu, RTGCPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(bool) PGMGstIsPagePresent(PVMCPU pVCpu, RTGCPTR GCPtr);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMGstSetPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMGstModifyPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(X86PDPE) PGMGstGetPaePDPtr(PVMCPU pVCpu, unsigned iPdPt);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMInvalidatePage(PVMCPU pVCpu, RTGCPTR GCPtrPage);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMFlushTLB(PVMCPU pVCpu, uint64_t cr3, bool fGlobal);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMSyncCR3(PVMCPU pVCpu, uint64_t cr0, uint64_t cr3, uint64_t cr4, bool fGlobal);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMUpdateCR3(PVMCPU pVCpu, uint64_t cr3);
730b109e93240f48a2fc4ca97c05e5f347f71ec9vboxsyncVMMDECL(int) PGMChangeMode(PVMCPU pVCpu, uint64_t cr0, uint64_t cr4, uint64_t efer);
VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast);
VMMDECL(int) PGMHandlerPhysicalPageAlias(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTGCPHYS GCPhysPageRemap);
VMMDECL(int) PGMHandlerPhysicalPageAliasHC(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTHCPHYS HCPhysPageRemap);
VMMDECL(int) PGMPhysGCPhys2CCPtrReadOnly(PVM pVM, RTGCPHYS GCPhys, void const **ppv, PPGMPAGEMAPLOCK pLock);
VMMDECL(int) PGMPhysGCPtr2CCPtrReadOnly(PVMCPU pVCpu, RTGCPTR GCPtr, void const **ppv, PPGMPAGEMAPLOCK pLock);
#ifdef VBOX_STRICT
VMMDECL(int) PGMPhysSimpleDirtyWriteGCPtr(PVMCPU pVCpu, RTGCPTR GCPtrDst, const void *pvSrc, size_t cb);
VMMDECL(int) PGMPhysInterpretedRead(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
VMMDECL(int) PGMPhysInterpretedReadNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCUINTPTR GCPtrSrc, size_t cb, bool fRaiseTrap);
VMMDECL(int) PGMPhysInterpretedWriteNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, RTGCPTR GCPtrDst, void const *pvSrc, size_t cb, bool fRaiseTrap);
#ifdef VBOX_STRICT
# ifdef IN_RC
# ifdef VBOX_STRICT
#ifdef IN_RC
#ifdef IN_RING0
VMMR0DECL(int) PGMR0Trap0eHandlerNestedPaging(PVM pVM, PVMCPU pVCpu, PGMMODE enmShwPagingMode, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPHYS pvFault);
# ifdef VBOX_WITH_2X_4GB_ADDR_SPACE
#ifdef IN_RING3
VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc);
VMMR3DECL(int) PGMR3PhysMMIO2GetHCPhys(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS off, PRTHCPHYS pHCPhys);
VMMR3DECL(int) PGMR3PhysMMIO2MapKernel(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS off, RTGCPHYS cb, const char *pszDesc, PRTR0PTR pR0Ptr);
VMMR3DECL(int) PGMR3PhysRegister(PVM pVM, void *pvRam, RTGCPHYS GCPhys, size_t cb, unsigned fFlags, const SUPPAGE *paPages, const char *pszDesc);
VMMR3DECL(int) PGMR3MapPT(PVM pVM, RTGCPTR GCPtr, uint32_t cb, uint32_t fFlags, PFNPGMRELOCATE pfnRelocate, void *pvUser, const char *pszDesc);
VMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
VMMDECL(int) PGMR3HandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
VMMR3DECL(int) PGMR3HandlerVirtualRegister(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
VMMDECL(int) PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3);
VMMR3DECL(int) PGMR3DumpHierarchyHC(PVM pVM, uint64_t cr3, uint64_t cr4, bool fLongMode, unsigned cMaxDepth, PCDBGFINFOHLP pHlp);
VMMR3DECL(int) PGMR3PhysGCPhys2CCPtrExternal(PVM pVM, RTGCPHYS GCPhys, void **ppv, PPGMPAGEMAPLOCK pLock);
VMMR3DECL(int) PGMR3PhysGCPhys2CCPtrReadOnlyExternal(PVM pVM, RTGCPHYS GCPhys, void const **ppv, PPGMPAGEMAPLOCK pLock);
VMMR3DECL(int) PGMR3DbgReadGCPhys(PVM pVM, void *pvDst, RTGCPHYS GCPhysSrc, size_t cb, uint32_t fFlags, size_t *pcbRead);
VMMR3DECL(int) PGMR3DbgWriteGCPhys(PVM pVM, RTGCPHYS GCPhysDst, const void *pvSrc, size_t cb, uint32_t fFlags, size_t *pcbWritten);
VMMR3DECL(int) PGMR3DbgReadGCPtr(PVM pVM, void *pvDst, RTGCPTR GCPtrSrc, size_t cb, uint32_t fFlags, size_t *pcbRead);
VMMR3DECL(int) PGMR3DbgWriteGCPtr(PVM pVM, RTGCPTR GCPtrDst, void const *pvSrc, size_t cb, uint32_t fFlags, size_t *pcbWritten);
VMMR3DECL(int) PGMR3DbgScanPhysical(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cbRange, const uint8_t *pabNeedle, size_t cbNeedle, PRTGCPHYS pGCPhysHit);