/* * QEMU Hyper-V VMBus support * * Copyright (c) 2017-2018 Virtuozzo International GmbH. * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. */ #ifndef HW_HYPERV_VMBUS_PROTO_H #define HW_HYPERV_VMBUS_PROTO_H #define VMBUS_VERSION_WS2008 ((0 << 16) | (13)) #define VMBUS_VERSION_WIN7 ((1 << 16) | (1)) #define VMBUS_VERSION_WIN8 ((2 << 16) | (4)) #define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0)) #define VMBUS_VERSION_WIN10 ((4 << 16) | (0)) #define VMBUS_VERSION_INVAL -1 #define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10 #define VMBUS_MESSAGE_CONNECTION_ID 1 #define VMBUS_EVENT_CONNECTION_ID 2 #define VMBUS_MONITOR_CONNECTION_ID 3 #define VMBUS_SINT 2 #define VMBUS_MSG_INVALID 0 #define VMBUS_MSG_OFFERCHANNEL 1 #define VMBUS_MSG_RESCIND_CHANNELOFFER 2 #define VMBUS_MSG_REQUESTOFFERS 3 #define VMBUS_MSG_ALLOFFERS_DELIVERED 4 #define VMBUS_MSG_OPENCHANNEL 5 #define VMBUS_MSG_OPENCHANNEL_RESULT 6 #define VMBUS_MSG_CLOSECHANNEL 7 #define VMBUS_MSG_GPADL_HEADER 8 #define VMBUS_MSG_GPADL_BODY 9 #define VMBUS_MSG_GPADL_CREATED 10 #define VMBUS_MSG_GPADL_TEARDOWN 11 #define VMBUS_MSG_GPADL_TORNDOWN 12 #define VMBUS_MSG_RELID_RELEASED 13 #define VMBUS_MSG_INITIATE_CONTACT 14 #define VMBUS_MSG_VERSION_RESPONSE 15 #define VMBUS_MSG_UNLOAD 16 #define VMBUS_MSG_UNLOAD_RESPONSE 17 #define VMBUS_MSG_COUNT 18 #define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t) #define VMBUS_PACKET_INVALID 0x0 #define VMBUS_PACKET_SYNCH 0x1 #define VMBUS_PACKET_ADD_XFER_PAGESET 0x2 #define VMBUS_PACKET_RM_XFER_PAGESET 0x3 #define VMBUS_PACKET_ESTABLISH_GPADL 0x4 #define VMBUS_PACKET_TEARDOWN_GPADL 0x5 #define VMBUS_PACKET_DATA_INBAND 0x6 #define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7 #define VMBUS_PACKET_DATA_USING_GPADL 0x8 #define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9 #define VMBUS_PACKET_CANCEL_REQUEST 0xa #define VMBUS_PACKET_COMP 0xb #define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc #define VMBUS_PACKET_ADDITIONAL_DATA 0xd #define VMBUS_CHANNEL_USER_DATA_SIZE 120 #define VMBUS_OFFER_MONITOR_ALLOCATED 0x1 #define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1 #define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0) #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1 #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2 #define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4 #define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10 #define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100 #define VMBUS_CHANNEL_PARENT_OFFER 0x200 #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400 #define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000 #define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1 typedef struct vmbus_message_header { uint32_t message_type; uint32_t _padding; } vmbus_message_header; typedef struct vmbus_message_initiate_contact { vmbus_message_header header; uint32_t version_requested; uint32_t target_vcpu; uint64_t interrupt_page; uint64_t monitor_page1; uint64_t monitor_page2; } vmbus_message_initiate_contact; typedef struct vmbus_message_version_response { vmbus_message_header header; uint8_t version_supported; uint8_t status; } vmbus_message_version_response; typedef struct vmbus_message_offer_channel { vmbus_message_header header; uint8_t type_uuid[16]; uint8_t instance_uuid[16]; uint64_t _reserved1; uint64_t _reserved2; uint16_t channel_flags; uint16_t mmio_size_mb; uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; uint16_t sub_channel_index; uint16_t _reserved3; uint32_t child_relid; uint8_t monitor_id; uint8_t monitor_flags; uint16_t interrupt_flags; uint32_t connection_id; } vmbus_message_offer_channel; typedef struct vmbus_message_rescind_channel_offer { vmbus_message_header header; uint32_t child_relid; } vmbus_message_rescind_channel_offer; typedef struct vmbus_gpa_range { uint32_t byte_count; uint32_t byte_offset; uint64_t pfn_array[]; } vmbus_gpa_range; typedef struct vmbus_message_gpadl_header { vmbus_message_header header; uint32_t child_relid; uint32_t gpadl_id; uint16_t range_buflen; uint16_t rangecount; vmbus_gpa_range range[]; } QEMU_PACKED vmbus_message_gpadl_header; typedef struct vmbus_message_gpadl_body { vmbus_message_header header; uint32_t message_number; uint32_t gpadl_id; uint64_t pfn_array[]; } vmbus_message_gpadl_body; typedef struct vmbus_message_gpadl_created { vmbus_message_header header; uint32_t child_relid; uint32_t gpadl_id; uint32_t status; } vmbus_message_gpadl_created; typedef struct vmbus_message_gpadl_teardown { vmbus_message_header header; uint32_t child_relid; uint32_t gpadl_id; } vmbus_message_gpadl_teardown; typedef struct vmbus_message_gpadl_torndown { vmbus_message_header header; uint32_t gpadl_id; } vmbus_message_gpadl_torndown; typedef struct vmbus_message_open_channel { vmbus_message_header header; uint32_t child_relid; uint32_t open_id; uint32_t ring_buffer_gpadl_id; uint32_t target_vp; uint32_t ring_buffer_offset; uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; } vmbus_message_open_channel; typedef struct vmbus_message_open_result { vmbus_message_header header; uint32_t child_relid; uint32_t open_id; uint32_t status; } vmbus_message_open_result; typedef struct vmbus_message_close_channel { vmbus_message_header header; uint32_t child_relid; } vmbus_message_close_channel; typedef struct vmbus_ring_buffer { uint32_t write_index; uint32_t read_index; uint32_t interrupt_mask; uint32_t pending_send_sz; uint32_t _reserved1[12]; uint32_t feature_bits; } vmbus_ring_buffer; typedef struct vmbus_packet_hdr { uint16_t type; uint16_t offset_qwords; uint16_t len_qwords; uint16_t flags; uint64_t transaction_id; } vmbus_packet_hdr; typedef struct vmbus_pkt_gpa_direct { uint32_t _reserved; uint32_t rangecount; vmbus_gpa_range range[]; } vmbus_pkt_gpa_direct; typedef struct vmbus_xferpg_range { uint32_t byte_count; uint32_t byte_offset; } vmbus_xferpg_range; typedef struct vmbus_pkt_xferpg { uint16_t buffer_id; uint8_t sender_owns_set; uint8_t _reserved; uint32_t rangecount; vmbus_xferpg_range range[]; } vmbus_pkt_xferpg; #endif