HGSMI.h revision 8b2529a5ddb7e6170c5ab2399a8fc4ef102f8e3d
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/** @file
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync * VBox Host Guest Shared Memory Interface (HGSMI).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Host/Guest shared part.
71ca11d26aa3d715423a305b1c25582f0a5f4f7fvboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/*
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Copyright (C) 2006-2014 Oracle Corporation
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
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 *
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 *
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 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#ifndef ___VBox_HGSMI_HGSMI_h
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define ___VBox_HGSMI_HGSMI_h
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <iprt/assert.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <iprt/types.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <VBox/HGSMI/HGSMIDefs.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <VBox/HGSMI/HGSMIChannels.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <VBox/HGSMI/HGSMIMemAlloc.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/*
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 *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Every shared memory buffer passed between the guest/host has the following structure:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
6160306df39548f807965d1b3e6953ca2ce92847vboxsync * HGSMIBUFFERHEADER header;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * uint8_t data[header.u32BufferSize];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * HGSMIBUFFERTAIL tail;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Note: Offset of the 'header' in the memory is used for virtual hardware IO.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Buffers are verifyed using the offset and the content of the header and the tail,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * which are constant during a call.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Invalid buffers are ignored.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Actual 'data' is not verifyed, as it is expected that the data can be changed by the
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * called function.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
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 *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * For segmented transfers:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the sequence identifier;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * offset of the current segment in the sequence;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * total bytes in the transfer.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Additionally contains:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the channel ID;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * * the channel information.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
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. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#pragma pack(1)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef struct HGSMIHEAP
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync union
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIMADATA ma; /* Memory Allocator */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTHEAPSIMPLE hPtr; /* Pointer based heap. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTHEAPOFFSET hOff; /* Offset based heap. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } u;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIAREA area; /* Description. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync int cRefs; /* Number of heap allocations. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint32_t u32HeapType; /* HGSMI_HEAP_TYPE_* */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync} HGSMIHEAP;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#pragma pack()
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#pragma pack(1)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* The size of the array of channels. Array indexes are uint8_t. Note: the value must not be changed. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#define HGSMI_NUMBER_OF_CHANNELS 0x100
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
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
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Information about a handler: pfn + context. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef struct _HGSMICHANNELHANDLER
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PFNHGSMICHANNELHANDLER pfnHandler;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvHandler;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync} HGSMICHANNELHANDLER;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Channel description. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef struct _HGSMICHANNEL
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
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 uint8_t u8Flags; /* HGSMI_CH_F_* */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync} HGSMICHANNEL;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef struct _HGSMICHANNELINFO
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMICHANNEL Channels[HGSMI_NUMBER_OF_CHANNELS]; /* Channel handlers indexed by the channel id.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The array is accessed under the instance lock.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync} HGSMICHANNELINFO;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#pragma pack()
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync
dd1de51db071be42f2acdf532c49c851b78b0812vboxsyncRT_C_DECLS_BEGIN
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMISIZE) HGSMIBufferMinimumSize (void)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return sizeof (HGSMIBUFFERHEADER) + sizeof (HGSMIBUFFERTAIL);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(uint8_t *) HGSMIBufferData (const HGSMIBUFFERHEADER *pHeader)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (uint8_t *)pHeader + sizeof (HGSMIBUFFERHEADER);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIBUFFERTAIL *) HGSMIBufferTail (const HGSMIBUFFERHEADER *pHeader)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (HGSMIBUFFERTAIL *)(HGSMIBufferData (pHeader) + pHeader->u32DataSize);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIBUFFERHEADER *) HGSMIBufferHeaderFromData (const void *pvData)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (HGSMIBUFFERHEADER *)((uint8_t *)pvData - sizeof (HGSMIBUFFERHEADER));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMISIZE) HGSMIBufferRequiredSize (uint32_t u32DataSize)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return HGSMIBufferMinimumSize () + u32DataSize;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIPointerToOffset(const HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const void *pv)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return pArea->offBase + (HGSMIOFFSET)((uint8_t *)pv - pArea->pu8Base);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsyncDECLINLINE(void *) HGSMIOffsetToPointer(const HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIOFFSET offBuffer)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync return pArea->pu8Base + (offBuffer - pArea->offBase);
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync}
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsyncDECLINLINE(uint8_t *) HGSMIBufferDataFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer)
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync{
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer(pArea, offBuffer);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Assert(pHeader);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if(pHeader)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return HGSMIBufferData(pHeader);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return NULL;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncDECLINLINE(uint8_t *) HGSMIBufferDataAndChInfoFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer, uint16_t * pChInfo)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer (pArea, offBuffer);
304f31a2a37f5d690086bff2fb4a59228b4dbd40vboxsync Assert(pHeader);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if(pHeader)
304f31a2a37f5d690086bff2fb4a59228b4dbd40vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *pChInfo = pHeader->u16ChannelInfo;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return HGSMIBufferData(pHeader);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return NULL;
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncHGSMICHANNEL *HGSMIChannelFindById (HGSMICHANNELINFO * pChannelInfo, uint8_t u8Channel);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncuint32_t HGSMIChecksum (HGSMIOFFSET offBuffer,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const HGSMIBUFFERHEADER *pHeader,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const HGSMIBUFFERTAIL *pTail);
dbabcd810984fc0731edff08eb281f0907dc867avboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIAreaInitialize (HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvBase,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMISIZE cbArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIOFFSET offBase);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvoid HGSMIAreaClear (HGSMIAREA *pArea);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(bool) HGSMIAreaContainsOffset(const HGSMIAREA *pArea, HGSMIOFFSET off)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return off >= pArea->offBase && off - pArea->offBase < pArea->cbArea;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(bool) HGSMIAreaContainsPointer(const HGSMIAREA *pArea, const void *pv)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (uintptr_t)pv >= (uintptr_t)pArea->pu8Base && (uintptr_t)pv - (uintptr_t)pArea->pu8Base < pArea->cbArea;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncHGSMIOFFSET HGSMIBufferInitializeSingle (const HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIBUFFERHEADER *pHeader,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMISIZE cbBuffer,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t u8Channel,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint16_t u16ChannelInfo);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIHeapSetup (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint32_t u32HeapType,
bf721ef38b15c00c9bbfcedb11dbc61f8bd71816vboxsync void *pvBase,
061168b301e15895799842f766644c211b8701c9vboxsync HGSMISIZE cbArea,
bf721ef38b15c00c9bbfcedb11dbc61f8bd71816vboxsync HGSMIOFFSET offBase,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const HGSMIENV *pEnv);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIHeapRelocate (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint32_t u32HeapType,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvBase,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync uint32_t offHeapHandle,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync uintptr_t offDelta,
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync HGSMISIZE cbArea,
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync HGSMIOFFSET offBase);
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncint HGSMIHeapRestoreMA(HGSMIHEAP *pHeap,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync void *pvBase,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync HGSMISIZE cbArea,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync HGSMIOFFSET offBase,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync uint32_t cBlocks,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIOFFSET *paDescriptors,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMISIZE cbMaxBlock,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIENV *pEnv);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsyncvoid HGSMIHeapSetupUninitialized (HGSMIHEAP *pHeap);
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsyncvoid HGSMIHeapDestroy (HGSMIHEAP *pHeap);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvoid* HGSMIHeapBufferAlloc (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMISIZE cbBuffer);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvoid HGSMIHeapBufferFree(HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvBuf);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvoid *HGSMIHeapAlloc (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMISIZE cbData,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t u8Channel,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint16_t u16ChannelInfo);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncHGSMIOFFSET HGSMIHeapBufferOffset (HGSMIHEAP *pHeap,
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync void *pvData);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvoid HGSMIHeapFree (HGSMIHEAP *pHeap,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvData);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIHeapOffset(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return pHeap->area.offBase;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#ifdef IN_RING3
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Needed for heap relocation: offset of the heap handle relative to the start of heap area. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMIOFFSET) HGSMIHeapHandleLocationOffset(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIOFFSET offHeapHandle;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hPtr - (uintptr_t)pHeap->area.pu8Base);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hOff - (uintptr_t)pHeap->area.pu8Base);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync else
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync offHeapHandle = HGSMIOFFSET_VOID;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return offHeapHandle;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync#endif /* IN_RING3 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncDECLINLINE(HGSMISIZE) HGSMIHeapSize(HGSMIHEAP *pHeap)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return pHeap->area.cbArea;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIChannelRegister (HGSMICHANNELINFO * pChannelInfo,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t u8Channel,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const char *pszName,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PFNHGSMICHANNELHANDLER pfnChannelHandler,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void *pvChannelHandler,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMICHANNELHANDLER *pOldHandler);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncint HGSMIBufferProcess (HGSMIAREA *pArea,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMICHANNELINFO * pChannelInfo,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HGSMIOFFSET offBuffer);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncRT_C_DECLS_END
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#endif /* !___VBox_HGSMI_HGSMI_h */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
2c38b10f3657b32c27c489ef9aede24003a64fa5vboxsync