/* * * 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 * Hank Janssen * */ #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