4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $Id$ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM - Internal header file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2006-2013 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef ___PDMInternal_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ___PDMInternal_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/types.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/param.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/cfgm.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/stam.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vusb.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/pdmasynccompletion.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_NETSHAPER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <VBox/vmm/pdmnetshaper.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <VBox/vmm/pdmasynccompletion.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/pdmblkcache.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/pdmcommon.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/sup.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/assert.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/critsect.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <iprt/thread.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_C_DECLS_BEGIN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @defgroup grp_pdm_int Internal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @ingroup grp_pdm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @internal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @def PDM_WITH_R3R0_CRIT_SECT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Enables or disabled ring-3/ring-0 critical sections. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(DOXYGEN_RUNNING) || 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDM_WITH_R3R0_CRIT_SECT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @def PDMCRITSECT_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Enables/disables PDM critsect strictness like deadlock detection. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if (defined(RT_LOCK_STRICT) && defined(IN_RING3) && !defined(IEM_VERIFICATION_MODE) && !defined(PDMCRITSECT_STRICT)) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || defined(DOXYGEN_RUNNING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMCRITSECT_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @def PDMCRITSECT_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Enables/disables PDM read/write critsect strictness like deadlock
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * detection. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if (defined(RT_LOCK_STRICT) && defined(IN_RING3) && !defined(IEM_VERIFICATION_MODE) && !defined(PDMCRITSECTRW_STRICT)) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || defined(DOXYGEN_RUNNING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMCRITSECTRW_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*******************************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Structures and Typedefs *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*******************************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM Device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDEV *PPDMDEV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a pointer to a PDM Device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PPDMDEV *PPPDMDEV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM USB Device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSB *PPDMUSB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a pointer to a PDM USB Device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PPDMUSB *PPPDMUSB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM Driver. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDRV *PPDMDRV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a pointer to a PDM Driver. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PPDMDRV *PPPDMDRV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM Logical Unit. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMLUN *PPDMLUN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a pointer to a PDM Logical Unit. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PPDMLUN *PPPDMLUN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM PCI Bus instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMPCIBUS *PPDMPCIBUS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a DMAC instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDMAC *PPDMDMAC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a RTC instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMRTC *PPDMRTC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to an USB HUB registration record. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSBHUB *PPDMUSBHUB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Supported asynchronous completion endpoint classes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum PDMASYNCCOMPLETIONEPCLASSTYPE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** File class. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMASYNCCOMPLETIONEPCLASSTYPE_FILE = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Number of supported classes. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMASYNCCOMPLETIONEPCLASSTYPE_MAX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** 32bit hack. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMASYNCCOMPLETIONEPCLASSTYPE_32BIT_HACK = 0x7fffffff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMASYNCCOMPLETIONEPCLASSTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private device instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDEVINSINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next instance (HC Ptr).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Head is pointed to by PDM::pDevInstances.) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEVINS) pNextR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next per device instance (HC Ptr).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Head is pointed to by PDMDEV::pInstances.) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEVINS) pPerDeviceNextR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to device structure - HC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEV) pDevR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the list of logical units associated with the device. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMLUN) pLunsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the asynchronous notification callback set while in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FNPDMDEVSUSPEND or FNPDMDEVPOWEROFF. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMDEVASYNCNOTIFY) pfnAsyncNotify;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Configuration handle to the instance node. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PCFGMNODE) pCfgHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 pointer to the VM this instance was created for. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVMR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 pointer to associated PCI device structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PCIDevice *) pPciDeviceR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 pointer to associated PCI bus structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMPCIBUS) pPciBusR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0 pointer to the VM this instance was created for. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR0 pVMR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0 pointer to associated PCI device structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(struct PCIDevice *) pPciDeviceR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0 pointer to associated PCI bus structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(PPDMPCIBUS) pPciBusR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** RC pointer to the VM this instance was created for. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMRC pVMRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** RC pointer to associated PCI device structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(struct PCIDevice *) pPciDeviceRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** RC pointer to associated PCI bus structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(PPDMPCIBUS) pPciBusRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Flags, see PDMDEVINSINT_FLAGS_XXX. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t fIntFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The last IRQ tag (for tracing it thru clearing). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t uLastIrqTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Size padding. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t u32Padding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDEVINSINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @name PDMDEVINSINT::fIntFlags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Used by pdmR3Load to mark device instances it found in the saved state. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMDEVINSINT_FLAGS_FOUND RT_BIT_32(0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Indicates that the device hasn't been powered on or resumed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is used by PDMR3PowerOn, PDMR3Resume, PDMR3Suspend and PDMR3PowerOff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * to make sure each device gets exactly one notification for each of those
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * events. PDMR3Resume and PDMR3PowerOn also makes use of it to bail out on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * a failure (already resumed/powered-on devices are suspended). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMDEVINSINT_FLAGS_SUSPENDED RT_BIT_32(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Indicates that the device has been reset already. Used by PDMR3Reset. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMDEVINSINT_FLAGS_RESET RT_BIT_32(2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private USB device instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSBINSINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The UUID of this instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUUID Uuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Head is pointed to by PDM::pUsbInstances.) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBINS) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next per USB device instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Head is pointed to by PDMUSB::pInstances.) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBINS) pPerDeviceNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to device structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSB) pUsbDev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM this instance was created for. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the list of logical units associated with the device. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMLUN) pLuns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The per instance device configuration. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PCFGMNODE) pCfg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Same as pCfg if the configuration should be deleted when detaching the device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PCFGMNODE) pCfgDelete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The global device configuration. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PCFGMNODE) pCfgGlobal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the USB hub this device is attached to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is NULL if the device isn't connected to any HUB. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBHUB) pHub;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The port number that we're connected to. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t iPort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Indicates that the USB device hasn't been powered on or resumed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * See PDMDEVINSINT_FLAGS_SUSPENDED. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fVMSuspended;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Indicates that the USB device has been reset. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fVMReset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the asynchronous notification callback set while in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FNPDMDEVSUSPEND or FNPDMDEVPOWEROFF. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMUSBASYNCNOTIFY) pfnAsyncNotify;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMUSBINSINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private driver instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDRVINSINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the driver instance above.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is NULL for the topmost drive. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDRVINS) pUp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the driver instance below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is NULL for the bottommost driver. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDRVINS) pDown;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the logical unit this driver chained on. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMLUN) pLun;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to driver structure from which this was instantiated. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDRV) pDrv;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM this instance was created for, ring-3 context. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVMR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM this instance was created for, ring-0 context. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR0 pVMR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM this instance was created for, raw-mode context. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMRC pVMRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Flag indicating that the driver is being detached and destroyed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Helps detect potential recursive detaching.) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fDetaching;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Indicates that the driver hasn't been powered on or resumed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * See PDMDEVINSINT_FLAGS_SUSPENDED. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fVMSuspended;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Indicates that the driver has been reset already. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fVMReset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Set if allocated on the hyper heap, false if on the ring-3 heap. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fHyperHeap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the asynchronous notification callback set while in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDMUSBREG::pfnVMSuspend or PDMUSBREG::pfnVMPowerOff. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMDRVASYNCNOTIFY) pfnAsyncNotify;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Configuration handle to the instance node. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PCFGMNODE) pCfgHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the ring-0 request handler function. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PFNPDMDRVREQHANDLERR0 pfnReqHandlerR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDRVINSINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private critical section data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMCRITSECTINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The critical section core which is shared with IPRT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @note The semaphore is a SUPSEMEVENT. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTCRITSECT Core;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next critical section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This chain is used for relocating pVMRC and device cleanup. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PDMCRITSECTINT *) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Owner identifier.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is pDevIns if the owner is a device. Similarly for a driver or service.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDMR3CritSectInit() sets this to point to the critsect itself. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTR3PTR pvKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R3Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVMR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R0Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR0 pVMR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - GCPtr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMRC pVMRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Set if this critical section is the automatically created default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * section of a device.. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fAutomaticDefaultCritsect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Set if the critical section is used by a timer or similar.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * See PDMR3DevGetCritSect. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool fUsedByTimerOrSimilar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Alignment padding. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bool afPadding[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Event semaphore that is scheduled to be signaled upon leaving the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * critical section. This is Ring-3 only of course. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTSEMEVENT EventToSignal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The lock name. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(const char *) pszName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZLock;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC unlock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZUnlock;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Profiling the time the section is locked. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMPROFILEADV StatLocked;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMCRITSECTINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDMCRITSECTINT, StatContentionRZLock, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to private critical section data. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDMCRITSECTINT *PPDMCRITSECTINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Indicates that the critical section is queued for unlock.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDMCritSectIsOwner and PDMCritSectIsOwned optimizations. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMCRITSECT_FLAGS_PENDING_UNLOCK RT_BIT_32(17)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private critical section data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMCRITSECTRWINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The read/write critical section core which is shared with IPRT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @note The semaphores are SUPSEMEVENT and SUPSEMEVENTMULTI. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTCRITSECTRW Core;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next critical section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This chain is used for relocating pVMRC and device cleanup. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PDMCRITSECTRWINT *) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Owner identifier.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is pDevIns if the owner is a device. Similarly for a driver or service.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDMR3CritSectInit() sets this to point to the critsect itself. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTR3PTR pvKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R3Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVMR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R0Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR0 pVMR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - GCPtr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMRC pVMRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if HC_ARCH_BITS == 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Alignment padding. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTRCPTR RCPtrPadding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The lock name. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(const char *) pszName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC write lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZEnterExcl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC write unlock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZLeaveExcl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC read lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZEnterShared;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC read unlock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionRZLeaveShared;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC writes. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatRZEnterExcl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R0/RC reads. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatRZEnterShared;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 write lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionR3EnterExcl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 read lock contention. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatContentionR3EnterShared;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 writes. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatR3EnterExcl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** R3 reads. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatR3EnterShared;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Profiling the time the section is write locked. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMPROFILEADV StatWriteLocked;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMCRITSECTRWINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDMCRITSECTRWINT, StatContentionRZEnterExcl, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDMCRITSECTRWINT, Core.u64State, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to private critical section data. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDMCRITSECTRWINT *PPDMCRITSECTRWINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The usual device/driver/internal/external stuff.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual invalid entry. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_INVALID = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Device type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_DEVICE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** USB Device type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_USB,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Driver type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_DRIVER,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Internal type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_INTERNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** External type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_EXTERNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual 32-bit hack. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE_32BIT_HACK = 0x7fffffff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMTHREADTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The internal structure for the thread.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMTHREADINT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The VM pointer. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The event semaphore the thread blocks on when not running. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTSEMEVENTMULTI BlockEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The event semaphore the thread sleeps on while running. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTSEMEVENTMULTI SleepEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next thread. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PDMTHREAD *) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The thread type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMTHREADTYPE enmType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMTHREADINT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Must be included after PDMDEVINSINT is defined. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMDEVINSINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMUSBINSINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMDRVINSINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMCRITSECTINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMCRITSECTRWINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMTHREADINT_DECLARED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef ___VBox_pdm_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# error "Invalid header PDM order. Include PDMInternal.h before VBox/vmm/pdm.h!"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_C_DECLS_END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/vmm/pdm.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_C_DECLS_BEGIN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM Logical Unit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This typically the representation of a physical port on a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * device, like for instance the PS/2 keyboard port on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * keyboard controller device. The LUNs are chained on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * device the belong to (PDMDEVINSINT::pLunsR3).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMLUN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The LUN - The Logical Unit Number. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINT iLun;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next LUN. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMLUN pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the top driver in the driver chain. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDRVINS pTop;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the bottom driver in the driver chain. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDRVINS pBottom;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the device instance which the LUN belongs to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Either this is set or pUsbIns is set. Both is never set at the same time. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINS pDevIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the USB device instance which the LUN belongs to. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMUSBINS pUsbIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the device base interface. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMIBASE pBase;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Description of this LUN. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszDesc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMLUN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM Device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDEV
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next device (R3 Ptr). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEV) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Device name length. (search optimization) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINT cchName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(const struct PDMDEVREG *) pReg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Number of instances. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to chain of instances (R3 Ptr). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The search path for raw-mode context modules (';' as separator). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pszRCSearchPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The search path for ring-0 context modules (';' as separator). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pszR0SearchPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDEV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM USB Device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next device (R3 Ptr). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSB) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Device name length. (search optimization) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINT cchName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(const struct PDMUSBREG *) pReg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Next instance number. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t iNextInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to chain of instances (R3 Ptr). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBINS) pInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMUSB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM Driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDRV
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDRV pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct PDMDRVREG * pReg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Current number of instances. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The next instance number. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t iNextInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The search path for raw-mode context modules (';' as separator). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pszRCSearchPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The search path for ring-0 context modules (';' as separator). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pszR0SearchPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDRV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM registered PIC device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMPIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the PIC device instance - R3. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevInsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the PIC device instance - R0. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR0 pDevInsR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the PIC device instance - RC. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSRC pDevInsRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Alignment padding. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTRCPTR RCPtrPadding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMPIC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM registered APIC device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMAPIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the APIC device instance - R3 Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevInsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(bool, pfnHasPendingIrqR3,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t *pu8PendingIrq));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetBaseR3,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint64_t u64Base));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(uint64_t, pfnGetBaseR3,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetTPRR3,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t u8TPR));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(uint8_t, pfnGetTPRR3,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnWriteMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnWriteMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnReadMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnReadMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTimerFreqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(uint64_t, pfnGetTimerFreqR3,(PPDMDEVINS pDevIns));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the APIC device instance - R0 Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR0 pDevInsR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(bool, pfnHasPendingIrqR0,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t *pu8PendingIrq));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSetBaseR0,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint64_t u64Base));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(uint64_t, pfnGetBaseR0,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSetTPRR0,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t u8TPR));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(uint8_t, pfnGetTPRR0,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnWriteMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(uint32_t, pfnWriteMSRR0, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnReadMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(uint32_t, pfnReadMSRR0, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(int, pfnBusDeliverR0,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(int, pfnLocalInterruptR0,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTimerFreqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(uint64_t, pfnGetTimerFreqR0,(PPDMDEVINS pDevIns));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the APIC device instance - RC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSRC pDevInsRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t *puTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(bool, pfnHasPendingIrqRC,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t *pu8PendingIrq));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSetBaseRC,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint64_t u64Base));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetBaseR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(uint64_t, pfnGetBaseRC,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnSetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSetTPRRC,(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t u8TPR));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTPRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(uint8_t, pfnGetTPRRC,(PPDMDEVINS pDevIns, VMCPUID idCpu));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnWriteMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(uint32_t, pfnWriteMSRRC, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnReadMSRR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(uint32_t, pfnReadMSRRC, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(int, pfnBusDeliverRC,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(int, pfnLocalInterruptRC,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMAPICREG::pfnGetTimerFreqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(uint64_t, pfnGetTimerFreqRC,(PPDMDEVINS pDevIns));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMAPIC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM registered I/O APIC device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMIOAPIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the APIC device instance - R3 Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevInsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the PIC device instance - R0. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR0 pDevInsR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the APIC device instance - RC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSRC pDevInsRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint8_t Alignment[4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMIOAPIC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Maximum number of PCI busses for a VM. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDM_PCI_BUSSES_MAX 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM PCI Bus instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMPCIBUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PCI bus number. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINT iBus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINT uPadding0; /**< Alignment padding.*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to PCI Bus device instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevInsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnRegisterR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, const char *pszName, int iDev));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnPCIRegisterMsiR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnRegisterMsiR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PPDMMSIREG pMsiReg));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnIORegionRegisterR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnSetConfigCallbacksR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(void, pfnSetConfigCallbacksR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PFNPCICONFIGREAD pfnRead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPFNPCICONFIGREAD ppfnReadOld, PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnFakePCIBIOSR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR3CALLBACKMEMBER(int, pfnFakePCIBIOSR3,(PPDMDEVINS pDevIns));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the PIC device instance - R0. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(PPDMDEVINS) pDevInsR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to PCI Bus device instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSRC pDevInsRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMPCIBUS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM registered DMAC (DMA Controller) device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDMAC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the DMAC device instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Copy of the registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDMACREG Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDMAC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM registered RTC (Real Time Clock) device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMRTC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the RTC device instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Copy of the registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMRTCREG Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMRTC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* IN_RING3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Module type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum PDMMODTYPE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Raw-mode (RC) context module. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMMOD_TYPE_RC,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Ring-0 (host) context module. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMMOD_TYPE_R0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Ring-3 (host) context module. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMMOD_TYPE_R3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMMODTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** The module name length including the terminator. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMMOD_NAME_LEN 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Loaded module instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMMOD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Module name. This is used for referring to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the module internally, sort of like a handle. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char szName[PDMMOD_NAME_LEN];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Module type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMMODTYPE eType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Loader module handle. Not used for R0 modules. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTLDRMOD hLdrMod;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Loaded address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is the 'handle' for R0 modules. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINTPTR ImageBase;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Old loaded address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is used during relocation of GC modules. Not used for R0 modules. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUINTPTR OldImageBase;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Where the R3 HC bits are stored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This can be equal to ImageBase but doesn't have to. Not used for R0 modules. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *pvBits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to next module. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct PDMMOD *pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Module filename. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char szFilename[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMMOD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to loaded module instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDMMOD *PPDMMOD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Extra space in the free array. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDMQUEUE_FREE_SLACK 16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Queue type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum PDMQUEUETYPE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Device consumer. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUETYPE_DEV = 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Driver consumer. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUETYPE_DRV,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Internal consumer. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUETYPE_INTERNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** External consumer. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUETYPE_EXTERNAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMQUEUETYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM Queue. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMQUEUE *PPDMQUEUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM Queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMQUEUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next queue in the list. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMQUEUE) pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Type specific data. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync union
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PDMQUEUETYPE_DEV */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to consumer function. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMQUEUEDEV) pfnCallback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the device instance owning the queue. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEVINS) pDevIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } Dev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PDMQUEUETYPE_DRV */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to consumer function. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMQUEUEDRV) pfnCallback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the driver instance owning the queue. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDRVINS) pDrvIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } Drv;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PDMQUEUETYPE_INTERNAL */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to consumer function. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMQUEUEINT) pfnCallback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } Int;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PDMQUEUETYPE_EXTERNAL */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to consumer function. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PFNPDMQUEUEEXT) pfnCallback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to user argument. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(void *) pvUser;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } Ext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } u;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Queue type. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUETYPE enmType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The interval between checking the queue for events.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The realtime timer below is used to do the waiting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If 0, the queue will use the VM_FF_PDM_QUEUE forced action. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cMilliesInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Interval timer. Only used if cMilliesInterval is non-zero. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTMTIMERR3 pTimer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R3. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR3 pVMR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** LIFO of pending items - R3. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMQUEUEITEMCORE) volatile pPendingR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the VM - R0. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMR0 pVMR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** LIFO of pending items - R0. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(PPDMQUEUEITEMCORE) volatile pPendingR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the GC VM and indicator for GC enabled queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If this is NULL, the queue cannot be used in GC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PVMRC pVMRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** LIFO of pending items - GC. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(PPDMQUEUEITEMCORE) volatile pPendingRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Item size (bytes). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cbItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Number of items in the queue. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cItems;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Index to the free head (where we insert). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile iFreeHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Index to the free tail (where we remove). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile iFreeTail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Unique queue name. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(const char *) pszName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if HC_ARCH_BITS == 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTR3PTR Alignment1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Stat: Times PDMQueueAlloc fails. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatAllocFailures;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Stat: PDMQueueInsert calls. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatInsert;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Stat: Queue flushes. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatFlush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Stat: Queue flushes with pending items left over. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatFlushLeftovers;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_STATISTICS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** State: Profiling the flushing. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMPROFILE StatFlushPrf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** State: Pending items. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile cStatPending;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile cAlignment;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Array of pointers to free items. Variable size. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct PDMQUEUEFREEITEM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the free item - HC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMQUEUEITEMCORE) volatile pItemR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the free item - HC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(PPDMQUEUEITEMCORE) volatile pItemR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the free item - GC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(PPDMQUEUEITEMCORE) volatile pItemRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if HC_ARCH_BITS == 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTRCPTR Alignment0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } aFreeItems[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMQUEUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @name PDM::fQueueFlushing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Used to make sure only one EMT will flush the queues.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Set when an EMT is flushing queues, clear otherwise. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDM_QUEUE_FLUSH_FLAG_ACTIVE_BIT 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Indicating there are queues with items pending.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is make sure we don't miss inserts happening during flushing. The FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * cannot be used for this since it has to be cleared immediately to prevent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * other EMTs from spinning. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PDM_QUEUE_FLUSH_FLAG_PENDING_BIT 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** }@ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Queue device helper task operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum PDMDEVHLPTASKOP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual invalid 0 entry. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP_INVALID = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** ISASetIrq */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP_ISA_SET_IRQ,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PCISetIrq */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP_PCI_SET_IRQ,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PCISetIrq */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP_IOAPIC_SET_IRQ,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual 32-bit hack. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP_32BIT_HACK = 0x7fffffff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDEVHLPTASKOP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Queued Device Helper Task.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMDEVHLPTASK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The queue item core (don't touch). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMQUEUEITEMCORE Core;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the device instance (R3 Ptr). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDEVINSR3 pDevInsR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** This operation to perform. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMDEVHLPTASKOP enmOp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if HC_ARCH_BITS == 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t Alignment0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Parameters to the operation. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync union PDMDEVHLPTASKPARAMS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDMDEVHLPTASKOP_ISA_SET_IRQ and PDMDEVHLPTASKOP_PCI_SET_IRQ.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct PDMDEVHLPTASKSETIRQ
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The IRQ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int iIrq;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The new level. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int iLevel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The IRQ tag and source. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t uTagSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } SetIRQ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Expanding the structure.. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint64_t au64[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } u;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMDEVHLPTASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a queued Device Helper Task. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDMDEVHLPTASK *PPDMDEVHLPTASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a const queued Device Helper Task. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef const PDMDEVHLPTASK *PCPDMDEVHLPTASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * An USB hub registration record.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSBHUB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The USB versions this hub support.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Note that 1.1 hubs can take on 2.0 devices. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t fVersions;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The number of ports on the hub. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cPorts;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The number of available ports (0..cPorts). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cAvailablePorts;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The driver instance of the hub. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMDRVINS pDrvIns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Copy of the to the registration structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMUSBHUBREG Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the next hub in the list. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct PDMUSBHUB *pNext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMUSBHUB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a const USB HUB registration record. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef const PDMUSBHUB *PCPDMUSBHUB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a PDM Async I/O template. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMASYNCCOMPLETIONTEMPLATE *PPDMASYNCCOMPLETIONTEMPLATE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to the main PDM Async completion endpoint class. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMASYNCCOMPLETIONEPCLASS *PPDMASYNCCOMPLETIONEPCLASS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to the global block cache structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMBLKCACHEGLOBAL *PPDMBLKCACHEGLOBAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM VMCPU Instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Changes to this must checked against the padding of the pdm union in VMCPU!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMCPU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The number of entries in the apQueuedCritSectsLeaves table that's currently
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * in use. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cQueuedCritSectLeaves;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t uPadding0; /**< Alignment padding.*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Critical sections queued in RC/R0 because of contention preventing leave to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * complete. (R3 Ptrs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We will return to Ring-3 ASAP, so this queue doesn't have to be very long. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMCRITSECT) apQueuedCritSectLeaves[8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The number of entries in the apQueuedCritSectRwExclLeaves table that's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * currently in use. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cQueuedCritSectRwExclLeaves;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t uPadding1; /**< Alignment padding.*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Read/write critical sections queued in RC/R0 because of contention
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * preventing exclusive leave to complete. (R3 Ptrs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We will return to Ring-3 ASAP, so this queue doesn't have to be very long. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMCRITSECTRW) apQueuedCritSectRwExclLeaves[8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The number of entries in the apQueuedCritSectsRwShrdLeaves table that's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * currently in use. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cQueuedCritSectRwShrdLeaves;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t uPadding2; /**< Alignment padding.*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Read/write critical sections queued in RC/R0 because of contention
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * preventing shared leave to complete. (R3 Ptrs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We will return to Ring-3 ASAP, so this queue doesn't have to be very long. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMCRITSECTRW) apQueuedCritSectRwShrdLeaves[8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMCPU;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM VM Instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Changes to this must checked against the padding of the cfgm union in VM!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The PDM lock.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is used to protect everything that deals with interrupts, i.e.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the PIC, APIC, IOAPIC and PCI devices plus some PDM functions. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMCRITSECT CritSect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The NOP critical section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is a dummy critical section that will not do any thread
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * serialization but instead let all threads enter immediately and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * concurrently. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMCRITSECT NopCritSect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of registered devices. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEV) pDevs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of devices instances. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDEVINS) pDevInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of registered USB devices. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSB) pUsbDevs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of USB devices instances. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBINS) pUsbInstances;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of registered drivers. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDRV) pDrvs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** PCI Buses. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMPCIBUS aPciBuses[PDM_PCI_BUSSES_MAX];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The register PIC device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMPIC Pic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The registered APIC device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMAPIC Apic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The registered I/O APIC device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PDMIOAPIC IoApic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The registered DMAC device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMDMAC) pDmac;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The registered RTC device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMRTC) pRtc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The registered USB HUBs. (FIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMUSBHUB) pUsbHubs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Queue in which devhlp tasks are queued for R3 execution - R3 Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMQUEUE) pDevHlpQueueR3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Queue in which devhlp tasks are queued for R3 execution - R0 Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(PPDMQUEUE) pDevHlpQueueR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Queue in which devhlp tasks are queued for R3 execution - RC Ptr. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(PPDMQUEUE) pDevHlpQueueRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the queue which should be manually flushed - RC Ptr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Only touched by EMT. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RCPTRTYPE(struct PDMQUEUE *) pQueueFlushRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the queue which should be manually flushed - R0 Ptr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Only touched by EMT. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R0PTRTYPE(struct PDMQUEUE *) pQueueFlushR0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Bitmask controlling the queue flushing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * See PDM_QUEUE_FLUSH_FLAG_ACTIVE and PDM_QUEUE_FLUSH_FLAG_PENDING. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile fQueueFlushing;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The current IRQ tag (tracing purposes). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t volatile uIrqTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The tracing ID of the next device instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks We keep the device tracing ID seperate from the rest as these are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * then more likely to end up with the same ID from one run to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * another, making analysis somewhat easier. Drivers and USB devices
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are more volatile and can be changed at runtime, thus these are much
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * less likely to remain stable, so just heap them all together. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t idTracingDev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The tracing ID of the next driver instance, USB device instance or other
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM entity requiring an ID. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t idTracingOther;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @name VMM device heap
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the heap base (MMIO2 ring-3 mapping). NULL if not registered. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTR3PTR pvVMMDevHeap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The heap size. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cbVMMDevHeap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Free space. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cbVMMDevHeapLeft;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The current mapping. NIL_RTGCPHYS if not mapped or registered. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTGCPHYS GCPhysVMMDevHeap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Number of times a critical section leave request needed to be queued for ring-3 execution. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STAMCOUNTER StatQueuedCritSectLeaves;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDM, GCPhysVMMDevHeap, sizeof(RTGCPHYS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDM, CritSect, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAssertCompileMemberAlignment(PDM, StatQueuedCritSectLeaves, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to PDM VM instance data. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDM *PPDM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PDM data kept in the UVM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct PDMUSERPERVM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @todo move more stuff over here. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Linked list of timer driven PDM queues.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Currently serialized by PDM::CritSect. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PDMQUEUE *) pQueuesTimer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Linked list of force action driven PDM queues.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Currently serialized by PDM::CritSect. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(struct PDMQUEUE *) pQueuesForced;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Lock protecting the lists below it. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTCRITSECT ListCritSect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to list of loaded modules. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMMOD pModules;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of initialized critical sections. (LIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMCRITSECTINT) pCritSects;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** List of initialized read/write critical sections. (LIFO) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMCRITSECTRWINT) pRwCritSects;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Head of the PDM Thread list. (singly linked) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMTHREAD) pThreads;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Tail of the PDM Thread list. (singly linked) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMTHREAD) pThreadsTail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @name PDM Async Completion
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to the array of supported endpoint classes. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMASYNCCOMPLETIONEPCLASS apAsyncCompletionEndpointClass[PDMASYNCCOMPLETIONEPCLASSTYPE_MAX];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Head of the templates. Singly linked, protected by ListCritSect. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMASYNCCOMPLETIONTEMPLATE) pAsyncCompletionTemplates;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Global block cache data. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMBLKCACHEGLOBAL) pBlkCacheGlobal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_NETSHAPER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Pointer to network shaper instance. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync R3PTRTYPE(PPDMNETSHAPER) pNetShaper;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* VBOX_WITH_NETSHAPER */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PDMUSERPERVM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to the PDM data kept in the UVM. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef PDMUSERPERVM *PPDMUSERPERVM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*******************************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Global Variables *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*******************************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMDRVHLPR3 g_pdmR3DrvHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMDEVHLPR3 g_pdmR3DevHlpTrusted;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMDEVHLPR3 g_pdmR3DevHlpUnTrusted;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMPICHLPR3 g_pdmR3DevPicHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMAPICHLPR3 g_pdmR3DevApicHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMIOAPICHLPR3 g_pdmR3DevIoApicHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMPCIHLPR3 g_pdmR3DevPciHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMDMACHLP g_pdmR3DevDmacHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMRTCHLP g_pdmR3DevRtcHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMHPETHLPR3 g_pdmR3DevHpetHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern const PDMPCIRAWHLPR3 g_pdmR3DevPciRawHlp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*******************************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Defined Constants And Macros *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*******************************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @def PDMDEV_ASSERT_DEVINS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Asserts the validity of the device instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMDEV_ASSERT_DEVINS(pDevIns) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AssertPtr(pDevIns); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assert(pDevIns->u32Version == PDM_DEVINS_VERSION); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assert(pDevIns->CTX_SUFF(pvInstanceData) == (void *)&pDevIns->achInstanceData[0]); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMDEV_ASSERT_DEVINS(pDevIns) do { } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @def PDMDRV_ASSERT_DRVINS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Asserts the validity of the driver instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMDRV_ASSERT_DRVINS(pDrvIns) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AssertPtr(pDrvIns); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assert(pDrvIns->u32Version == PDM_DRVINS_VERSION); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assert(pDrvIns->CTX_SUFF(pvInstanceData) == (void *)&pDrvIns->achInstanceData[0]); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# define PDMDRV_ASSERT_DRVINS(pDrvIns) do { } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*******************************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Internal Functions *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*******************************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool pdmR3IsValidName(const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectBothInitStats(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3CritSectBothRelocate(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectBothDeleteDevice(PVM pVM, PPDMDEVINS pDevIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectBothDeleteDriver(PVM pVM, PPDMDRVINS pDrvIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectInitDevice( PVM pVM, PPDMDEVINS pDevIns, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, va_list va);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectInitDeviceAuto( PVM pVM, PPDMDEVINS pDevIns, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, ...);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectInitDriver( PVM pVM, PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, ...);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectRwInitDevice( PVM pVM, PPDMDEVINS pDevIns, PPDMCRITSECTRW pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, va_list va);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectRwInitDeviceAuto( PVM pVM, PPDMDEVINS pDevIns, PPDMCRITSECTRW pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, ...);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3CritSectRwInitDriver( PVM pVM, PPDMDRVINS pDrvIns, PPDMCRITSECTRW pCritSect, RT_SRC_POS_DECL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *pszNameFmt, ...);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3DevInit(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPPDMDEV pdmR3DevLookup(PVM pVM, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3DevFindLun(PVM pVM, const char *pszDevice, unsigned iInstance, unsigned iLun, PPDMLUN *ppLun);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDECLCALLBACK(bool) pdmR3DevHlpQueueConsumer(PVM pVM, PPDMQUEUEITEMCORE pItem);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3UsbLoadModules(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3UsbInstantiateDevices(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPPDMUSB pdmR3UsbLookup(PVM pVM, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3UsbRegisterHub(PVM pVM, PPDMDRVINS pDrvIns, uint32_t fVersions, uint32_t cPorts, PCPDMUSBHUBREG pUsbHubReg, PPCPDMUSBHUBHLP ppUsbHubHlp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3UsbVMInitComplete(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3DrvInit(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3DrvInstantiate(PVM pVM, PCFGMNODE pNode, PPDMIBASE pBaseInterface, PPDMDRVINS pDrvAbove,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PPDMLUN pLun, PPDMIBASE *ppBaseInterface);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3DrvDetach(PPDMDRVINS pDrvIns, uint32_t fFlags);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3DrvDestroyChain(PPDMDRVINS pDrvIns, uint32_t fFlags);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPPDMDRV pdmR3DrvLookup(PVM pVM, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3LdrInitU(PUVM pUVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3LdrTermU(PUVM pUVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncchar *pdmR3FileR3(const char *pszFile, bool fShared);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3LoadR3U(PUVM pUVM, const char *pszFilename, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3QueueRelocate(PVM pVM, RTGCINTPTR offDelta);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PFNPDMTHREADWAKEUPDEV pfnWakeup, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PFNPDMTHREADWAKEUPUSB pfnWakeup, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PFNPDMTHREADWAKEUPDRV pfnWakeup, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3ThreadDestroyAll(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadResumeAll(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3ThreadSuspendAll(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionInit(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTerm(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3AsyncCompletionResume(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDEV pfnCompleted, const char *pszDesc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, const char *pszDesc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEUSB pfnCompleted, const char *pszDesc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3AsyncCompletionTemplateDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_NETSHAPER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3NetShaperInit(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3NetShaperTerm(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3BlkCacheInit(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmR3BlkCacheTerm(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmR3BlkCacheResume(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* IN_RING3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmLock(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint pdmLockEx(PVM pVM, int rc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmUnlock(PVM pVM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(IN_RING3) || defined(IN_RING0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmCritSectRwLeaveSharedQueued(PPDMCRITSECTRW pThis);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid pdmCritSectRwLeaveExclQueued(PPDMCRITSECTRW pThis);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_C_DECLS_END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync