e74d9df42b6616e049af024e644cf186d48f460cvboxsync * Virtio.h - Virtio Declarations
8ebffae0c1fab5b2c22ce6eb7d2776981eeea139vboxsync * Copyright (C) 2009-2013 Oracle Corporation
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.
8ebffae0c1fab5b2c22ce6eb7d2776981eeea139vboxsync/** @name Saved state versions.
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.
1e7e4b6ddafed792b6374636149437ed74e3ef02vboxsync * Queue callback (consumer?).
1e7e4b6ddafed792b6374636149437ed74e3ef02vboxsync * @param pvState Pointer to the VirtIO PCI core state, VPCISTATE.
1e7e4b6ddafed792b6374636149437ed74e3ef02vboxsync * @param pQueue Pointer to the queue structure.
1e7e4b6ddafed792b6374636149437ed74e3ef02vboxsynctypedef DECLCALLBACK(void) FNVPCIQUEUECALLBACK(void *pvState, struct VQueue *pQueue);
1e7e4b6ddafed792b6374636149437ed74e3ef02vboxsync/** Pointer to a VQUEUE callback function. */
8ebffae0c1fab5b2c22ce6eb7d2776981eeea139vboxsync * The core (/common) state of the VirtIO PCI device
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @implements PDMILEDPORTS
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. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: Base interface. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: LED port interface. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Status LUN: LED connector (peer). */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSR3 pDevInsR3; /**< Device instance - R3. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSR0 pDevInsR0; /**< Device instance - R0. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync PPDMDEVINSRC pDevInsRC; /**< Device instance - RC. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** TODO */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** Base port of I/O space region. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /* Read/write part, protected with critical section. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync /** Status LED. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint16_t uQueueSelector; /**< An index in aQueues array. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint8_t uStatus; /**< Device Status (bits are device-specific). */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync uint32_t nQueues; /**< Actual number of queues used. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsync#endif /* VBOX_WITH_STATISTICS */
8ebffae0c1fab5b2c22ce6eb7d2776981eeea139vboxsync/** Pointer to the core (/common) state of a VirtIO PCI device. */
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsynctypedef DECLCALLBACK(uint32_t) FNGETHOSTFEATURES(void *pvState);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync/** @name VirtIO port I/O callbacks.
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync DECLCALLBACKMEMBER(uint32_t, pfnGetHostFeatures)(void *pvState);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync DECLCALLBACKMEMBER(uint32_t, pfnGetHostMinimalFeatures)(void *pvState);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync DECLCALLBACKMEMBER(void, pfnSetHostFeatures)(void *pvState, uint32_t fFeatures);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync DECLCALLBACKMEMBER(int, pfnGetConfig)(void *pvState, uint32_t offCfg, uint32_t cb, void *pvData);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync DECLCALLBACKMEMBER(int, pfnSetConfig)(void *pvState, uint32_t offCfg, uint32_t cb, void *pvData);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync/** Pointer to a const VirtIO port I/O callback structure. */
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciRaiseInterrupt(VPCISTATE *pState, int rcBusy, uint8_t u8IntCause);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncint vpciSaveExec(PVPCISTATE pState, PSSMHANDLE pSSM);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsyncint vpciLoadExec(PVPCISTATE pState, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass, uint32_t nQueues);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsyncint vpciConstruct(PPDMDEVINS pDevIns, VPCISTATE *pState, int iInstance, const char *pcszNameFmt,
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsync uint16_t uSubsystemId, uint16_t uClass, uint32_t nQueues);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vpciRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncvoid *vpciQueryInterface(struct PDMIBASE *pInterface, const char *pszIID);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsyncPVQUEUE vpciAddQueue(VPCISTATE* pState, unsigned uSize, PFNVPCIQUEUECALLBACK pfnCallback, const char *pcszName);
53a101648921e6d3e1d4e48556a477741a0e41d7vboxsyncDECLINLINE(int) vpciCsEnter(VPCISTATE *pState, int rcBusy)
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vringSetNotification(PVPCISTATE pState, PVRING pVRing, bool fEnabled);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(uint16_t) vringReadAvailIndex(PVPCISTATE pState, PVRING pVRing)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync pVRing->addrAvail + RT_OFFSETOF(VRINGAVAIL, uNextFreeIndex),
bd453a3fa95a1880bf74eb9aa51efac95a3a75cbvboxsyncbool vqueueGet(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, bool fRemove = true);
207ca9559c05e7e2f924745685b07571a3603ec1vboxsyncvoid vqueuePut(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem, uint32_t uLen, uint32_t uReserved = 0);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncvoid vqueueNotify(PVPCISTATE pState, PVQUEUE pQueue);
bd453a3fa95a1880bf74eb9aa51efac95a3a75cbvboxsyncDECLINLINE(bool) vqueuePeek(PVPCISTATE pState, PVQUEUE pQueue, PVQUEUEELEM pElem)
bd453a3fa95a1880bf74eb9aa51efac95a3a75cbvboxsync return vqueueGet(pState, pQueue, pElem, /* fRemove */ false);
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(bool) vqueueIsReady(PVPCISTATE pState, PVQUEUE pQueue)
e74d9df42b6616e049af024e644cf186d48f460cvboxsyncDECLINLINE(bool) vqueueIsEmpty(PVPCISTATE pState, PVQUEUE pQueue)
e74d9df42b6616e049af024e644cf186d48f460cvboxsync return (vringReadAvailIndex(pState, &pQueue->VRing) == pQueue->uNextAvailIndex);
8ebffae0c1fab5b2c22ce6eb7d2776981eeea139vboxsync#endif /* !___VBox_Virtio_h */