3 * Copyright (c) 2009, Microsoft Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16 * Place - Suite 330, Boston, MA 02111-1307 USA.
19 * Haiyang Zhang <haiyangz@microsoft.com>
20 * Hank Janssen <hjanssen@microsoft.com>
27 #include "VmbusPacketFormat.h"
30 typedef UINT32 NTSTATUS
;
38 typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
40 ChannelMessageInvalid
= 0,
41 ChannelMessageOfferChannel
= 1,
42 ChannelMessageRescindChannelOffer
= 2,
43 ChannelMessageRequestOffers
= 3,
44 ChannelMessageAllOffersDelivered
= 4,
45 ChannelMessageOpenChannel
= 5,
46 ChannelMessageOpenChannelResult
= 6,
47 ChannelMessageCloseChannel
= 7,
48 ChannelMessageGpadlHeader
= 8,
49 ChannelMessageGpadlBody
= 9,
50 ChannelMessageGpadlCreated
= 10,
51 ChannelMessageGpadlTeardown
= 11,
52 ChannelMessageGpadlTorndown
= 12,
53 ChannelMessageRelIdReleased
= 13,
54 ChannelMessageInitiateContact
= 14,
55 ChannelMessageVersionResponse
= 15,
56 ChannelMessageUnload
= 16,
57 #ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
58 ChannelMessageViewRangeAdd
= 17,
59 ChannelMessageViewRangeRemove
= 18,
62 } VMBUS_CHANNEL_MESSAGE_TYPE
, *PVMBUS_CHANNEL_MESSAGE_TYPE
;
65 // CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE));
68 typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
70 VMBUS_CHANNEL_MESSAGE_TYPE MessageType
;
72 } VMBUS_CHANNEL_MESSAGE_HEADER
, *PVMBUS_CHANNEL_MESSAGE_HEADER
;
74 // Query VMBus Version parameters
75 typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION
77 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
79 } VMBUS_CHANNEL_QUERY_VMBUS_VERSION
, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION
;
81 // VMBus Version Supported parameters
82 typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED
84 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
85 BOOLEAN VersionSupported
;
86 } VMBUS_CHANNEL_VERSION_SUPPORTED
, *PVMBUS_CHANNEL_VERSION_SUPPORTED
;
88 // Offer Channel parameters
89 typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
91 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
92 VMBUS_CHANNEL_OFFER Offer
;
95 BOOLEAN MonitorAllocated
;
96 } VMBUS_CHANNEL_OFFER_CHANNEL
, *PVMBUS_CHANNEL_OFFER_CHANNEL
;
99 // Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message.
101 C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL
) <= MAXIMUM_SYNIC_MESSAGE_BYTES
);
103 // Rescind Offer parameters
104 typedef struct _VMBUS_CHANNEL_RESCIND_OFFER
106 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
108 } VMBUS_CHANNEL_RESCIND_OFFER
, *PVMBUS_CHANNEL_RESCIND_OFFER
;
110 // Request Offer -- no parameters, SynIC message contains the partition ID
111 // Set Snoop -- no parameters, SynIC message contains the partition ID
112 // Clear Snoop -- no parameters, SynIC message contains the partition ID
113 // All Offers Delivered -- no parameters, SynIC message contains the partition ID
114 // Flush Client -- no parameters, SynIC message contains the partition ID
116 // Open Channel parameters
117 typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL
119 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
122 // Identifies the specific VMBus channel that is being opened.
127 // ID making a particular open request at a channel offer unique.
132 // GPADL for the channel's ring buffer.
134 GPADL_HANDLE RingBufferGpadlHandle
;
137 // GPADL for the channel's server context save area.
139 GPADL_HANDLE ServerContextAreaGpadlHandle
;
142 // The upstream ring buffer begins at offset zero in the memory described
143 // by RingBufferGpadlHandle. The downstream ring buffer follows it at this
144 // offset (in pages).
146 UINT32 DownstreamRingBufferPageOffset
;
149 // User-specific data to be passed along to the server endpoint.
151 UCHAR UserData
[MAX_USER_DEFINED_BYTES
];
153 } VMBUS_CHANNEL_OPEN_CHANNEL
, *PVMBUS_CHANNEL_OPEN_CHANNEL
;
155 // Reopen Channel parameters;
156 typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL
, *PVMBUS_CHANNEL_REOPEN_CHANNEL
;
158 // Open Channel Result parameters
159 typedef struct _VMBUS_CHANNEL_OPEN_RESULT
161 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
165 } VMBUS_CHANNEL_OPEN_RESULT
, *PVMBUS_CHANNEL_OPEN_RESULT
;
167 // Close channel parameters;
168 typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL
170 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
172 } VMBUS_CHANNEL_CLOSE_CHANNEL
, *PVMBUS_CHANNEL_CLOSE_CHANNEL
;
174 // Channel Message GPADL
175 #define GPADL_TYPE_RING_BUFFER 1
176 #define GPADL_TYPE_SERVER_SAVE_AREA 2
177 #define GPADL_TYPE_TRANSACTION 8
180 // The number of PFNs in a GPADL message is defined by the number of pages
181 // that would be spanned by ByteCount and ByteOffset. If the implied number
182 // of PFNs won't fit in this packet, there will be a follow-up packet that
186 typedef struct _VMBUS_CHANNEL_GPADL_HEADER
188 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
194 } VMBUS_CHANNEL_GPADL_HEADER
, *PVMBUS_CHANNEL_GPADL_HEADER
;
198 // This is the followup packet that contains more PFNs.
201 typedef struct _VMBUS_CHANNEL_GPADL_BODY
203 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
204 UINT32 MessageNumber
;
207 } VMBUS_CHANNEL_GPADL_BODY
, *PVMBUS_CHANNEL_GPADL_BODY
;
210 typedef struct _VMBUS_CHANNEL_GPADL_CREATED
212 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
215 UINT32 CreationStatus
;
216 } VMBUS_CHANNEL_GPADL_CREATED
, *PVMBUS_CHANNEL_GPADL_CREATED
;
218 typedef struct _VMBUS_CHANNEL_GPADL_TEARDOWN
220 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
223 } VMBUS_CHANNEL_GPADL_TEARDOWN
, *PVMBUS_CHANNEL_GPADL_TEARDOWN
;
225 typedef struct _VMBUS_CHANNEL_GPADL_TORNDOWN
227 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
229 } VMBUS_CHANNEL_GPADL_TORNDOWN
, *PVMBUS_CHANNEL_GPADL_TORNDOWN
;
231 #ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
232 typedef struct _VMBUS_CHANNEL_VIEW_RANGE_ADD
234 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
235 PHYSICAL_ADDRESS ViewRangeBase
;
236 UINT64 ViewRangeLength
;
238 } VMBUS_CHANNEL_VIEW_RANGE_ADD
, *PVMBUS_CHANNEL_VIEW_RANGE_ADD
;
240 typedef struct _VMBUS_CHANNEL_VIEW_RANGE_REMOVE
242 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
243 PHYSICAL_ADDRESS ViewRangeBase
;
245 } VMBUS_CHANNEL_VIEW_RANGE_REMOVE
, *PVMBUS_CHANNEL_VIEW_RANGE_REMOVE
;
248 typedef struct _VMBUS_CHANNEL_RELID_RELEASED
250 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
252 } VMBUS_CHANNEL_RELID_RELEASED
, *PVMBUS_CHANNEL_RELID_RELEASED
;
254 typedef struct _VMBUS_CHANNEL_INITIATE_CONTACT
256 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
257 UINT32 VMBusVersionRequested
;
259 UINT64 InterruptPage
;
262 } VMBUS_CHANNEL_INITIATE_CONTACT
, *PVMBUS_CHANNEL_INITIATE_CONTACT
;
264 typedef struct _VMBUS_CHANNEL_VERSION_RESPONSE
266 VMBUS_CHANNEL_MESSAGE_HEADER Header
;
267 BOOLEAN VersionSupported
;
268 } VMBUS_CHANNEL_VERSION_RESPONSE
, *PVMBUS_CHANNEL_VERSION_RESPONSE
;
270 typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD
, *PVMBUS_CHANNEL_UNLOAD
;
273 // Kind of a table to use the preprocessor to get us the right type for a
274 // specified message ID. Used with ChAllocateSendMessage()
276 #define ChannelMessageQueryVmbusVersion_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
277 #define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED
278 #define ChannelMessageOfferChannel_TYPE VMBUS_CHANNEL_OFFER_CHANNEL
279 #define ChannelMessageRescindChannelOffer_TYPE VMBUS_CHANNEL_RESCIND_OFFER
280 #define ChannelMessageRequestOffers_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
281 #define ChannelMessageAllOffersDelivered_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
282 #define ChannelMessageOpenChannel_TYPE VMBUS_CHANNEL_OPEN_CHANNEL
283 #define ChannelMessageOpenChannelResult_TYPE VMBUS_CHANNEL_OPEN_RESULT
284 #define ChannelMessageCloseChannel_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
285 #define ChannelMessageAllGpadlsUnmapped_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
286 #define ChannelMessageGpadlHeader_TYPE VMBUS_CHANNEL_GPADL_HEADER
287 #define ChannelMessageGpadlBody_TYPE VMBUS_CHANNEL_GPADL_BODY
288 #define ChannelMessageGpadlCreated_TYPE VMBUS_CHANNEL_GPADL_CREATED
289 #define ChannelMessageGpadlTeardown_TYPE VMBUS_CHANNEL_GPADL_TEARDOWN
290 #define ChannelMessageGpadlTorndown_TYPE VMBUS_CHANNEL_GPADL_TORNDOWN
291 #define ChannelMessageViewRangeAdd_TYPE VMBUS_CHANNEL_VIEW_RANGE_ADD
292 #define ChannelMessageViewRangeRemove_TYPE VMBUS_CHANNEL_VIEW_RANGE_REMOVE
293 #define ChannelMessageRelIdReleased_TYPE VMBUS_CHANNEL_RELID_RELEASED
294 #define ChannelMessageInitiateContact_TYPE VMBUS_CHANNEL_INITIATE_CONTACT
295 #define ChannelMessageVersionResponse_TYPE VMBUS_CHANNEL_VERSION_RESPONSE
296 #define ChannelMessageUnload_TYPE VMBUS_CHANNEL_UNLOAD
299 // Preprocessor wrapper to ChAllocateSendMessageSize() converting the return
300 // value to the correct pointer and calculate the needed size.
304 // Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to
307 #define ChAllocateSendMessage(Id, Fn, Context) \
308 (Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context)