Virtio.h revision 207ca9559c05e7e2f924745685b07571a3603ec1
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/* $Id$ */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/** @file
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * Virtio.h - Virtio Declarations
e74d9df42b6616e049af024e644cf186d48f460cvboxsync */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2009 Oracle Corporation
e74d9df42b6616e049af024e644cf186d48f460cvboxsync *
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * available from http://www.virtualbox.org. This file is free software;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * General Public License (GPL) as published by the Free Software
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e74d9df42b6616e049af024e644cf186d48f460cvboxsync */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#ifndef ___VBox_Virtio_h
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define ___VBox_Virtio_h
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#include <iprt/ctype.h>
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VIRTIO_RELOCATE(p, o) *(RTHCUINTPTR *)&p += o
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/*
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * The saved state version is changed if either common or any of specific
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * parts are changed. That is, it is perfectly possible that the version
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * of saved vnet state will increase as a result of change in vblk structure
e74d9df42b6616e049af024e644cf186d48f460cvboxsync * for example.
e74d9df42b6616e049af024e644cf186d48f460cvboxsync */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VIRTIO_SAVEDSTATE_VERSION_3_1_BETA1 1
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VIRTIO_SAVEDSTATE_VERSION 2
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define DEVICE_PCI_VENDOR_ID 0x1AF4
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define DEVICE_PCI_DEVICE_ID 0x1000
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define DEVICE_PCI_SUBSYSTEM_VENDOR_ID 0x1AF4
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VIRTIO_MAX_NQUEUES 3
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_HOST_FEATURES 0x0
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_GUEST_FEATURES 0x4
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_QUEUE_PFN 0x8
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_QUEUE_NUM 0xC
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_QUEUE_SEL 0xE
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_QUEUE_NOTIFY 0x10
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_STATUS 0x12
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_ISR 0x13
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_CONFIG 0x14
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_ISR_QUEUE 0x1
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_ISR_CONFIG 0x3
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_STATUS_ACK 0x01
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_STATUS_DRV 0x02
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_STATUS_DRV_OK 0x04
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_STATUS_FAILED 0x80
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_F_NOTIFY_ON_EMPTY 0x01000000
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VPCI_F_BAD_FEATURE 0x40000000
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRINGDESC_MAX_SIZE (2 * 1024 * 1024)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRINGDESC_F_NEXT 0x01
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRINGDESC_F_WRITE 0x02
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VRingDesc
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint64_t u64Addr;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uLen;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t u16Flags;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t u16Next;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VRingDesc VRINGDESC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VRINGDESC *PVRINGDESC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRINGAVAIL_F_NO_INTERRUPT 0x01
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VRingAvail
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uFlags;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uNextFreeIndex;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t auRing[1];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VRingAvail VRINGAVAIL;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VRingUsedElem
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uId;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uLen;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VRingUsedElem VRINGUSEDELEM;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRINGUSED_F_NO_NOTIFY 0x01
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VRingUsed
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uFlags;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uIndex;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VRINGUSEDELEM aRing[1];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VRingUsed VRINGUSED;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VRINGUSED *PVRINGUSED;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#define VRING_MAX_SIZE 1024
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VRing
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uSize;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t padding[3];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTGCPHYS addrDescriptors;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTGCPHYS addrAvail;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTGCPHYS addrUsed;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VRing VRING;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VRING *PVRING;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VQueue
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VRING VRing;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uNextAvailIndex;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uNextUsedIndex;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uPageNumber;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#ifdef IN_RING3
e74d9df42b6616e049af024e644cf186d48f460cvboxsync void (*pfnCallback)(void *pvState, struct VQueue *pQueue);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#else
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTR3UINTPTR pfnCallback;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync R3PTRTYPE(const char *) pcszName;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VQueue VQUEUE;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VQUEUE *PVQUEUE;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VQueueElemSeg
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTGCPHYS addr;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync void *pv;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t cb;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VQueueElemSeg VQUEUESEG;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VQueueElem
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uIndex;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nIn;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nOut;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VQUEUESEG aSegsIn[VRING_MAX_SIZE];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VQUEUESEG aSegsOut[VRING_MAX_SIZE];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VQueueElem VQUEUEELEM;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VQUEUEELEM *PVQUEUEELEM;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncenum VirtioDeviceType
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VIRTIO_NET_ID = 0,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VIRTIO_BLK_ID = 1,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VIRTIO_32BIT_HACK = 0x7fffffff
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync/**
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * The state of the VirtIO PCI device
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync *
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @implements PDMILEDPORTS
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync */
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncstruct VPCIState_st
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PDMCRITSECT cs; /**< Critical section - what is it protecting? */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /* Read-only part, never changes after initialization. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync char szInstance[8]; /**< Instance name, e.g. VNet#1. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#if HC_ARCH_BITS != 64
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t padding1;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: Base interface. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PDMIBASE IBase;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: LED port interface. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync PDMILEDPORTS ILeds;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: LED connector (peer). */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync R3PTRTYPE(PPDMILEDCONNECTORS) pLedsConnector;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSR3 pDevInsR3; /**< Device instance - R3. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSR0 pDevInsR0; /**< Device instance - R0. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSRC pDevInsRC; /**< Device instance - RC. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#if HC_ARCH_BITS == 64
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t padding2;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** TODO */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PCIDEVICE pciDevice;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** Base port of I/O space region. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTIOPORT addrIOPort;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /* Read/write part, protected with critical section. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** Status LED. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PDMLED led;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uGuestFeatures;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uQueueSelector; /**< An index in aQueues array. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint8_t uStatus; /**< Device Status (bits are device-specific). */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint8_t uISR; /**< Interrupt Status Register. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#if HC_ARCH_BITS != 64
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t padding3;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nQueues; /**< Actual number of queues used. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync VQUEUE Queues[VIRTIO_MAX_NQUEUES];
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#if defined(VBOX_WITH_STATISTICS)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMPROFILEADV StatIOReadGC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMPROFILEADV StatIOReadHC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMPROFILEADV StatIOWriteGC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMPROFILEADV StatIOWriteHC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMCOUNTER StatIntsRaised;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync STAMCOUNTER StatIntsSkipped;
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync STAMPROFILE StatCsGC;
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync STAMPROFILE StatCsHC;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif /* VBOX_WITH_STATISTICS */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync};
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef struct VPCIState_st VPCISTATE;
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef VPCISTATE *PVPCISTATE;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/* Callbacks *****************************************************************/
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef uint32_t (*PFNGETHOSTFEATURES)(void *pState);
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef uint32_t (*PFNGETHOSTMINIMALFEATURES)(void *pState);
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef void (*PFNSETHOSTFEATURES)(void *pState, uint32_t uFeatures);
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef int (*PFNGETCONFIG)(void *pState, uint32_t port, uint32_t cb, void *data);
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef int (*PFNSETCONFIG)(void *pState, uint32_t port, uint32_t cb, void *data);
5882d3da10b2720e04008f4cc27c8ca911b6c776vboxsynctypedef int (*PFNRESET)(void *pState);
e74d9df42b6616e049af024e644cf186d48f460cvboxsynctypedef void (*PFNREADY)(void *pState);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync/*****************************************************************************/
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciRaiseInterrupt(VPCISTATE *pState, int rcBusy, uint8_t u8IntCause);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciIOPortIn(PPDMDEVINS pDevIns,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync void *pvUser,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTIOPORT port,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t *pu32,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync unsigned cb,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNGETHOSTFEATURES pfnGetHostFeatures,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNGETCONFIG pfnGetConfig);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciIOPortOut(PPDMDEVINS pDevIns,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync void *pvUser,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync RTIOPORT port,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t u32,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync unsigned cb,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNGETHOSTMINIMALFEATURES pfnGetHostMinimalFeatures,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNGETHOSTFEATURES pfnGetHostFeatures,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNSETHOSTFEATURES pfnSetHostFeatures,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNRESET pfnReset,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNREADY pfnReady,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PFNSETCONFIG pfnSetConfig);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vpciSetWriteLed(PVPCISTATE pState, bool fOn);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vpciSetReadLed(PVPCISTATE pState, bool fOn);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciSaveExec(PVPCISTATE pState, PSSMHANDLE pSSM);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciLoadExec(PVPCISTATE pState, PSSMHANDLE pSSM,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t uVersion, uint32_t uPass,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nQueues);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciConstruct(PPDMDEVINS pDevIns, VPCISTATE *pState,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync int iInstance, const char *pcszNameFmt,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uSubsystemId, uint16_t uClass,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nQueues);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciDestruct(VPCISTATE* pState);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vpciRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vpciReset(PVPCISTATE pState);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncvoid *vpciQueryInterface(struct PDMIBASE *pInterface, const char *pszIID);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncPVQUEUE vpciAddQueue(VPCISTATE* pState, unsigned uSize,
e74d9df42b6616e049af024e644cf186d48f460cvboxsync void (*pfnCallback)(void *pvState, PVQUEUE pQueue),
e74d9df42b6616e049af024e644cf186d48f460cvboxsync const char *pcszName);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#define VPCI_CS
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(int) vpciCsEnter(VPCISTATE *pState, int iBusyRc)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#ifdef VPCI_CS
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync STAM_PROFILE_START(&pState->CTXSUFF(StatCs), a);
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync int rc = PDMCritSectEnter(&pState->cs, iBusyRc);
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync STAM_PROFILE_STOP(&pState->CTXSUFF(StatCs), a);
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync return rc;
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#else
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync return VINF_SUCCESS;
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync}
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(void) vpciCsLeave(VPCISTATE *pState)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#ifdef VPCI_CS
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PDMCritSectLeave(&pState->cs);
abc1c143c7e4b1c81651e524ebf8ee3ccd794cddvboxsync#endif
e74d9df42b6616e049af024e644cf186d48f460cvboxsync}
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vringSetNotification(PVPCISTATE pState, PVRING pVRing, bool fEnabled);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(uint16_t) vringReadAvailIndex(PVPCISTATE pState, PVRING pVRing)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t tmp;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PDMDevHlpPhysRead(pState->CTX_SUFF(pDevIns),
e74d9df42b6616e049af024e644cf186d48f460cvboxsync pVRing->addrAvail + RT_OFFSETOF(VRINGAVAIL, uNextFreeIndex),
e74d9df42b6616e049af024e644cf186d48f460cvboxsync &tmp, sizeof(tmp));
e74d9df42b6616e049af024e644cf186d48f460cvboxsync return tmp;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync}
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncbool vqueueGet(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem);
207ca9559c05e7e2f924745685b07571a3603ec1vboxsyncvoid vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen, uint32_t uReserved = 0);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vqueueNotify(PVPCISTATE pState, PVQUEUE pQueue);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vqueueSync(PVPCISTATE pState, PVQUEUE pQueue);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(bool) vqueueIsReady(PVPCISTATE pState, PVQUEUE pQueue)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync return !!pQueue->VRing.addrAvail;
e74d9df42b6616e049af024e644cf186d48f460cvboxsync}
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(bool) vqueueIsEmpty(PVPCISTATE pState, PVQUEUE pQueue)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync{
e74d9df42b6616e049af024e644cf186d48f460cvboxsync return (vringReadAvailIndex(pState, &pQueue->VRing) == pQueue->uNextAvailIndex);
e74d9df42b6616e049af024e644cf186d48f460cvboxsync}
e74d9df42b6616e049af024e644cf186d48f460cvboxsync
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif /* ___VBox_Virtio_h */