HGSMI.h revision 8b2529a5ddb7e6170c5ab2399a8fc4ef102f8e3d
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync * VBox Host Guest Shared Memory Interface (HGSMI).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Host/Guest shared part.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Copyright (C) 2006-2014 Oracle Corporation
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * available from http://www.virtualbox.org. This file is free software;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * General Public License (GPL) as published by the Free Software
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The contents of this file may alternatively be used under the terms
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * of the Common Development and Distribution License Version 1.0
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * VirtualBox OSE distribution, in which case the provisions of the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * CDDL are applicable instead of those of the GPL.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * You may elect to license modified versions of this file under the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * terms and conditions of either the GPL or the CDDL or both.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Basic mechanism for the HGSMI is to prepare and pass data buffer to the host and the guest.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Data inside these buffers are opaque for the HGSMI and are interpreted by higher levels.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Every shared memory buffer passed between the guest/host has the following structure:
6160306df39548f807965d1b3e6953ca2ce92847vboxsync * HGSMIBUFFERHEADER header;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * uint8_t data[header.u32BufferSize];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * HGSMIBUFFERTAIL tail;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Note: Offset of the 'header' in the memory is used for virtual hardware IO.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Buffers are verifyed using the offset and the content of the header and the tail,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * which are constant during a call.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Invalid buffers are ignored.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Actual 'data' is not verifyed, as it is expected that the data can be changed by the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * called function.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Since only the offset of the buffer is passed in a IO operation, the header and tail
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * must contain:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * size of data in this buffer;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * checksum for buffer verification.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * For segmented transfers:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the sequence identifier;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * offset of the current segment in the sequence;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * total bytes in the transfer.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Additionally contains:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the channel ID;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the channel information.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Heap types. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define HGSMI_HEAP_TYPE_NULL 0 /* Heap not initialized. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define HGSMI_HEAP_TYPE_POINTER 1 /* RTHEAPSIMPLE. Obsolete. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define HGSMI_HEAP_TYPE_OFFSET 2 /* RTHEAPOFFSET. Obsolete. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define HGSMI_HEAP_TYPE_MA 3 /* Memory allocator. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef struct HGSMIHEAP
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* The size of the array of channels. Array indexes are uint8_t. Note: the value must not be changed. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Channel handler called when the guest submits a buffer. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef DECLCALLBACK(int) FNHGSMICHANNELHANDLER(void *pvHandler, uint16_t u16ChannelInfo, void *pvBuffer, HGSMISIZE cbBuffer);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef FNHGSMICHANNELHANDLER *PFNHGSMICHANNELHANDLER;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Information about a handler: pfn + context. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Channel description. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMICHANNELHANDLER handler; /* The channel handler. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const char *pszName; /* NULL for hardcoded channels or RTStrDup'ed name. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t u8Channel; /* The channel id, equal to the channel index in the array. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMICHANNEL Channels[HGSMI_NUMBER_OF_CHANNELS]; /* Channel handlers indexed by the channel id.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The array is accessed under the instance lock.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return sizeof (HGSMIBUFFERHEADER) + sizeof (HGSMIBUFFERTAIL);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(uint8_t *) HGSMIBufferData (const HGSMIBUFFERHEADER *pHeader)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (uint8_t *)pHeader + sizeof (HGSMIBUFFERHEADER);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIBUFFERTAIL *) HGSMIBufferTail (const HGSMIBUFFERHEADER *pHeader)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (HGSMIBUFFERTAIL *)(HGSMIBufferData (pHeader) + pHeader->u32DataSize);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIBUFFERHEADER *) HGSMIBufferHeaderFromData (const void *pvData)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (HGSMIBUFFERHEADER *)((uint8_t *)pvData - sizeof (HGSMIBUFFERHEADER));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMISIZE) HGSMIBufferRequiredSize (uint32_t u32DataSize)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIPointerToOffset(const HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const void *pv)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return pArea->offBase + (HGSMIOFFSET)((uint8_t *)pv - pArea->pu8Base);
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsyncDECLINLINE(void *) HGSMIOffsetToPointer(const HGSMIAREA *pArea,
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync return pArea->pu8Base + (offBuffer - pArea->offBase);
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsyncDECLINLINE(uint8_t *) HGSMIBufferDataFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer)
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer(pArea, offBuffer);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncDECLINLINE(uint8_t *) HGSMIBufferDataAndChInfoFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer, uint16_t * pChInfo)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer (pArea, offBuffer);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncHGSMICHANNEL *HGSMIChannelFindById (HGSMICHANNELINFO * pChannelInfo, uint8_t u8Channel);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(bool) HGSMIAreaContainsOffset(const HGSMIAREA *pArea, HGSMIOFFSET off)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return off >= pArea->offBase && off - pArea->offBase < pArea->cbArea;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(bool) HGSMIAreaContainsPointer(const HGSMIAREA *pArea, const void *pv)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (uintptr_t)pv >= (uintptr_t)pArea->pu8Base && (uintptr_t)pv - (uintptr_t)pArea->pu8Base < pArea->cbArea;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncHGSMIOFFSET HGSMIBufferInitializeSingle (const HGSMIAREA *pArea,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsyncvoid HGSMIHeapSetupUninitialized (HGSMIHEAP *pHeap);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncHGSMIOFFSET HGSMIHeapBufferOffset (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIHeapOffset(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Needed for heap relocation: offset of the heap handle relative to the start of heap area. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIHeapHandleLocationOffset(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hPtr - (uintptr_t)pHeap->area.pu8Base);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hOff - (uintptr_t)pHeap->area.pu8Base);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync#endif /* IN_RING3 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMISIZE) HGSMIHeapSize(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIChannelRegister (HGSMICHANNELINFO * pChannelInfo,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const char *pszName,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#endif /* !___VBox_HGSMI_HGSMI_h */