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