iom.h revision afc71ee9d14313aac9881860b235a74d7c8a683e
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IOM - Input / Output Monitor. (VMM)
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync */
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Oracle Corporation
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * available from http://www.virtualbox.org. This file is free software;
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * 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 *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#ifndef ___VBox_iom_h
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#define ___VBox_iom_h
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync#include <VBox/cdefs.h>
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#include <VBox/types.h>
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#include <VBox/dis.h>
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsyncRT_C_DECLS_BEGIN
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/** @defgroup grp_iom The Input / Ouput Monitor API
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @{
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync */
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/** @def IOM_NO_PDMINS_CHECKS
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * Until all devices have been fully adjusted to PDM style, the pPdmIns
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * parameter is not checked by IOM.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @todo Check this again, now.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync */
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync#define IOM_NO_PDMINS_CHECKS
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/**
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * Macro for checking if an I/O or MMIO emulation call succeeded.
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * This macro shall only be used with the IOM APIs where it's mentioned
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * in the return value description. And there is must be used to correctly
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * determin if the call succeeded and things like the EIP needs updating.
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @returns Success indicator (true/false).
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param rc The status code. This may be evaluated
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync * more than once!
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @remark To avoid making assumptions about the layout of the
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * VINF_EM_FIRST...VINF_EM_LAST range we're checking
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * explicitly for each for exach the exceptions.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * However, for efficieny we ASSUME that the
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * VINF_EM_LAST is smaller than most of the relevant
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync * status codes. We also ASSUME that the
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * VINF_EM_RESCHEDULE_REM status code is the most
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * frequent status code we'll enounter in this range.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * @todo Will have to add VINF_EM_DBG_HYPER_BREAKPOINT if the
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * I/O port and MMIO breakpoints should trigger before
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * the I/O is done. Currently, we don't implement these
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * kind of breakpoints.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync */
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync#define IOM_SUCCESS(rc) ( (rc) == VINF_SUCCESS \
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync || ( (rc) <= VINF_EM_LAST \
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync && (rc) != VINF_EM_RESCHEDULE_REM \
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync && (rc) >= VINF_EM_FIRST \
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync && (rc) != VINF_EM_RESCHEDULE_RAW \
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync && (rc) != VINF_EM_RESCHEDULE_HWACC \
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync ) \
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync )
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync/**
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * Port I/O Handler for IN operations.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * @returns VINF_SUCCESS or VINF_EM_*.
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * @returns VERR_IOM_IOPORT_UNUSED if the port is really unused and a ~0 value should be returned.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync * @param pDevIns The device instance.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param pvUser User argument.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param uPort Port number used for the IN operation.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param pu32 Where to store the result. This is always a 32-bit
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * variable regardless of what @a cb might say.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param cb Number of bytes read.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync */
40af749e457b7d704c869ea986a042f0d4b6e09avboxsynctypedef DECLCALLBACK(int) FNIOMIOPORTIN(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb);
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync/** Pointer to a FNIOMIOPORTIN(). */
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsynctypedef FNIOMIOPORTIN *PFNIOMIOPORTIN;
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync/**
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * Port I/O Handler for string IN operations.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @returns VINF_SUCCESS or VINF_EM_*.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @returns VERR_IOM_IOPORT_UNUSED if the port is really unused and a ~0 value should be returned.
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync *
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param pDevIns The device instance.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param pvUser User argument.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param uPort Port number used for the IN operation.
cb13ee8e628d04a773894bf4f9e8047d74f2ee21vboxsync * @param pGCPtrDst Pointer to the destination buffer (GC, incremented appropriately).
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param pcTransfers Pointer to the number of transfer units to read, on return remaining transfer units.
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsync * @param cb Size of the transfer unit (1, 2 or 4 bytes).
40af749e457b7d704c869ea986a042f0d4b6e09avboxsync */
07db1daf0ffed7a0fe1224c296fc1e7ac40d7681vboxsynctypedef DECLCALLBACK(int) FNIOMIOPORTINSTRING(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, RTGCPTR *pGCPtrDst, PRTGCUINTREG pcTransfers, unsigned cb);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** Pointer to a FNIOMIOPORTINSTRING(). */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsynctypedef FNIOMIOPORTINSTRING *PFNIOMIOPORTINSTRING;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/**
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * Port I/O Handler for OUT operations.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @returns VINF_SUCCESS or VINF_EM_*.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pDevIns The device instance.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pvUser User argument.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param uPort Port number used for the OUT operation.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param u32 The value to output.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param cb The value size in bytes.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsynctypedef DECLCALLBACK(int) FNIOMIOPORTOUT(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** Pointer to a FNIOMIOPORTOUT(). */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsynctypedef FNIOMIOPORTOUT *PFNIOMIOPORTOUT;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/**
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * Port I/O Handler for string OUT operations.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @returns VINF_SUCCESS or VINF_EM_*.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pDevIns The device instance.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pvUser User argument.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param uPort Port number used for the OUT operation.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param pGCPtrSrc Pointer to the source buffer (GC, incremented appropriately).
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param pcTransfers Pointer to the number of transfer units to write, on return remaining transfer units.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param cb Size of the transfer unit (1, 2 or 4 bytes).
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef DECLCALLBACK(int) FNIOMIOPORTOUTSTRING(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, RTGCPTR *pGCPtrSrc, PRTGCUINTREG pcTransfers, unsigned cb);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/** Pointer to a FNIOMIOPORTOUTSTRING(). */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef FNIOMIOPORTOUTSTRING *PFNIOMIOPORTOUTSTRING;
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/**
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * Memory mapped I/O Handler for read operations.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync *
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @returns VBox status code.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync *
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param pDevIns The device instance.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param pvUser User argument.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param GCPhysAddr Physical address (in GC) where the read starts.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param pv Where to store the result.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param cb Number of bytes read.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync *
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @remark wonder if we could merge the IOMMMIO* and IOMPORT* callbacks...
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef DECLCALLBACK(int) FNIOMMMIOREAD(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/** Pointer to a FNIOMMMIOREAD(). */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef FNIOMMMIOREAD *PFNIOMMMIOREAD;
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/**
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * Port I/O Handler for write operations.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @returns VBox status code.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pDevIns The device instance.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pvUser User argument.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param GCPhysAddr Physical address (in GC) where the read starts.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pv Where to fetch the result.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param cb Number of bytes to write.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @remark wonder if we could merge the IOMMMIO* and IOMPORT* callbacks...
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsynctypedef DECLCALLBACK(int) FNIOMMMIOWRITE(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** Pointer to a FNIOMMMIOWRITE(). */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsynctypedef FNIOMMMIOWRITE *PFNIOMMMIOWRITE;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/**
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * Port I/O Handler for memset operations, actually for REP STOS* instructions handling.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @returns VBox status code.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync *
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pDevIns The device instance.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param pvUser User argument.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @param GCPhysAddr Physical address (in GC) where the write starts.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param u32Item Byte/Word/Dword data to fill.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param cbItem Size of data in u32Item parameter, restricted to 1/2/4 bytes.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @param cItems Number of iterations.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef DECLCALLBACK(int) FNIOMMMIOFILL(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, uint32_t u32Item, unsigned cbItem, unsigned cItems);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/** Pointer to a FNIOMMMIOFILL(). */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsynctypedef FNIOMMMIOFILL *PFNIOMMMIOFILL;
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMIOPortRead(PVM pVM, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMIOPortWrite(PVM pVM, RTIOPORT Port, uint32_t u32Value, size_t cbValue);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretOUT(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretIN(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMIOPortReadString(PVM pVM, RTIOPORT Port, PRTGCPTR pGCPtrDst, PRTGCUINTREG pcTransfers, unsigned cb);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMIOPortWriteString(PVM pVM, RTIOPORT Port, PRTGCPTR pGCPtrSrc, PRTGCUINTREG pcTransfers, unsigned cb);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretINS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretINSEx(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t uPort, uint32_t uPrefix, uint32_t cbTransfer);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretOUTS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretOUTSEx(PVM pVM, PCPUMCTXCORE pRegFrame, uint32_t uPort, uint32_t uPrefix, uint32_t cbTransfer);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMMMIORead(PVM pVM, RTGCPHYS GCPhys, uint32_t *pu32Value, size_t cbValue);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMMMIOWrite(PVM pVM, RTGCPHYS GCPhys, uint32_t u32Value, size_t cbValue);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMMMIOPhysHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pCtxCore, RTGCPHYS GCPhysFault);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(VBOXSTRICTRC) IOMInterpretCheckPortIOAccess(PVM pVM, PCPUMCTXCORE pCtxCore, RTIOPORT Port, unsigned cb);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(int) IOMMMIOMapMMIO2Page(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysRemapped, uint64_t fPageFlags);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(int) IOMMMIOMapMMIOHCPage(PVM pVM, RTGCPHYS GCPhys, RTHCPHYS HCPhys, uint64_t fPageFlags);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(int) IOMMMIOResetRegion(PVM pVM, RTGCPHYS GCPhys);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMDECL(bool) IOMIsLockOwner(PVM pVM);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync#ifdef IN_RC
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/** @defgroup grp_iom_gc The IOM Guest Context API
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @ingroup grp_iom
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * @{
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsyncVMMRCDECL(VBOXSTRICTRC) IOMGCIOPortHandler(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync/** @} */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync#endif /* IN_RC */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#ifdef IN_RING3
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** @defgroup grp_iom_r3 The IOM Host Context Ring-3 API
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @ingroup grp_iom
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * @{
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3Init(PVM pVM);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(void) IOMR3Reset(PVM pVM);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(void) IOMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3Term(PVM pVM);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3IOPortRegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTIOPORT PortStart, RTUINT cPorts, RTHCPTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R3PTRTYPE(PFNIOMIOPORTOUT) pfnOutCallback, R3PTRTYPE(PFNIOMIOPORTIN) pfnInCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R3PTRTYPE(PFNIOMIOPORTOUTSTRING) pfnOutStringCallback, R3PTRTYPE(PFNIOMIOPORTINSTRING) pfnInStringCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync const char *pszDesc);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3IOPortRegisterRC(PVM pVM, PPDMDEVINS pDevIns, RTIOPORT PortStart, RTUINT cPorts, RTRCPTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RCPTRTYPE(PFNIOMIOPORTOUT) pfnOutCallback, RCPTRTYPE(PFNIOMIOPORTIN) pfnInCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RCPTRTYPE(PFNIOMIOPORTOUTSTRING) pfnOutStrCallback, RCPTRTYPE(PFNIOMIOPORTINSTRING) pfnInStrCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync const char *pszDesc);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3IOPortRegisterR0(PVM pVM, PPDMDEVINS pDevIns, RTIOPORT PortStart, RTUINT cPorts, RTR0PTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R0PTRTYPE(PFNIOMIOPORTOUT) pfnOutCallback, R0PTRTYPE(PFNIOMIOPORTIN) pfnInCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R0PTRTYPE(PFNIOMIOPORTOUTSTRING) pfnOutStrCallback, R0PTRTYPE(PFNIOMIOPORTINSTRING) pfnInStrCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync const char *pszDesc);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3IOPortDeregister(PVM pVM, PPDMDEVINS pDevIns, RTIOPORT PortStart, RTUINT cPorts);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R3PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R3PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R3PTRTYPE(PFNIOMMMIOFILL) pfnFillCallback, const char *pszDesc);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3MMIORegisterR0(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R0PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R0PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync R0PTRTYPE(PFNIOMMMIOFILL) pfnFillCallback);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3MMIORegisterRC(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RCPTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RCPTRTYPE(PFNIOMMMIOREAD) pfnReadCallback,
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RCPTRTYPE(PFNIOMMMIOFILL) pfnFillCallback);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(int) IOMR3MMIODeregister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncVMMR3DECL(PPDMCRITSECT) IOMR3GetCritSect(PVM pVM);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** @} */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif /* IN_RING3 */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync/** @} */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncRT_C_DECLS_END
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync