pgm.h revision c1d279fc0865b91a40b30eda02ed14f6533fe1a4
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * PGM - Page Monitor / Monitor.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2006-2015 Oracle Corporation
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The contents of this file may alternatively be used under the terms
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * of the Common Development and Distribution License Version 1.0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VirtualBox OSE distribution, in which case the provisions of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * CDDL are applicable instead of those of the GPL.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * You may elect to license modified versions of this file under the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * terms and conditions of either the GPL or the CDDL or both.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef ___VBox_vmm_pgm_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define ___VBox_vmm_pgm_h
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/types.h>
48d60b042893290a747d3abeda71a3085d9133fdvboxsync#include <VBox/sup.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/vmm/vmapi.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/vmm/gmm.h> /* for PGMMREGISTERSHAREDMODULEREQ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/x86.h>
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync#include <VBox/VMMDev.h> /* for VMMDEVSHAREDREGIONDESC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/param.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_BEGIN
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @defgroup grp_pgm The Page Monitor / Manager API
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * FNPGMRELOCATE callback mode.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef enum PGMRELOCATECALL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The callback is for checking if the suggested address is suitable. */
ffa39e5fea478b00909918ab8d45fb3ffb02bc14vboxsync PGMRELOCATECALL_SUGGEST = 1,
06dc6eb95cf33b2b83f0d07c602d1ca20a575663vboxsync /** The callback is for executing the relocation. */
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync PGMRELOCATECALL_RELOCATE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} PGMRELOCATECALL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Callback function which will be called when PGM is trying to find
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * a new location for the mapping.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The callback is called in two modes, 1) the check mode and 2) the relocate mode.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * In 1) the callback should say if it objects to a suggested new location. If it
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * accepts the new location, it is called again for doing it's relocation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @returns true if the location is ok.
ffa39e5fea478b00909918ab8d45fb3ffb02bc14vboxsync * @returns false if another location should be found.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param GCPtrOld The old virtual address.
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync * @param GCPtrNew The new virtual address.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param enmMode Used to indicate the callback mode.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvUser User argument.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remark The return value is no a failure indicator, it's an acceptance
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * indicator. Relocation can not fail!
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsynctypedef DECLCALLBACK(bool) FNPGMRELOCATE(PVM pVM, RTGCPTR GCPtrOld, RTGCPTR GCPtrNew, PGMRELOCATECALL enmMode, void *pvUser);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync/** Pointer to a relocation callback function. */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsynctypedef FNPGMRELOCATE *PFNPGMRELOCATE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Physical page access handler type.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef enum PGMPHYSHANDLERTYPE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** MMIO range. Pages are not present, all access is done in interpreter or recompiler. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PGMPHYSHANDLERTYPE_MMIO = 1,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Handler all write access to a physical page range. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync /** Handler all access to a physical page range. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PGMPHYSHANDLERTYPE_PHYSICAL_ALL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} PGMPHYSHANDLERTYPE;
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * \#PF Handler callback for physical access handler ranges in RC.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync * @returns VBox status code (appropriate for RC return).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pVM VM Handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param uErrorCode CPU Error code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pRegFrame Trap register frame.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * NULL on DMA and other non CPU access.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvFault The fault address (cr2).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param GCPhysFault The GC physical address corresponding to pvFault.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvUser User argument.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(int) FNPGMRCPHYSHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync/** Pointer to PGM access callback. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef FNPGMRCPHYSHANDLER *PFNPGMRCPHYSHANDLER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * \#PF Handler callback for physical access handler ranges in R0.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync * @returns VBox status code (appropriate for R0 return).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pVM VM Handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param uErrorCode CPU Error code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pRegFrame Trap register frame.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * NULL on DMA and other non CPU access.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvFault The fault address (cr2).
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync * @param GCPhysFault The GC physical address corresponding to pvFault.
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync * @param pvUser User argument.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(int) FNPGMR0PHYSHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync/** Pointer to PGM access callback. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef FNPGMR0PHYSHANDLER *PFNPGMR0PHYSHANDLER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
fa92c704624def98d3c4aca86d65182effb98e04vboxsync/**
fa92c704624def98d3c4aca86d65182effb98e04vboxsync * Guest Access type
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsynctypedef enum PGMACCESSTYPE
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Read access. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PGMACCESSTYPE_READ = 1,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Write access. */
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync PGMACCESSTYPE_WRITE
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync} PGMACCESSTYPE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync * \#PF Handler callback for physical access handler ranges (MMIO among others) in HC.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The handler can not raise any faults, it's mainly for monitoring write access
fa92c704624def98d3c4aca86d65182effb98e04vboxsync * to certain pages.
fa92c704624def98d3c4aca86d65182effb98e04vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns VINF_SUCCESS if the handler have carried out the operation.
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync * @returns VINF_PGM_HANDLER_DO_DEFAULT if the caller should carry out the access operation.
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync * @param pVM VM Handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param GCPhys The physical address the guest is writing to.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvPhys The HC mapping of that address.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvBuf What the guest is reading/writing.
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync * @param cbBuf How much it's reading/writing.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param enmAccessType The access type.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvUser User argument.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @todo Add pVCpu, possibly replacing pVM.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsynctypedef DECLCALLBACK(int) FNPGMR3PHYSHANDLER(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Pointer to PGM access callback. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef FNPGMR3PHYSHANDLER *PFNPGMR3PHYSHANDLER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Virtual access handler type.
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync */
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsynctypedef enum PGMVIRTHANDLERTYPE
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync{
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync /** Write access handled. */
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync PGMVIRTHANDLERTYPE_WRITE = 1,
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync /** All access handled. */
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync PGMVIRTHANDLERTYPE_ALL,
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync /** Hypervisor write access handled.
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync * This is used to catch the guest trying to write to LDT, TSS and any other
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync * system structure which the brain dead intel guys let unprivilegde code find. */
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync PGMVIRTHANDLERTYPE_HYPERVISOR
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync} PGMVIRTHANDLERTYPE;
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * \#PF Handler callback for virtual access handler ranges, RC.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Important to realize that a physical page in a range can have aliases, and
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * for ALL and WRITE handlers these will also trigger.
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns VBox status code (appropriate for GC return).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pVM VM Handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param uErrorCode CPU Error code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pRegFrame Trap register frame.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvFault The fault address (cr2).
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync * @param pvRange The base address of the handled virtual range.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param offRange The offset of the access into this range.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * (If it's a EIP range this is the EIP, if not it's pvFault.)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @todo Add pVCpu, possibly replacing pVM.
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(int) FNPGMRCVIRTHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Pointer to PGM access callback. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef FNPGMRCVIRTHANDLER *PFNPGMRCVIRTHANDLER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync/**
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync * \#PF Handler callback for virtual access handler ranges, R3.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync *
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * Important to realize that a physical page in a range can have aliases, and
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync * for ALL and WRITE handlers these will also trigger.
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync *
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync * @returns VINF_SUCCESS if the handler have carried out the operation.
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync * @returns VINF_PGM_HANDLER_DO_DEFAULT if the caller should carry out the access operation.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @param pVM VM Handle.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @param GCPtr The virtual address the guest is writing to. (not correct if it's an alias!)
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @param pvPtr The HC mapping of that address.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @param pvBuf What the guest is reading/writing.
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync * @param cbBuf How much it's reading/writing.
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync * @param enmAccessType The access type.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @param pvUser User argument.
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync * @todo Add pVCpu, possibly replacing pVM.
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync */
5eca6b757429b1f1d768e16fba65c485af34319dvboxsynctypedef DECLCALLBACK(int) FNPGMR3VIRTHANDLER(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync/** Pointer to PGM access callback. */
5eca6b757429b1f1d768e16fba65c485af34319dvboxsynctypedef FNPGMR3VIRTHANDLER *PFNPGMR3VIRTHANDLER;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * \#PF Handler callback for invalidation of virtual access handler ranges.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pVM VM Handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param GCPtr The virtual address the guest has changed.
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsync */
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsynctypedef DECLCALLBACK(int) FNPGMR3VIRTINVALIDATE(PVM pVM, RTGCPTR GCPtr);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync/** Pointer to PGM invalidation callback. */
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsynctypedef FNPGMR3VIRTINVALIDATE *PFNPGMR3VIRTINVALIDATE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsync * PGMR3PhysEnumDirtyFTPages callback for syncing dirty physical pages
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync *
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync * @param pVM VM Handle.
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync * @param GCPhys GC physical address
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync * @param pRange HC virtual address of the page(s)
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync * @param cbRange Size of the dirty range in bytes.
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync * @param pvUser User argument.
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(int) FNPGMENUMDIRTYFTPAGES(PVM pVM, RTGCPHYS GCPhys, uint8_t *pRange, unsigned cbRange, void *pvUser);
43d3e60a2bcef646da0887a845e67c3a47759158vboxsync/** Pointer to PGMR3PhysEnumDirtyFTPages callback. */
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsynctypedef FNPGMENUMDIRTYFTPAGES *PFNPGMENUMDIRTYFTPAGES;
48d60b042893290a747d3abeda71a3085d9133fdvboxsync
48d60b042893290a747d3abeda71a3085d9133fdvboxsync/**
48d60b042893290a747d3abeda71a3085d9133fdvboxsync * Paging mode.
48d60b042893290a747d3abeda71a3085d9133fdvboxsync */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsynctypedef enum PGMMODE
48d60b042893290a747d3abeda71a3085d9133fdvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The usual invalid value. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PGMMODE_INVALID = 0,
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync /** Real mode. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync PGMMODE_REAL,
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /** Protected mode, no paging. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync PGMMODE_PROTECTED,
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /** 32-bit paging. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync PGMMODE_32_BIT,
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /** PAE paging. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync PGMMODE_PAE,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** PAE paging with NX enabled. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_PAE_NX,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /** 64-bit AMD paging (long mode). */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_AMD64,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /** 64-bit AMD paging (long mode) with NX enabled. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_AMD64_NX,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /** Nested paging mode (shadow only; guest physical to host physical). */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_NESTED,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /** Extended paging (Intel) mode. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_EPT,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /** The max number of modes */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_MAX,
8b43c87d70eb66ea6a484c18d7c23f2bc733e134vboxsync /** 32bit hackishness. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PGMMODE_32BIT_HACK = 0x7fffffff
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync} PGMMODE;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** Macro for checking if the guest is using paging.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @param enmMode PGMMODE_*.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @remark ASSUMES certain order of the PGMMODE_* values.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#define PGMMODE_WITH_PAGING(enmMode) ((enmMode) >= PGMMODE_32_BIT)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** Macro for checking if it's one of the long mode modes.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @param enmMode PGMMODE_*.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#define PGMMODE_IS_LONG_MODE(enmMode) ((enmMode) == PGMMODE_AMD64_NX || (enmMode) == PGMMODE_AMD64)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsync/**
43d3e60a2bcef646da0887a845e67c3a47759158vboxsync * Is the ROM mapped (true) or is the shadow RAM mapped (false).
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @returns boolean.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @param enmProt The PGMROMPROT value, must be valid.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync#define PGMROMPROT_IS_ROM(enmProt) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ( (enmProt) == PGMROMPROT_READ_ROM_WRITE_IGNORE \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || (enmProt) == PGMROMPROT_READ_ROM_WRITE_RAM )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(bool) PGMIsLockOwner(PVM pVM);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(int) PGMRegisterStringFormatTypes(void);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(void) PGMDeregisterStringFormatTypes(void);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(RTHCPHYS) PGMGetHyperCR3(PVMCPU pVCpu);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(RTHCPHYS) PGMGetNestedCR3(PVMCPU pVCpu, PGMMODE enmShadowMode);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(RTHCPHYS) PGMGetInterHCCR3(PVM pVM);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(RTHCPHYS) PGMGetInterRCCR3(PVM pVM, PVMCPU pVCpu);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(RTHCPHYS) PGMGetInter32BitCR3(PVM pVM);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(RTHCPHYS) PGMGetInterPaeCR3(PVM pVM);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(RTHCPHYS) PGMGetInterAmd64CR3(PVM pVM);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMTrap0eHandler(PVMCPU pVCpu, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMPrefetchPage(PVMCPU pVCpu, RTGCPTR GCPtrPage);
da2ac963e5567d049d02bad0ad7783a0b9181637vboxsyncVMMDECL(int) PGMVerifyAccess(PVMCPU pVCpu, RTGCPTR Addr, uint32_t cbSize, uint32_t fAccess);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMIsValidAccess(PVMCPU pVCpu, RTGCPTR Addr, uint32_t cbSize, uint32_t fAccess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(VBOXSTRICTRC) PGMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMMap(PVM pVM, RTGCPTR GCPtr, RTHCPHYS HCPhys, uint32_t cbPages, unsigned fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMMapGetPage(PVM pVM, RTGCPTR GCPtr, uint64_t *pfFlags, PRTHCPHYS pHCPhys);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMDECL(int) PGMMapSetPage(PVM pVM, RTGCPTR GCPtr, uint64_t cb, uint64_t fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMMapModifyPage(PVM pVM, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RING0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(bool) PGMMapHasConflicts(PVM pVM);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync#endif
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync#ifdef VBOX_STRICT
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(void) PGMMapCheck(PVM pVM);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync#endif
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(int) PGMShwGetPage(PVMCPU pVCpu, RTGCPTR GCPtr, uint64_t *pfFlags, PRTHCPHYS pHCPhys);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(int) PGMShwMakePageReadonly(PVMCPU pVCpu, RTGCPTR GCPtr, uint32_t fFlags);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(int) PGMShwMakePageWritable(PVMCPU pVCpu, RTGCPTR GCPtr, uint32_t fFlags);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsyncVMMDECL(int) PGMShwMakePageNotPresent(PVMCPU pVCpu, RTGCPTR GCPtr, uint32_t fFlags);
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync/** @name Flags for PGMShwMakePageReadonly, PGMShwMakePageWritable and
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync * PGMShwMakePageNotPresent
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync * @{ */
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync/** The call is from an access handler for dealing with the a faulting write
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync * operation. The virtual address is within the same page. */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync#define PGM_MK_PG_IS_WRITE_FAULT RT_BIT(0)
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync/** The page is an MMIO2. */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync#define PGM_MK_PG_IS_MMIO2 RT_BIT(1)
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync/** @}*/
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMGstGetPage(PVMCPU pVCpu, RTGCPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(bool) PGMGstIsPagePresent(PVMCPU pVCpu, RTGCPTR GCPtr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMGstSetPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMGstModifyPage(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMM_INT_DECL(int) PGMGstGetPaePdpes(PVMCPU pVCpu, PX86PDPE paPdpes);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMM_INT_DECL(void) PGMGstUpdatePaePdpes(PVMCPU pVCpu, PCX86PDPE paPdpes);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMInvalidatePage(PVMCPU pVCpu, RTGCPTR GCPtrPage);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsyncVMMDECL(int) PGMFlushTLB(PVMCPU pVCpu, uint64_t cr3, bool fGlobal);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMSyncCR3(PVMCPU pVCpu, uint64_t cr0, uint64_t cr3, uint64_t cr4, bool fGlobal);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMUpdateCR3(PVMCPU pVCpu, uint64_t cr3);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMChangeMode(PVMCPU pVCpu, uint64_t cr0, uint64_t cr4, uint64_t efer);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMDECL(void) PGMCr0WpEnabled(PVMCPU pVCpu);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(PGMMODE) PGMGetGuestMode(PVMCPU pVCpu);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(PGMMODE) PGMGetShadowMode(PVMCPU pVCpu);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(PGMMODE) PGMGetHostMode(PVM pVM);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsyncVMMDECL(const char *) PGMGetModeName(PGMMODE enmMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMM_INT_DECL(void) PGMNotifyNxeChanged(PVMCPU pVCpu, bool fNxe);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(bool) PGMHasDirtyPages(PVM pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R3PTRTYPE(const char *) pszDesc);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalDeregister(PVM pVM, RTGCPHYS GCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalChangeCallbacks(PVM pVM, RTGCPHYS GCPhys,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync R3PTRTYPE(const char *) pszDesc);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalSplit(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysSplit);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalJoin(PVM pVM, RTGCPHYS GCPhys1, RTGCPHYS GCPhys2);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalPageTempOff(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalPageAlias(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTGCPHYS GCPhysPageRemap);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalPageAliasHC(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTHCPHYS HCPhysPageRemap);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(int) PGMHandlerPhysicalReset(PVM pVM, RTGCPHYS GCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(bool) PGMHandlerPhysicalIsRegistered(PVM pVM, RTGCPHYS GCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(bool) PGMHandlerVirtualIsRegistered(PVM pVM, RTGCPTR GCPtr);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(bool) PGMPhysIsA20Enabled(PVMCPU pVCpu);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(bool) PGMPhysIsGCPhysValid(PVM pVM, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(bool) PGMPhysIsGCPhysNormal(PVM pVM, RTGCPHYS GCPhys);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMDECL(int) PGMPhysGCPtr2GCPhys(PVMCPU pVCpu, RTGCPTR GCPtr, PRTGCPHYS pGCPhys);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsyncVMMDECL(void) PGMPhysReleasePageMappingLock(PVM pVM, PPGMPAGEMAPLOCK pLock);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMPhysRead(PVM pVM, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMPhysWrite(PVM pVM, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMPhysSimpleReadGCPhys(PVM pVM, void *pvDst, RTGCPHYS GCPhysSrc, size_t cb);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMPhysSimpleWriteGCPhys(PVM pVM, RTGCPHYS GCPhysDst, const void *pvSrc, size_t cb);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMDECL(int) PGMPhysSimpleReadGCPtr(PVMCPU pVCpu, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
e17f587595bd5d3a7be56a892e3fd3a0ef83d268vboxsyncVMMDECL(int) PGMPhysSimpleWriteGCPtr(PVMCPU pVCpu, RTGCPTR GCPtrDst, const void *pvSrc, size_t cb);
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsyncVMMDECL(int) PGMPhysReadGCPtr(PVMCPU pVCpu, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
ef5b48babdb77b6bcc17a490cbbd0eef5e46e9fcvboxsyncVMMDECL(int) PGMPhysWriteGCPtr(PVMCPU pVCpu, RTGCPTR GCPtrDst, const void *pvSrc, size_t cb);
ef5b48babdb77b6bcc17a490cbbd0eef5e46e9fcvboxsyncVMMDECL(int) PGMPhysSimpleDirtyWriteGCPtr(PVMCPU pVCpu, RTGCPTR GCPtrDst, const void *pvSrc, size_t cb);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsyncVMMDECL(int) PGMPhysInterpretedRead(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsyncVMMDECL(int) PGMPhysInterpretedReadNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCUINTPTR GCPtrSrc, size_t cb, bool fRaiseTrap);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsyncVMMDECL(int) PGMPhysInterpretedWriteNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, RTGCPTR GCPtrDst, void const *pvSrc, size_t cb, bool fRaiseTrap);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, PVMCPU pVCpu, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers, void **ppv, PPGMPAGEMAPLOCK pLock);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMM_INT_DECL(int) PGMPhysIemQueryAccess(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync#ifdef VBOX_STRICT
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(unsigned) PGMAssertHandlerAndFlagsInSync(PVM pVM);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(unsigned) PGMAssertNoMappingConflicts(PVM pVM);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(unsigned) PGMAssertCR3(PVM pVM, PVMCPU pVCpu, uint64_t cr3, uint64_t cr4);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync#endif /* VBOX_STRICT */
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync
3c292c68aeb0a95090706381edf33b886c81afd1vboxsync#if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE)
3c292c68aeb0a95090706381edf33b886c81afd1vboxsyncVMMDECL(void) PGMRZDynMapStartAutoSet(PVMCPU pVCpu);
3c292c68aeb0a95090706381edf33b886c81afd1vboxsyncVMMDECL(void) PGMRZDynMapReleaseAutoSet(PVMCPU pVCpu);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(void) PGMRZDynMapFlushAutoSet(PVMCPU pVCpu);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(uint32_t) PGMRZDynMapPushAutoSubset(PVMCPU pVCpu);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncVMMDECL(void) PGMRZDynMapPopAutoSubset(PVMCPU pVCpu, uint32_t iPrevSubset);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync#endif
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsyncVMMDECL(int) PGMSetLargePageUsage(PVM pVM, bool fUseLargePages);
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync/**
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync * Query large page usage state
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync *
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync * @returns 0 - disabled, 1 - enabled
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync * @param pVM The VM to operate on.
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync */
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync#define PGMIsUsingLargePages(pVM) ((pVM)->fUseLargePages)
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync#ifdef IN_RC
395ac8a20a012656020c61a3975493a65fee0e77vboxsync/** @defgroup grp_pgm_gc The PGM Guest Context API
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync * @{
395ac8a20a012656020c61a3975493a65fee0e77vboxsync */
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsyncVMMRCDECL(int) PGMRCDynMapInit(PVM pVM);
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* IN_RC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync#ifdef IN_RING0
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync/** @defgroup grp_pgm_r0 The PGM Host Context Ring-0 API
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMR0_INT_DECL(int) PGMR0PhysAllocateHandyPages(PVM pVM, PVMCPU pVCpu);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMR0_INT_DECL(int) PGMR0PhysFlushHandyPages(PVM pVM, PVMCPU pVCpu);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMR0_INT_DECL(int) PGMR0PhysAllocateLargeHandyPage(PVM pVM, PVMCPU pVCpu);
e17f587595bd5d3a7be56a892e3fd3a0ef83d268vboxsyncVMMR0_INT_DECL(int) PGMR0PhysSetupIommu(PVM pVM);
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsyncVMMR0DECL(int) PGMR0SharedModuleCheck(PVM pVM, PGVM pGVM, VMCPUID idCpu, PGMMSHAREDMODULE pModule, PCRTGCPTR64 paRegionsGCPtrs);
1bc5a31ae6d57c2b4731a23205f3958678b60193vboxsyncVMMR0DECL(int) PGMR0Trap0eHandlerNestedPaging(PVM pVM, PVMCPU pVCpu, PGMMODE enmShwPagingMode, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPHYS pvFault);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncVMMR0DECL(VBOXSTRICTRC) PGMR0Trap0eHandlerNPMisconfig(PVM pVM, PVMCPU pVCpu, PGMMODE enmShwPagingMode, PCPUMCTXCORE pRegFrame, RTGCPHYS GCPhysFault, uint32_t uErr);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync# ifdef VBOX_WITH_2X_4GB_ADDR_SPACE
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(int) PGMR0DynMapInit(void);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(void) PGMR0DynMapTerm(void);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(int) PGMR0DynMapInitVM(PVM pVM);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(void) PGMR0DynMapTermVM(PVM pVM);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(int) PGMR0DynMapAssertIntegrity(void);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(bool) PGMR0DynMapStartOrMigrateAutoSet(PVMCPU pVCpu);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsyncVMMR0DECL(void) PGMR0DynMapMigrateAutoSet(PVMCPU pVCpu);
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync# endif
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync/** @} */
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync#endif /* IN_RING0 */
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @defgroup grp_pgm_r3 The PGM Host Context Ring-3 API
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync */
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3DECL(int) PGMR3Init(PVM pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3InitDynMap(PVM pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3InitFinalize(PVM pVM);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3_INT_DECL(int) PGMR3InitCompleted(PVM pVM, VMINITCOMPLETED enmWhat);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3DECL(void) PGMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(void) PGMR3ResetCpu(PVM pVM, PVMCPU pVCpu);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3_INT_DECL(void) PGMR3Reset(PVM pVM);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3_INT_DECL(void) PGMR3MemSetup(PVM pVM, bool fReset);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3Term(PVM pVM);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3LockCall(PVM pVM);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3DECL(int) PGMR3ChangeMode(PVM pVM, PVMCPU pVCpu, PGMMODE enmGuestMode);
b0d29fd0a868929a608ff72658aac997cc95319avboxsync
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3PhysRegisterRam(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, const char *pszDesc);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3PhysChangeMemBalloon(PVM pVM, bool fInflate, unsigned cPages, RTGCPHYS *paPhysPage);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3DECL(int) PGMR3PhysWriteProtectRAM(PVM pVM);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3PhysEnumDirtyFTPages(PVM pVM, PFNPGMENUMDIRTYFTPAGES pfnEnum, void *pvUser);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(uint32_t) PGMR3PhysGetRamRangeCount(PVM pVM);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3PhysGetRange(PVM pVM, uint32_t iRange, PRTGCPHYS pGCPhysStart, PRTGCPHYS pGCPhysLast,
b0d29fd0a868929a608ff72658aac997cc95319avboxsync const char **ppszDesc, bool *pfIsMmio);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsyncVMMR3DECL(int) PGMR3QueryMemoryStats(PUVM pUVM, uint64_t *pcbTotalMem, uint64_t *pcbPrivateMem, uint64_t *pcbSharedMem, uint64_t *pcbZeroMem);
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncVMMR3DECL(int) PGMR3QueryGlobalMemoryStats(PUVM pUVM, uint64_t *pcbAllocMem, uint64_t *pcbFreeMem, uint64_t *pcbBallonedMem, uint64_t *pcbSharedMem);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync R3PTRTYPE(const char *) pszDesc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIODeregister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2Deregister(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2Map(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2Unmap(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS GCPhys);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMR3DECL(bool) PGMR3PhysMMIO2IsBase(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2GetHCPhys(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS off, PRTHCPHYS pHCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysMMIO2MapKernel(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS off, RTGCPHYS cb, const char *pszDesc, PRTR0PTR pR0Ptr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync/** @name PGMR3PhysRegisterRom flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Inidicates that ROM shadowing should be enabled. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PGMPHYS_ROM_FLAGS_SHADOWED RT_BIT_32(0)
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync/** Indicates that what pvBinary points to won't go away
6c83eb6b98d1dd1b1d9795c16801ee2f53d2cc31vboxsync * and can be used for strictness checks. */
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsync#define PGMPHYS_ROM_FLAGS_PERMANENT_BINARY RT_BIT_32(1)
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsync/** @} */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsyncVMMR3DECL(int) PGMR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPHYS cb,
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsync const void *pvBinary, uint32_t cbBinary, uint32_t fFlags, const char *pszDesc);
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsyncVMMR3DECL(int) PGMR3PhysRomProtect(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, PGMROMPROT enmProt);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3PhysRegister(PVM pVM, void *pvRam, RTGCPHYS GCPhys, size_t cb, unsigned fFlags, const SUPPAGE *paPages, const char *pszDesc);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMDECL(void) PGMR3PhysSetA20(PVMCPU pVCpu, bool fEnable);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** @name PGMR3MapPT flags.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @{ */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** The mapping may be unmapped later. The default is permanent mappings. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#define PGMR3MAPPT_FLAGS_UNMAPPABLE RT_BIT(0)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** @} */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MapPT(PVM pVM, RTGCPTR GCPtr, uint32_t cb, uint32_t fFlags, PFNPGMRELOCATE pfnRelocate, void *pvUser, const char *pszDesc);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3UnmapPT(PVM pVM, RTGCPTR GCPtr);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3FinalizeMappings(PVM pVM);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MappingsSize(PVM pVM, uint32_t *pcb);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MappingsFix(PVM pVM, RTGCPTR GCPtrBase, uint32_t cb);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MappingsUnfix(PVM pVM);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(bool) PGMR3MappingsNeedReFixing(PVM pVM);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#if defined(VBOX_WITH_RAW_MODE) || (HC_ARCH_BITS != 64 && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL))
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MapIntermediate(PVM pVM, RTUINTPTR Addr, RTHCPHYS HCPhys, unsigned cbPages);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#endif
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3MapRead(PVM pVM, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsync
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsyncVMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PFNPGMR3PHYSHANDLER pfnHandlerR3, void *pvUserR3,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync const char *pszModR0, const char *pszHandlerR0, RTR0PTR pvUserR0,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync const char *pszModRC, const char *pszHandlerRC, RTRCPTR pvUserRC, const char *pszDesc);
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsyncVMMDECL(int) PGMR3HandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3,
86b620001857a05e9e7b83b11525094c34637e23vboxsync R3PTRTYPE(PFNPGMR3VIRTHANDLER) pfnHandlerR3,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync RCPTRTYPE(PFNPGMRCVIRTHANDLER) pfnHandlerRC,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync R3PTRTYPE(const char *) pszDesc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3HandlerVirtualRegister(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PFNPGMR3VIRTHANDLER pfnHandlerR3,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszHandlerRC, const char *pszModRC, const char *pszDesc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMDECL(int) PGMHandlerVirtualDeregister(PVM pVM, RTGCPTR GCPtr);
86b620001857a05e9e7b83b11525094c34637e23vboxsyncVMMR3DECL(int) PGMR3PoolGrow(PVM pVM);
86b620001857a05e9e7b83b11525094c34637e23vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysTlbGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, void **ppv);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(uint8_t) PGMR3PhysReadU8(PVM pVM, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(uint16_t) PGMR3PhysReadU16(PVM pVM, RTGCPHYS GCPhys);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMR3DECL(uint32_t) PGMR3PhysReadU32(PVM pVM, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(uint64_t) PGMR3PhysReadU64(PVM pVM, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(void) PGMR3PhysWriteU8(PVM pVM, RTGCPHYS GCPhys, uint8_t Value);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(void) PGMR3PhysWriteU16(PVM pVM, RTGCPHYS GCPhys, uint16_t Value);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsyncVMMR3DECL(void) PGMR3PhysWriteU32(PVM pVM, RTGCPHYS GCPhys, uint32_t Value);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(void) PGMR3PhysWriteU64(PVM pVM, RTGCPHYS GCPhys, uint64_t Value);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysReadExternal(PVM pVM, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysWriteExternal(PVM pVM, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite, const char *pszWho);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMR3DECL(int) PGMR3PhysGCPhys2CCPtrExternal(PVM pVM, RTGCPHYS GCPhys, void **ppv, PPGMPAGEMAPLOCK pLock);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysGCPhys2CCPtrReadOnlyExternal(PVM pVM, RTGCPHYS GCPhys, void const **ppv, PPGMPAGEMAPLOCK pLock);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysChunkMap(PVM pVM, uint32_t idChunk);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(void) PGMR3PhysChunkInvalidateTLB(PVM pVM);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsyncVMMR3DECL(int) PGMR3PhysAllocateHandyPages(PVM pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3PhysAllocateLargeHandyPage(PVM pVM, RTGCPHYS GCPhys);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3CheckIntegrity(PVM pVM);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3DbgR3Ptr2GCPhys(PUVM pUVM, RTR3PTR R3Ptr, PRTGCPHYS pGCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3DbgR3Ptr2HCPhys(PUVM pUVM, RTR3PTR R3Ptr, PRTHCPHYS pHCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3DbgHCPhys2GCPhys(PUVM pUVM, RTHCPHYS HCPhys, PRTGCPHYS pGCPhys);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgReadGCPhys(PVM pVM, void *pvDst, RTGCPHYS GCPhysSrc, size_t cb, uint32_t fFlags, size_t *pcbRead);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgWriteGCPhys(PVM pVM, RTGCPHYS GCPhysDst, const void *pvSrc, size_t cb, uint32_t fFlags, size_t *pcbWritten);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgReadGCPtr(PVM pVM, void *pvDst, RTGCPTR GCPtrSrc, size_t cb, uint32_t fFlags, size_t *pcbRead);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgWriteGCPtr(PVM pVM, RTGCPTR GCPtrDst, void const *pvSrc, size_t cb, uint32_t fFlags, size_t *pcbWritten);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgScanPhysical(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cbRange, RTGCPHYS GCPhysAlign, const uint8_t *pabNeedle, size_t cbNeedle, PRTGCPHYS pGCPhysHit);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DbgScanVirtual(PVM pVM, PVMCPU pVCpu, RTGCPTR GCPtr, RTGCPTR cbRange, RTGCPTR GCPtrAlign, const uint8_t *pabNeedle, size_t cbNeedle, PRTGCUINTPTR pGCPhysHit);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DumpHierarchyShw(PVM pVM, uint64_t cr3, uint32_t fFlags, uint64_t u64FirstAddr, uint64_t u64LastAddr, uint32_t cMaxDepth, PCDBGFINFOHLP pHlp);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3_INT_DECL(int) PGMR3DumpHierarchyGst(PVM pVM, uint64_t cr3, uint32_t fFlags, RTGCPTR FirstAddr, RTGCPTR LastAddr, uint32_t cMaxDepth, PCDBGFINFOHLP pHlp);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/** @name Page sharing
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3SharedModuleRegister(PVM pVM, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync RTGCPTR GCBaseAddr, uint32_t cbModule,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync uint32_t cRegions, VMMDEVSHAREDREGIONDESC const *paRegions);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncVMMR3DECL(int) PGMR3SharedModuleUnregister(PVM pVM, char *pszModuleName, char *pszVersion,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTGCPTR GCBaseAddr, uint32_t cbModule);
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsyncVMMR3DECL(int) PGMR3SharedModuleCheckAll(PVM pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVMMR3DECL(int) PGMR3SharedModuleGetPageState(PVM pVM, RTGCPTR GCPtrPage, bool *pfShared, uint64_t *pfPageFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync#endif /* IN_RING3 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_END
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ce666b71b4eb6477625b0057689a08aaa7c11b64vboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync