vmbus-proto.h (6996B)
1/* 2 * QEMU Hyper-V VMBus support 3 * 4 * Copyright (c) 2017-2018 Virtuozzo International GmbH. 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or later. 7 * See the COPYING file in the top-level directory. 8 */ 9 10#ifndef HW_HYPERV_VMBUS_PROTO_H 11#define HW_HYPERV_VMBUS_PROTO_H 12 13#define VMBUS_VERSION_WS2008 ((0 << 16) | (13)) 14#define VMBUS_VERSION_WIN7 ((1 << 16) | (1)) 15#define VMBUS_VERSION_WIN8 ((2 << 16) | (4)) 16#define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0)) 17#define VMBUS_VERSION_WIN10 ((4 << 16) | (0)) 18#define VMBUS_VERSION_INVAL -1 19#define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10 20 21#define VMBUS_MESSAGE_CONNECTION_ID 1 22#define VMBUS_EVENT_CONNECTION_ID 2 23#define VMBUS_MONITOR_CONNECTION_ID 3 24#define VMBUS_SINT 2 25 26#define VMBUS_MSG_INVALID 0 27#define VMBUS_MSG_OFFERCHANNEL 1 28#define VMBUS_MSG_RESCIND_CHANNELOFFER 2 29#define VMBUS_MSG_REQUESTOFFERS 3 30#define VMBUS_MSG_ALLOFFERS_DELIVERED 4 31#define VMBUS_MSG_OPENCHANNEL 5 32#define VMBUS_MSG_OPENCHANNEL_RESULT 6 33#define VMBUS_MSG_CLOSECHANNEL 7 34#define VMBUS_MSG_GPADL_HEADER 8 35#define VMBUS_MSG_GPADL_BODY 9 36#define VMBUS_MSG_GPADL_CREATED 10 37#define VMBUS_MSG_GPADL_TEARDOWN 11 38#define VMBUS_MSG_GPADL_TORNDOWN 12 39#define VMBUS_MSG_RELID_RELEASED 13 40#define VMBUS_MSG_INITIATE_CONTACT 14 41#define VMBUS_MSG_VERSION_RESPONSE 15 42#define VMBUS_MSG_UNLOAD 16 43#define VMBUS_MSG_UNLOAD_RESPONSE 17 44#define VMBUS_MSG_COUNT 18 45 46#define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t) 47 48#define VMBUS_PACKET_INVALID 0x0 49#define VMBUS_PACKET_SYNCH 0x1 50#define VMBUS_PACKET_ADD_XFER_PAGESET 0x2 51#define VMBUS_PACKET_RM_XFER_PAGESET 0x3 52#define VMBUS_PACKET_ESTABLISH_GPADL 0x4 53#define VMBUS_PACKET_TEARDOWN_GPADL 0x5 54#define VMBUS_PACKET_DATA_INBAND 0x6 55#define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7 56#define VMBUS_PACKET_DATA_USING_GPADL 0x8 57#define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9 58#define VMBUS_PACKET_CANCEL_REQUEST 0xa 59#define VMBUS_PACKET_COMP 0xb 60#define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc 61#define VMBUS_PACKET_ADDITIONAL_DATA 0xd 62 63#define VMBUS_CHANNEL_USER_DATA_SIZE 120 64 65#define VMBUS_OFFER_MONITOR_ALLOCATED 0x1 66#define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1 67 68#define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0) 69 70#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1 71#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2 72#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4 73#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10 74#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100 75#define VMBUS_CHANNEL_PARENT_OFFER 0x200 76#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400 77#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000 78 79#define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1 80 81typedef struct vmbus_message_header { 82 uint32_t message_type; 83 uint32_t _padding; 84} vmbus_message_header; 85 86typedef struct vmbus_message_initiate_contact { 87 vmbus_message_header header; 88 uint32_t version_requested; 89 uint32_t target_vcpu; 90 uint64_t interrupt_page; 91 uint64_t monitor_page1; 92 uint64_t monitor_page2; 93} vmbus_message_initiate_contact; 94 95typedef struct vmbus_message_version_response { 96 vmbus_message_header header; 97 uint8_t version_supported; 98 uint8_t status; 99} vmbus_message_version_response; 100 101typedef struct vmbus_message_offer_channel { 102 vmbus_message_header header; 103 uint8_t type_uuid[16]; 104 uint8_t instance_uuid[16]; 105 uint64_t _reserved1; 106 uint64_t _reserved2; 107 uint16_t channel_flags; 108 uint16_t mmio_size_mb; 109 uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; 110 uint16_t sub_channel_index; 111 uint16_t _reserved3; 112 uint32_t child_relid; 113 uint8_t monitor_id; 114 uint8_t monitor_flags; 115 uint16_t interrupt_flags; 116 uint32_t connection_id; 117} vmbus_message_offer_channel; 118 119typedef struct vmbus_message_rescind_channel_offer { 120 vmbus_message_header header; 121 uint32_t child_relid; 122} vmbus_message_rescind_channel_offer; 123 124typedef struct vmbus_gpa_range { 125 uint32_t byte_count; 126 uint32_t byte_offset; 127 uint64_t pfn_array[]; 128} vmbus_gpa_range; 129 130typedef struct vmbus_message_gpadl_header { 131 vmbus_message_header header; 132 uint32_t child_relid; 133 uint32_t gpadl_id; 134 uint16_t range_buflen; 135 uint16_t rangecount; 136 vmbus_gpa_range range[]; 137} QEMU_PACKED vmbus_message_gpadl_header; 138 139typedef struct vmbus_message_gpadl_body { 140 vmbus_message_header header; 141 uint32_t message_number; 142 uint32_t gpadl_id; 143 uint64_t pfn_array[]; 144} vmbus_message_gpadl_body; 145 146typedef struct vmbus_message_gpadl_created { 147 vmbus_message_header header; 148 uint32_t child_relid; 149 uint32_t gpadl_id; 150 uint32_t status; 151} vmbus_message_gpadl_created; 152 153typedef struct vmbus_message_gpadl_teardown { 154 vmbus_message_header header; 155 uint32_t child_relid; 156 uint32_t gpadl_id; 157} vmbus_message_gpadl_teardown; 158 159typedef struct vmbus_message_gpadl_torndown { 160 vmbus_message_header header; 161 uint32_t gpadl_id; 162} vmbus_message_gpadl_torndown; 163 164typedef struct vmbus_message_open_channel { 165 vmbus_message_header header; 166 uint32_t child_relid; 167 uint32_t open_id; 168 uint32_t ring_buffer_gpadl_id; 169 uint32_t target_vp; 170 uint32_t ring_buffer_offset; 171 uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; 172} vmbus_message_open_channel; 173 174typedef struct vmbus_message_open_result { 175 vmbus_message_header header; 176 uint32_t child_relid; 177 uint32_t open_id; 178 uint32_t status; 179} vmbus_message_open_result; 180 181typedef struct vmbus_message_close_channel { 182 vmbus_message_header header; 183 uint32_t child_relid; 184} vmbus_message_close_channel; 185 186typedef struct vmbus_ring_buffer { 187 uint32_t write_index; 188 uint32_t read_index; 189 uint32_t interrupt_mask; 190 uint32_t pending_send_sz; 191 uint32_t _reserved1[12]; 192 uint32_t feature_bits; 193} vmbus_ring_buffer; 194 195typedef struct vmbus_packet_hdr { 196 uint16_t type; 197 uint16_t offset_qwords; 198 uint16_t len_qwords; 199 uint16_t flags; 200 uint64_t transaction_id; 201} vmbus_packet_hdr; 202 203typedef struct vmbus_pkt_gpa_direct { 204 uint32_t _reserved; 205 uint32_t rangecount; 206 vmbus_gpa_range range[]; 207} vmbus_pkt_gpa_direct; 208 209typedef struct vmbus_xferpg_range { 210 uint32_t byte_count; 211 uint32_t byte_offset; 212} vmbus_xferpg_range; 213 214typedef struct vmbus_pkt_xferpg { 215 uint16_t buffer_id; 216 uint8_t sender_owns_set; 217 uint8_t _reserved; 218 uint32_t rangecount; 219 vmbus_xferpg_range range[]; 220} vmbus_pkt_xferpg; 221 222#endif