blob: f9f6b4bf6fb1c03b0e587bcf91e017adb817282a [file] [log] [blame]
/*
*
* Copyright (c) 2009, Microsoft Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307 USA.
*
* Authors:
* Haiyang Zhang <haiyangz@microsoft.com>
* Hank Janssen <hjanssen@microsoft.com>
*
*/
#ifndef _VMBUSPACKETFORMAT_H_
#define _VMBUSPACKETFORMAT_H_
struct vmpacket_descriptor {
u16 Type;
u16 DataOffset8;
u16 Length8;
u16 Flags;
u64 TransactionId;
} __attribute__((packed));
struct vmpacket_header {
u32 PreviousPacketStartOffset;
struct vmpacket_descriptor Descriptor;
} __attribute__((packed));
struct vmtransfer_page_range {
u32 ByteCount;
u32 ByteOffset;
} __attribute__((packed));
struct vmtransfer_page_packet_header {
struct vmpacket_descriptor d;
u16 TransferPageSetId;
bool SenderOwnsSet;
u8 Reserved;
u32 RangeCount;
struct vmtransfer_page_range Ranges[1];
} __attribute__((packed));
struct vmgpadl_packet_header {
struct vmpacket_descriptor d;
u32 Gpadl;
u32 Reserved;
} __attribute__((packed));
struct vmadd_remove_transfer_page_set {
struct vmpacket_descriptor d;
u32 Gpadl;
u16 TransferPageSetId;
u16 Reserved;
} __attribute__((packed));
/*
* This structure defines a range in guest physical space that can be made to
* look virtually contiguous.
*/
struct gpa_range {
u32 ByteCount;
u32 ByteOffset;
u64 PfnArray[0];
};
/*
* This is the format for an Establish Gpadl packet, which contains a handle by
* which this GPADL will be known and a set of GPA ranges associated with it.
* This can be converted to a MDL by the guest OS. If there are multiple GPA
* ranges, then the resulting MDL will be "chained," representing multiple VA
* ranges.
*/
struct vmestablish_gpadl {
struct vmpacket_descriptor d;
u32 Gpadl;
u32 RangeCount;
struct gpa_range Range[1];
} __attribute__((packed));
/*
* This is the format for a Teardown Gpadl packet, which indicates that the
* GPADL handle in the Establish Gpadl packet will never be referenced again.
*/
struct vmteardown_gpadl {
struct vmpacket_descriptor d;
u32 Gpadl;
u32 Reserved; /* for alignment to a 8-byte boundary */
} __attribute__((packed));
/*
* This is the format for a GPA-Direct packet, which contains a set of GPA
* ranges, in addition to commands and/or data.
*/
struct vmdata_gpa_direct {
struct vmpacket_descriptor d;
u32 Reserved;
u32 RangeCount;
struct gpa_range Range[1];
} __attribute__((packed));
/* This is the format for a Additional Data Packet. */
struct vmadditional_data {
struct vmpacket_descriptor d;
u64 TotalBytes;
u32 ByteOffset;
u32 ByteCount;
unsigned char Data[1];
} __attribute__((packed));
union vmpacket_largest_possible_header {
struct vmpacket_descriptor SimpleHeader;
struct vmtransfer_page_packet_header TransferPageHeader;
struct vmgpadl_packet_header GpadlHeader;
struct vmadd_remove_transfer_page_set AddRemoveTransferPageHeader;
struct vmestablish_gpadl EstablishGpadlHeader;
struct vmteardown_gpadl TeardownGpadlHeader;
struct vmdata_gpa_direct DataGpaDirectHeader;
};
#define VMPACKET_DATA_START_ADDRESS(__packet) \
(void *)(((unsigned char *)__packet) + \
((struct vmpacket_descriptor)__packet)->DataOffset8 * 8)
#define VMPACKET_DATA_LENGTH(__packet) \
((((struct vmpacket_descriptor)__packet)->Length8 - \
((struct vmpacket_descriptor)__packet)->DataOffset8) * 8)
#define VMPACKET_TRANSFER_MODE(__packet) \
(((struct IMPACT)__packet)->Type)
enum vmbus_packet_type {
VmbusPacketTypeInvalid = 0x0,
VmbusPacketTypeSynch = 0x1,
VmbusPacketTypeAddTransferPageSet = 0x2,
VmbusPacketTypeRemoveTransferPageSet = 0x3,
VmbusPacketTypeEstablishGpadl = 0x4,
VmbusPacketTypeTearDownGpadl = 0x5,
VmbusPacketTypeDataInBand = 0x6,
VmbusPacketTypeDataUsingTransferPages = 0x7,
VmbusPacketTypeDataUsingGpadl = 0x8,
VmbusPacketTypeDataUsingGpaDirect = 0x9,
VmbusPacketTypeCancelRequest = 0xa,
VmbusPacketTypeCompletion = 0xb,
VmbusPacketTypeDataUsingAdditionalPackets = 0xc,
VmbusPacketTypeAdditionalData = 0xd
};
#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
#endif